From 8927952c4765a3f49d151d0f657f600b10409573 Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Tue, 19 Mar 2019 18:21:14 -0500 Subject: [PATCH 01/15] Crude removal of server components --- Dockerfile | 13 - locales/ach/server.ftl | 236 --- locales/af/server.ftl | 40 - locales/an/server.ftl | 40 - locales/ar/server.ftl | 415 ----- locales/as/server.ftl | 40 - locales/ast/server.ftl | 170 -- locales/az/server.ftl | 397 ----- locales/be/server.ftl | 396 ----- locales/bg/server.ftl | 397 ----- locales/bn-BD/server.ftl | 363 ----- locales/bn-IN/server.ftl | 40 - locales/br/server.ftl | 411 ----- locales/bs/server.ftl | 355 ----- locales/ca/server.ftl | 388 ----- locales/cak/server.ftl | 350 ----- locales/crh/server.ftl | 52 - locales/cs/server.ftl | 403 ----- locales/cy/server.ftl | 421 ----- locales/da/server.ftl | 393 ----- locales/de/server.ftl | 397 ----- locales/dsb/server.ftl | 409 ----- locales/el/server.ftl | 394 ----- locales/en-CA/server.ftl | 397 ----- locales/en-GB/server.ftl | 397 ----- locales/en-US/server.ftl | 390 ----- locales/en-ZA/server.ftl | 40 - locales/eo/server.ftl | 387 ----- locales/es-AR/server.ftl | 397 ----- locales/es-CL/server.ftl | 396 ----- locales/es-ES/server.ftl | 397 ----- locales/es-MX/server.ftl | 387 ----- locales/et/server.ftl | 382 ----- locales/eu/server.ftl | 85 - locales/fa/server.ftl | 397 ----- locales/ff/server.ftl | 232 --- locales/fi/server.ftl | 386 ----- locales/fr/server.ftl | 397 ----- locales/fy-NL/server.ftl | 397 ----- locales/ga-IE/server.ftl | 40 - locales/gd/server.ftl | 405 ----- locales/gl/server.ftl | 257 ---- locales/gn/server.ftl | 397 ----- locales/gu-IN/server.ftl | 397 ----- locales/he/server.ftl | 383 ----- locales/hi-IN/server.ftl | 387 ----- locales/hr/server.ftl | 403 ----- locales/hsb/server.ftl | 409 ----- locales/hu/server.ftl | 397 ----- locales/hy-AM/server.ftl | 40 - locales/ia/server.ftl | 396 ----- locales/id/server.ftl | 365 ----- locales/is/server.ftl | 40 - locales/it/server.ftl | 397 ----- locales/ja/server.ftl | 371 ----- locales/ka/server.ftl | 393 ----- locales/kab/server.ftl | 384 ----- locales/kk/server.ftl | 391 ----- locales/km/server.ftl | 119 -- locales/kn/server.ftl | 176 --- locales/ko/server.ftl | 294 ---- locales/lij/server.ftl | 92 -- locales/lo/server.ftl | 130 -- locales/lt/server.ftl | 403 ----- locales/ltg/server.ftl | 74 - locales/lv/server.ftl | 109 -- locales/mai/server.ftl | 320 ---- locales/mk/server.ftl | 345 ----- locales/ml/server.ftl | 173 --- locales/mn/server.ftl | 224 --- locales/mr/server.ftl | 356 ----- locales/ms/server.ftl | 387 ----- locales/my/server.ftl | 391 ----- locales/nb-NO/server.ftl | 385 ----- locales/ne-NP/server.ftl | 80 - locales/nl/server.ftl | 397 ----- locales/nn-NO/server.ftl | 397 ----- locales/or/server.ftl | 40 - locales/pa-IN/server.ftl | 303 ---- locales/pl/server.ftl | 403 ----- locales/pt-BR/server.ftl | 397 ----- locales/pt-PT/server.ftl | 401 ----- locales/rm/server.ftl | 397 ----- locales/ro/server.ftl | 403 ----- locales/ru/server.ftl | 403 ----- locales/si/server.ftl | 76 - locales/sk/server.ftl | 403 ----- locales/sl/server.ftl | 409 ----- locales/son/server.ftl | 40 - locales/sq/server.ftl | 396 ----- locales/sr/server.ftl | 384 ----- locales/su/server.ftl | 392 ----- locales/sv-SE/server.ftl | 397 ----- locales/ta/server.ftl | 208 --- locales/te/server.ftl | 321 ---- locales/th/server.ftl | 353 ----- locales/tl/server.ftl | 141 -- locales/tr/server.ftl | 373 ----- locales/uk/server.ftl | 403 ----- locales/ur/server.ftl | 250 --- locales/uz/server.ftl | 383 ----- locales/vi/server.ftl | 379 ----- locales/wo/server.ftl | 40 - locales/xh/server.ftl | 40 - locales/zh-CN/server.ftl | 379 ----- locales/zh-TW/server.ftl | 373 ----- package.json | 58 +- server/db-patches/patch-0-1.sql | 41 - server/db-patches/patch-1-0.sql | 6 - server/db-patches/patch-1-2.sql | 10 - server/db-patches/patch-10-11.sql | 4 - server/db-patches/patch-10-9.sql | 1 - server/db-patches/patch-11-10.sql | 1 - server/db-patches/patch-11-12.sql | 1 - server/db-patches/patch-12-11.sql | 6 - server/db-patches/patch-12-13.sql | 1 - server/db-patches/patch-13-12.sql | 1 - server/db-patches/patch-13-14.sql | 2 - server/db-patches/patch-14-13.sql | 2 - server/db-patches/patch-14-15.sql | 1 - server/db-patches/patch-15-14.sql | 1 - server/db-patches/patch-15-16.sql | 2 - server/db-patches/patch-16-15.sql | 2 - server/db-patches/patch-16-17.sql | 5 - server/db-patches/patch-17-16.sql | 5 - server/db-patches/patch-17-18.sql | 1 - server/db-patches/patch-18-17.sql | 1 - server/db-patches/patch-18-19.sql | 1 - server/db-patches/patch-19-18.sql | 1 - server/db-patches/patch-19-20.sql | 1 - server/db-patches/patch-2-1.sql | 4 - server/db-patches/patch-2-3.sql | 10 - server/db-patches/patch-20-19.sql | 1 - server/db-patches/patch-20-21.sql | 1 - server/db-patches/patch-21-20.sql | 1 - server/db-patches/patch-21-22.sql | 2 - server/db-patches/patch-22-23.sql | 9 - server/db-patches/patch-23-22.sql | 4 - server/db-patches/patch-23-24.sql | 12 - server/db-patches/patch-24-23.sql | 1 - server/db-patches/patch-24-25.sql | 3 - server/db-patches/patch-25-24.sql | 3 - server/db-patches/patch-25-26.sql | 5 - server/db-patches/patch-26-25.sql | 1 - server/db-patches/patch-26-27.sql | 1 - server/db-patches/patch-27-26.sql | 1 - server/db-patches/patch-27-28.sql | 1 - server/db-patches/patch-28-27.sql | 4 - server/db-patches/patch-3-2.sql | 3 - server/db-patches/patch-3-4.sql | 3 - server/db-patches/patch-4-3.sql | 3 - server/db-patches/patch-4-5.sql | 11 - server/db-patches/patch-5-4.sql | 6 - server/db-patches/patch-5-6.sql | 1 - server/db-patches/patch-6-5.sql | 1 - server/db-patches/patch-6-7.sql | 2 - server/db-patches/patch-7-6.sql | 2 - server/db-patches/patch-7-8.sql | 3 - server/db-patches/patch-8-7.sql | 3 - server/db-patches/patch-8-9.sql | 11 - server/db-patches/patch-9-10.sql | 2 - server/db-patches/patch-9-8.sql | 3 - server/schema.sql | 107 -- server/src/ab-tests.js | 250 --- server/src/ad-banner.js | 80 - server/src/b64.js | 10 - server/src/browser-send-event.js | 24 - server/src/caching.js | 34 - server/src/config.js | 434 ------ server/src/db.js | 194 --- server/src/dbschema.js | 205 --- server/src/delete-shot-button.js | 111 -- server/src/errors.js | 78 - server/src/events.js | 28 - server/src/footer-view.js | 44 - server/src/fxa-onboarding-dialog.js | 62 - server/src/ga-activation.js | 178 --- server/src/header.js | 35 - server/src/helpers.js | 13 - server/src/jobs.js | 40 - server/src/l10n.js | 111 -- server/src/lib/shot-utils.js | 42 - server/src/linker.js | 42 - server/src/locale-messages.js | 53 - server/src/logging.js | 45 - server/src/middleware/csrf.js | 96 -- server/src/middleware/l10n.js | 29 - server/src/oembed-view.js | 24 - server/src/pages/creating/controller.js | 16 - server/src/pages/creating/model.js | 11 - server/src/pages/creating/page.js | 6 - server/src/pages/creating/server.js | 11 - server/src/pages/creating/view.js | 42 - server/src/pages/export/footer.js | 11 - server/src/pages/export/model.js | 32 - server/src/pages/export/page.js | 7 - server/src/pages/export/server.js | 36 - server/src/pages/export/view.js | 262 ---- server/src/pages/homepage/controller.js | 64 - server/src/pages/homepage/homepage-header.js | 54 - server/src/pages/homepage/model.js | 23 - server/src/pages/homepage/page.js | 6 - server/src/pages/homepage/server.js | 15 - server/src/pages/homepage/view.js | 210 --- server/src/pages/hosting-shutdown/model.js | 5 - server/src/pages/hosting-shutdown/page.js | 8 - server/src/pages/hosting-shutdown/server.js | 6 - server/src/pages/hosting-shutdown/view.js | 60 - .../src/pages/leave-screenshots/controller.js | 28 - server/src/pages/leave-screenshots/model.js | 7 - server/src/pages/leave-screenshots/page.js | 7 - server/src/pages/leave-screenshots/server.js | 32 - server/src/pages/leave-screenshots/view.js | 99 -- server/src/pages/metrics/model.js | 147 -- server/src/pages/metrics/page.js | 7 - server/src/pages/metrics/server.js | 48 - server/src/pages/metrics/view.js | 114 -- server/src/pages/not-found/model.js | 5 - server/src/pages/not-found/page.js | 8 - server/src/pages/not-found/server.js | 7 - server/src/pages/not-found/view.js | 59 - server/src/pages/settings/controller.js | 34 - server/src/pages/settings/model.js | 25 - server/src/pages/settings/page.js | 6 - server/src/pages/settings/server.js | 20 - server/src/pages/settings/view.js | 131 -- server/src/pages/shot/color-picker.js | 130 -- server/src/pages/shot/controller.js | 269 ---- server/src/pages/shot/crop-tool.js | 361 ----- server/src/pages/shot/drawing-tool.js | 152 -- server/src/pages/shot/editor-history.js | 118 -- server/src/pages/shot/editor.js | 444 ------ server/src/pages/shot/footer.js | 29 - server/src/pages/shot/highlighter-tool.js | 99 -- server/src/pages/shot/model.js | 89 -- server/src/pages/shot/page.js | 6 - server/src/pages/shot/pen-tool.js | 42 - server/src/pages/shot/promo-dialog.js | 40 - server/src/pages/shot/server.js | 27 - server/src/pages/shot/shotpage-header.js | 215 --- server/src/pages/shot/text-tool.js | 341 ----- server/src/pages/shot/time-diff.js | 76 - server/src/pages/shot/view.js | 601 -------- server/src/pages/shotindex/controller.js | 261 ---- server/src/pages/shotindex/footer.js | 11 - server/src/pages/shotindex/model.js | 50 - server/src/pages/shotindex/myshots-header.js | 29 - server/src/pages/shotindex/page.js | 6 - server/src/pages/shotindex/server.js | 38 - server/src/pages/shotindex/view.js | 509 ------ server/src/promotion-strategy.js | 86 -- server/src/proxy-url.js | 23 - server/src/ravenclient.js | 73 - server/src/reactrender.js | 99 -- server/src/reactruntime.js | 197 --- server/src/reactutils.js | 15 - server/src/responses.js | 33 - server/src/server.js | 1363 ----------------- server/src/servershot.js | 1077 ------------- server/src/share-buttons.js | 227 --- server/src/signin-button.js | 73 - server/src/statsd.js | 16 - server/src/users.js | 273 ---- server/src/watchdog.js | 337 ---- server/views-docs.md | 159 -- test/server/clientlib.py | 258 ---- test/server/pglib.py | 67 - test/server/test_account_auth.py | 175 --- test/server/test_auth.py | 199 --- test/server/test_clip_image_url_validation.py | 71 - test/server/test_csrf.py | 370 ----- test/server/test_file_management.py | 242 --- test/server/test_image_validation.py | 100 -- test/server/test_responses.py | 134 -- test/server/test_shot_put_auth.py | 51 - test/server/test_signatures.py | 51 - test/server/unit/l10n-test.js | 61 - test/server/unit/middleware/l10n-test.js | 21 - test/server/unit/pages/homepage/model-test.js | 41 - test/test-ab-test.js | 108 -- 280 files changed, 4 insertions(+), 46225 deletions(-) delete mode 100644 Dockerfile delete mode 100644 locales/ach/server.ftl delete mode 100644 locales/af/server.ftl delete mode 100644 locales/an/server.ftl delete mode 100644 locales/ar/server.ftl delete mode 100644 locales/as/server.ftl delete mode 100644 locales/ast/server.ftl delete mode 100644 locales/az/server.ftl delete mode 100644 locales/be/server.ftl delete mode 100644 locales/bg/server.ftl delete mode 100644 locales/bn-BD/server.ftl delete mode 100644 locales/bn-IN/server.ftl delete mode 100644 locales/br/server.ftl delete mode 100644 locales/bs/server.ftl delete mode 100644 locales/ca/server.ftl delete mode 100644 locales/cak/server.ftl delete mode 100644 locales/crh/server.ftl delete mode 100644 locales/cs/server.ftl delete mode 100644 locales/cy/server.ftl delete mode 100644 locales/da/server.ftl delete mode 100644 locales/de/server.ftl delete mode 100644 locales/dsb/server.ftl delete mode 100644 locales/el/server.ftl delete mode 100644 locales/en-CA/server.ftl delete mode 100644 locales/en-GB/server.ftl delete mode 100644 locales/en-US/server.ftl delete mode 100644 locales/en-ZA/server.ftl delete mode 100644 locales/eo/server.ftl delete mode 100644 locales/es-AR/server.ftl delete mode 100644 locales/es-CL/server.ftl delete mode 100644 locales/es-ES/server.ftl delete mode 100644 locales/es-MX/server.ftl delete mode 100644 locales/et/server.ftl delete mode 100644 locales/eu/server.ftl delete mode 100644 locales/fa/server.ftl delete mode 100644 locales/ff/server.ftl delete mode 100644 locales/fi/server.ftl delete mode 100644 locales/fr/server.ftl delete mode 100644 locales/fy-NL/server.ftl delete mode 100644 locales/ga-IE/server.ftl delete mode 100644 locales/gd/server.ftl delete mode 100644 locales/gl/server.ftl delete mode 100644 locales/gn/server.ftl delete mode 100644 locales/gu-IN/server.ftl delete mode 100644 locales/he/server.ftl delete mode 100644 locales/hi-IN/server.ftl delete mode 100644 locales/hr/server.ftl delete mode 100644 locales/hsb/server.ftl delete mode 100644 locales/hu/server.ftl delete mode 100644 locales/hy-AM/server.ftl delete mode 100644 locales/ia/server.ftl delete mode 100644 locales/id/server.ftl delete mode 100644 locales/is/server.ftl delete mode 100644 locales/it/server.ftl delete mode 100644 locales/ja/server.ftl delete mode 100644 locales/ka/server.ftl delete mode 100644 locales/kab/server.ftl delete mode 100644 locales/kk/server.ftl delete mode 100644 locales/km/server.ftl delete mode 100644 locales/kn/server.ftl delete mode 100644 locales/ko/server.ftl delete mode 100644 locales/lij/server.ftl delete mode 100644 locales/lo/server.ftl delete mode 100644 locales/lt/server.ftl delete mode 100644 locales/ltg/server.ftl delete mode 100644 locales/lv/server.ftl delete mode 100644 locales/mai/server.ftl delete mode 100644 locales/mk/server.ftl delete mode 100644 locales/ml/server.ftl delete mode 100644 locales/mn/server.ftl delete mode 100644 locales/mr/server.ftl delete mode 100644 locales/ms/server.ftl delete mode 100644 locales/my/server.ftl delete mode 100644 locales/nb-NO/server.ftl delete mode 100644 locales/ne-NP/server.ftl delete mode 100644 locales/nl/server.ftl delete mode 100644 locales/nn-NO/server.ftl delete mode 100644 locales/or/server.ftl delete mode 100644 locales/pa-IN/server.ftl delete mode 100644 locales/pl/server.ftl delete mode 100644 locales/pt-BR/server.ftl delete mode 100644 locales/pt-PT/server.ftl delete mode 100644 locales/rm/server.ftl delete mode 100644 locales/ro/server.ftl delete mode 100644 locales/ru/server.ftl delete mode 100644 locales/si/server.ftl delete mode 100644 locales/sk/server.ftl delete mode 100644 locales/sl/server.ftl delete mode 100644 locales/son/server.ftl delete mode 100644 locales/sq/server.ftl delete mode 100644 locales/sr/server.ftl delete mode 100644 locales/su/server.ftl delete mode 100644 locales/sv-SE/server.ftl delete mode 100644 locales/ta/server.ftl delete mode 100644 locales/te/server.ftl delete mode 100644 locales/th/server.ftl delete mode 100644 locales/tl/server.ftl delete mode 100644 locales/tr/server.ftl delete mode 100644 locales/uk/server.ftl delete mode 100644 locales/ur/server.ftl delete mode 100644 locales/uz/server.ftl delete mode 100644 locales/vi/server.ftl delete mode 100644 locales/wo/server.ftl delete mode 100644 locales/xh/server.ftl delete mode 100644 locales/zh-CN/server.ftl delete mode 100644 locales/zh-TW/server.ftl delete mode 100644 server/db-patches/patch-0-1.sql delete mode 100644 server/db-patches/patch-1-0.sql delete mode 100644 server/db-patches/patch-1-2.sql delete mode 100644 server/db-patches/patch-10-11.sql delete mode 100644 server/db-patches/patch-10-9.sql delete mode 100644 server/db-patches/patch-11-10.sql delete mode 100644 server/db-patches/patch-11-12.sql delete mode 100644 server/db-patches/patch-12-11.sql delete mode 100644 server/db-patches/patch-12-13.sql delete mode 100644 server/db-patches/patch-13-12.sql delete mode 100644 server/db-patches/patch-13-14.sql delete mode 100644 server/db-patches/patch-14-13.sql delete mode 100644 server/db-patches/patch-14-15.sql delete mode 100644 server/db-patches/patch-15-14.sql delete mode 100644 server/db-patches/patch-15-16.sql delete mode 100644 server/db-patches/patch-16-15.sql delete mode 100644 server/db-patches/patch-16-17.sql delete mode 100644 server/db-patches/patch-17-16.sql delete mode 100644 server/db-patches/patch-17-18.sql delete mode 100644 server/db-patches/patch-18-17.sql delete mode 100644 server/db-patches/patch-18-19.sql delete mode 100644 server/db-patches/patch-19-18.sql delete mode 100644 server/db-patches/patch-19-20.sql delete mode 100644 server/db-patches/patch-2-1.sql delete mode 100644 server/db-patches/patch-2-3.sql delete mode 100644 server/db-patches/patch-20-19.sql delete mode 100644 server/db-patches/patch-20-21.sql delete mode 100644 server/db-patches/patch-21-20.sql delete mode 100644 server/db-patches/patch-21-22.sql delete mode 100644 server/db-patches/patch-22-23.sql delete mode 100644 server/db-patches/patch-23-22.sql delete mode 100644 server/db-patches/patch-23-24.sql delete mode 100644 server/db-patches/patch-24-23.sql delete mode 100644 server/db-patches/patch-24-25.sql delete mode 100644 server/db-patches/patch-25-24.sql delete mode 100644 server/db-patches/patch-25-26.sql delete mode 100644 server/db-patches/patch-26-25.sql delete mode 100644 server/db-patches/patch-26-27.sql delete mode 100644 server/db-patches/patch-27-26.sql delete mode 100644 server/db-patches/patch-27-28.sql delete mode 100644 server/db-patches/patch-28-27.sql delete mode 100644 server/db-patches/patch-3-2.sql delete mode 100644 server/db-patches/patch-3-4.sql delete mode 100644 server/db-patches/patch-4-3.sql delete mode 100644 server/db-patches/patch-4-5.sql delete mode 100644 server/db-patches/patch-5-4.sql delete mode 100644 server/db-patches/patch-5-6.sql delete mode 100644 server/db-patches/patch-6-5.sql delete mode 100644 server/db-patches/patch-6-7.sql delete mode 100644 server/db-patches/patch-7-6.sql delete mode 100644 server/db-patches/patch-7-8.sql delete mode 100644 server/db-patches/patch-8-7.sql delete mode 100644 server/db-patches/patch-8-9.sql delete mode 100644 server/db-patches/patch-9-10.sql delete mode 100644 server/db-patches/patch-9-8.sql delete mode 100644 server/schema.sql delete mode 100644 server/src/ab-tests.js delete mode 100644 server/src/ad-banner.js delete mode 100644 server/src/b64.js delete mode 100644 server/src/browser-send-event.js delete mode 100644 server/src/caching.js delete mode 100644 server/src/config.js delete mode 100644 server/src/db.js delete mode 100644 server/src/dbschema.js delete mode 100644 server/src/delete-shot-button.js delete mode 100644 server/src/errors.js delete mode 100644 server/src/events.js delete mode 100644 server/src/footer-view.js delete mode 100644 server/src/fxa-onboarding-dialog.js delete mode 100644 server/src/ga-activation.js delete mode 100644 server/src/header.js delete mode 100644 server/src/helpers.js delete mode 100644 server/src/jobs.js delete mode 100644 server/src/l10n.js delete mode 100644 server/src/lib/shot-utils.js delete mode 100644 server/src/linker.js delete mode 100644 server/src/locale-messages.js delete mode 100644 server/src/logging.js delete mode 100644 server/src/middleware/csrf.js delete mode 100644 server/src/middleware/l10n.js delete mode 100644 server/src/oembed-view.js delete mode 100644 server/src/pages/creating/controller.js delete mode 100644 server/src/pages/creating/model.js delete mode 100644 server/src/pages/creating/page.js delete mode 100644 server/src/pages/creating/server.js delete mode 100644 server/src/pages/creating/view.js delete mode 100644 server/src/pages/export/footer.js delete mode 100644 server/src/pages/export/model.js delete mode 100644 server/src/pages/export/page.js delete mode 100644 server/src/pages/export/server.js delete mode 100644 server/src/pages/export/view.js delete mode 100644 server/src/pages/homepage/controller.js delete mode 100644 server/src/pages/homepage/homepage-header.js delete mode 100644 server/src/pages/homepage/model.js delete mode 100644 server/src/pages/homepage/page.js delete mode 100644 server/src/pages/homepage/server.js delete mode 100644 server/src/pages/homepage/view.js delete mode 100644 server/src/pages/hosting-shutdown/model.js delete mode 100644 server/src/pages/hosting-shutdown/page.js delete mode 100644 server/src/pages/hosting-shutdown/server.js delete mode 100644 server/src/pages/hosting-shutdown/view.js delete mode 100644 server/src/pages/leave-screenshots/controller.js delete mode 100644 server/src/pages/leave-screenshots/model.js delete mode 100644 server/src/pages/leave-screenshots/page.js delete mode 100644 server/src/pages/leave-screenshots/server.js delete mode 100644 server/src/pages/leave-screenshots/view.js delete mode 100644 server/src/pages/metrics/model.js delete mode 100644 server/src/pages/metrics/page.js delete mode 100644 server/src/pages/metrics/server.js delete mode 100644 server/src/pages/metrics/view.js delete mode 100644 server/src/pages/not-found/model.js delete mode 100644 server/src/pages/not-found/page.js delete mode 100644 server/src/pages/not-found/server.js delete mode 100644 server/src/pages/not-found/view.js delete mode 100644 server/src/pages/settings/controller.js delete mode 100644 server/src/pages/settings/model.js delete mode 100644 server/src/pages/settings/page.js delete mode 100644 server/src/pages/settings/server.js delete mode 100644 server/src/pages/settings/view.js delete mode 100644 server/src/pages/shot/color-picker.js delete mode 100644 server/src/pages/shot/controller.js delete mode 100644 server/src/pages/shot/crop-tool.js delete mode 100644 server/src/pages/shot/drawing-tool.js delete mode 100644 server/src/pages/shot/editor-history.js delete mode 100644 server/src/pages/shot/editor.js delete mode 100644 server/src/pages/shot/footer.js delete mode 100644 server/src/pages/shot/highlighter-tool.js delete mode 100644 server/src/pages/shot/model.js delete mode 100644 server/src/pages/shot/page.js delete mode 100644 server/src/pages/shot/pen-tool.js delete mode 100644 server/src/pages/shot/promo-dialog.js delete mode 100644 server/src/pages/shot/server.js delete mode 100644 server/src/pages/shot/shotpage-header.js delete mode 100644 server/src/pages/shot/text-tool.js delete mode 100644 server/src/pages/shot/time-diff.js delete mode 100644 server/src/pages/shot/view.js delete mode 100644 server/src/pages/shotindex/controller.js delete mode 100644 server/src/pages/shotindex/footer.js delete mode 100644 server/src/pages/shotindex/model.js delete mode 100644 server/src/pages/shotindex/myshots-header.js delete mode 100644 server/src/pages/shotindex/page.js delete mode 100644 server/src/pages/shotindex/server.js delete mode 100644 server/src/pages/shotindex/view.js delete mode 100644 server/src/promotion-strategy.js delete mode 100644 server/src/proxy-url.js delete mode 100644 server/src/ravenclient.js delete mode 100644 server/src/reactrender.js delete mode 100644 server/src/reactruntime.js delete mode 100644 server/src/reactutils.js delete mode 100644 server/src/responses.js delete mode 100644 server/src/server.js delete mode 100644 server/src/servershot.js delete mode 100644 server/src/share-buttons.js delete mode 100644 server/src/signin-button.js delete mode 100644 server/src/statsd.js delete mode 100644 server/src/users.js delete mode 100644 server/src/watchdog.js delete mode 100755 server/views-docs.md delete mode 100644 test/server/clientlib.py delete mode 100644 test/server/pglib.py delete mode 100644 test/server/test_account_auth.py delete mode 100644 test/server/test_auth.py delete mode 100644 test/server/test_clip_image_url_validation.py delete mode 100644 test/server/test_csrf.py delete mode 100644 test/server/test_file_management.py delete mode 100644 test/server/test_image_validation.py delete mode 100644 test/server/test_responses.py delete mode 100644 test/server/test_shot_put_auth.py delete mode 100644 test/server/test_signatures.py delete mode 100644 test/server/unit/l10n-test.js delete mode 100644 test/server/unit/middleware/l10n-test.js delete mode 100644 test/server/unit/pages/homepage/model-test.js delete mode 100644 test/test-ab-test.js diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 952c7e61e5..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM node:8.12.0@sha256:06c7033a274aab131b07e7b8da8d1f823ee752a6e1e2bd46c0b459921ab2c39a - -COPY package.json /app/ -COPY build/server /app/build/server -COPY build/static /app/build/static -COPY build/shared /app/build/shared -COPY node_modules /app/node_modules -COPY bin/_run-docker /app/bin/ -COPY build/screenshots.xpi /app/build/xpi/screenshots.xpi -RUN cd app && npm install -ENV NODE_ENV ${NODE_ENV:-production} - -CMD /app/bin/_run-docker diff --git a/locales/ach/server.ftl b/locales/ach/server.ftl deleted file mode 100644 index 0d5101640d..0000000000 --- a/locales/ach/server.ftl +++ /dev/null @@ -1,236 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gHomeLink = Gang - -## Header - -buttonSettings = - .title = Ter -buttonSignIn = - .title = Dony iyie -onboardingPromoSigninButton = Dony Iyie - .title = Dony Iyie - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Cik -footerLinkPrivacy = Ngec me mung -footerLinkFaqs = Lapeny ma pol kare -footerLinkDiscourse = Mi Adwogi -footerLinkRemoveAllData = Kwany data weng - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Cweyo { $title } -creatingPageTitleDefault = potbuk - -## Home page - -homePageTeaser = Cok Bino -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Gam me nono -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Kit ma Firefox Screenshots Tiyo Kede -homePageGetStartedTitle = Caki -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Yer cal me Screenshots ki i jami ayera me potbuk ma i lanyut me kanonge, ka jami ayera me Screenshots bi nyute iwi dirica me layeny mamegi. -homePageCaptureRegion = Mak bute -homePageCapturePage = mak potbuk -homePageSaveShare = Gwokki ki Nywaki -homePageLegalLink = Cik -homePagePrivacyLink = Mung -homePageTermsLink = Cik -homePageCookiesLink = Angija - -## Leave Screenshots page - -leavePageRemoveAllData = Kwany Data weng -leavePageErrorGeneric = Bal otime -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Man bi jwayo data ni weng me Firefox Screenshots matwal. -leavePageButtonProceed = Mede -leavePageButtonCancel = Kwer - -## Not Found page - -notFoundPageTitle = Potbuk pe ononge -notFoundPageIntro = Oops. -notFoundPageDescription = Potbuk pe ononge. - -## Shot page - -shotPageAlertErrorUpdatingTitle = Bal i gwoko wiye -shotPageShareButton = - .title = Poki -shotPageCopied = Kiloko -shotPageShareFacebook = - .title = Poki i Facebook -shotPageShareTwitter = - .title = Poki i Twitter -shotPageSharePinterest = - .title = poki i pinterest -shotPageShareEmail = - .title = Nywak kakube i email -shotPageCopyImageText = - .label = Lok coc me cal -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = dwoki naka wa { $date } -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Man aye potbuk ma ki cweyo ki iye wiya atii: -shotPageDownloadShot = - .title = Gam -shotPageEditButton = - .title = Yub cal man -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Tim ber i cwal email bot { $dmca } me penyo pi ngec mapol. -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Yer cawa -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Matwal ∞ -shotPageKeepTenMinutes = Tekika 10 -shotPageKeepOneHour = Cawa 1 -shotPageKeepOneDay = Nino 1 -shotPageKeepOneWeek = Cabit 1 -shotPageKeepTwoWeeks = Cabit 2 -shotPageKeepOneMonth = Dwe 1 -shotPageSaveExpiration = gwoki -shotPageCancelExpiration = kwer -shotPageDoesNotExpire = pe bale -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = kare ne okato -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = kare ne okato -timeDiffJustNow = Pud kombedi -timeDiffMinutesAgo = - { $number -> - [one] tekika 1 mukato angec - *[other] tekika { $number } mukato angec - } -timeDiffHoursAgo = - { $number -> - [one] Cawa 1 mukato angec - *[other] cawa { $number } mukato angec - } -timeDiffDaysAgo = - { $number -> - [one] Lawo - *[other] nino { $number } mukato angec - } -timeDiffFutureSeconds = i secon manok -timeDiffFutureMinutes = - { $number -> - [one] i tekika 1 - *[other] i tekika { $number } - } -timeDiffFutureHours = - { $number -> - [one] i cawa 1 - *[other] i cawa { $number } - } -timeDiffFutureDays = - { $number -> - [one] diki - *[other] i nino { $number } - } - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Niang maber! -promoLink = Tem gi -promoCloseButton = - .title = Lor ngec - -## Annotations - -annotationUndoButton = - .title = Gony -annotationRedoButton = - .title = Nwo timo -annotationTextButton = - .title = Med coc -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Jwa -annotationCropButton = - .title = Ngol -annotationSaveEditButton = Gwoki - .title = Gwok ma iyubo -annotationCancelEditButton = Juki - .title = Juk yubo -annotationCropConfirmButton = Moki - .title = Mok yer -annotationCropCancelButton = Juki - .title = Juk yer -# Values shown in text size selection dropdown -textSizeSmall = Matidi -textSizeMedium = Ladyere -textSizeLarge = Madit -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Moki - .title = Moki -textToolCancelButton = Juki - .title = Juki - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Gin mo otime marac - -## Settings Page - -settingsDisconnectButton = Wek kube - .title = Wek kube -settingsGuestAccountMessage = Akaunt pa welo -settingsSignInButton = Dony iyie - .title = Dony iyie - -## Shotindex page - -shotIndexPageNoShotsInvitation = Mede, cwe mogo. -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Pe watwero nongo cal ma rwate ki yeny mamegi. -shotIndexPageClearSearchButton = - .title = Jwa yeny -shotIndexPagePreviousPage = - .title = potbuk mukato -shotIndexPageNextPage = - .title = potbuk malubu - -## Delete Confirmation Dialog - -shotDeleteCancel = Juki - .title = Juki -shotDeleteConfirm = Kwany - .title = Kwany - -## Metrics page -## All metrics strings are optional for translation - -metricsPageTotalsQueryTitle = Wel -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Wiye-wiye me Screenshots -metricsPageTotalsQueryDevices = Wel nyonyo ma kicoyo -metricsPageTotalsQueryExpiredShots = Kare ne okato (ento pud romo nonge) -metricsPageTotalsQueryExpiredDeletedShots = Kare ne okato (ki bene kikwanyo woko) -metricsPageShotsQueryDay = Diceng -metricsPageUsersQueryTitle = Lutic kudiceng -metricsPageUsersQueryCount = Wel Lutic -metricsPageUsersQueryDay = Diceng -metricsPageUserShotsQueryCount = Wel lutic -metricsPageRetentionQueryUsers = Wel lutic -metricsPageTotalRetentionQueryUsers = Wel lutic -metricsPageVersionQueryLastSeen = Nino diff --git a/locales/af/server.ftl b/locales/af/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/af/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/an/server.ftl b/locales/an/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/an/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/ar/server.ftl b/locales/ar/server.ftl deleted file mode 100644 index 6a779ed6cc..0000000000 --- a/locales/ar/server.ftl +++ /dev/null @@ -1,415 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = لقطاتي -gHomeLink = البداية -gNoShots = - .alt = لم يُعثر على لقطات -gScreenshotsDescriptionServerless = لقطات الشاشة باتت أسهل. خذ لقطات الشاشة دون مغادرة فَيَرفُكس. - -## Header - -buttonSettings = - .title = الإعدادات -buttonSignIn = - .title = لِج -screenshotsLogo = - .title = صفحة اللقطات الرئيسية -bannerSignIn = لِج إلى حسابك أو سجّل واحدا للوصول إلى لقطاتك عبر مختلف الأجهزة وحفظ ما تحبّ منها للأبد. -bannerUpsell = { gScreenshotsDescription } نزّل فَيَرفُكس الآن -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = ما الجديد في لقطات فَيَرفُكس؟ -onboardingPromoMessage = يمكنك الآن الولوج إلى اللقطات بحساب فَيَرفُكس وإجراء ما هو أكثر وأكثر: -onboardingPromoMessageListItem1 = الوصول إلى المكتبة لديك عبر مختلف الأجهزة -onboardingPromoMessageListItem2 = تخزين اللقطات المحببة لديك للأبد -onboardingPromoDismissButton = أهمِل - .title = أهمِل -onboardingPromoSigninButton = لِج - .title = لِج - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = موزيلا -footerLinkTerms = الشروط -footerLinkPrivacy = تنويه الخصوصية -footerReportShot = أبلِغ عن اللقطة - .title = أبلِغ عن أن هذه اللقطة فيها إساءة أو سخام أو مشاكل أخرى -footerLinkFaqs = الأسئلة الشائعة -footerLinkDMCA = أبلغ عن انتهاك للملكية الفكرية -footerLinkDiscourse = أخبرنا بانطباعك -footerLinkRemoveAllData = أزِل كل البيانات - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = يُنشئ { $title } -creatingPageTitleDefault = صفحة -creatingPageWaitMessage = يحفظ لقطتك… - -## Home page - -homePageDescription = - .content = لقطات مباشِرة داخل المتصفح نفسه. خُذ لقطات الشاشة واحفظها وشاركها وأنت تتصفح الوِب مستخدما فَيرفُكس. -homePageButtonMyShots = اذهب إلى لقطاتي -homePageTeaser = قريبًا… -homePageDownloadFirefoxTitle = فَيرفُكس -homePageDownloadFirefoxSubTitle = تنزيل مجاني -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = كيف تعمل لقطات فَيرفُكس -homePageGetStartedTitle = ابدأ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = انقر أيقونة اللقطات من قائمة إجراءات الصفحة في شريط العنوان وستظهر قائمة اللقطات أعلى نافذة المتصفح. -homePageCaptureRegion = التقط منطقة -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = انقر واسحب لتحديد المنطقة التي تريد التقاطها. أو حتى مجرد التحويم و النقر؛ ستحدد لقطات الشاشة المنطقة نيابة عنك. أيعجبك ما ترى؟ اختر احفظ للوصول لقطتك للشاشة على الإنترنت، أو زِر السهم لأسفل لتنزيلها إلى حاسوبك. -homePageCapturePage = التقط صفحة -homePageCapturePageDescription = استخدم الأزرار أعلى اليسار لالتقاط صفحات كاملة. زر ”التقط الجزء المرئي“ سيلتقط المنطقة التي تراها دون تمرير الصفحة، وزر ”احفظ الصفحة كاملة“ سيلتقط كل شيء في الصفحة. -homePageDownloadCopy = نزّل أو انسخ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = خُذ أفضل اللقطات. تتيح لك لقطات الشاشة بتنزيل ما حدّدت أو نسخه مباشرة إلى الحافظة. -homePageLegalLink = قانونيّات -homePagePrivacyLink = الخصوصية -homePageTermsLink = الشروط -homePageCookiesLink = الكعكات - -## Leave Screenshots page - -leavePageRemoveAllData = أزِل كل البيانات -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = عليك تثبيت لقطات فَيَرفُكس أو الولوج إلى حساب فَيَرفُكس لحذف حسابك -leavePageErrorGeneric = حدث خطأ ما -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = سيمحي هذا كل بيانات «لقطات فَيَرفُكس» إلى الأبد. -leavePageButtonProceed = تابِع -leavePageButtonCancel = ألغِ -leavePageDeleted = مُسحت كل اللقطات لديك. - -## Not Found page - -notFoundPageTitle = لم يُعثر على الصفحة -notFoundPageIntro = آخ. -notFoundPageDescription = لم يُعثر على الصفحة. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = اللقطة: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = خطأ أثناء حفظ انتهاء الصلاحية -shotPageAlertErrorDeletingShot = خطأ أثناء حذف اللقطة -shotPageAlertErrorUpdatingTitle = خطأ أثناء حفظ العنوان -shotPageConfirmDelete = أمتأكد أنك تريد حذف هذه اللقطة إلى الأبد؟ -shotPageShareButton = - .title = شارِك -shotPageCopyButton = - .title = انسخ اللقطة إلى الحافظة -shotPageCopyActionLabel = انسخ -shotPageCopied = نُسخت -shotPageShareFacebook = - .title = شارِك على فيسبوك -shotPageShareTwitter = - .title = شارِك على تويتر -shotPageSharePinterest = - .title = شارك على بنترست -shotPageShareEmail = - .title = شارك الرابط عبر البريد الإلكتروني -shotPageShareLink = احصل على رابط لهذا اللقطة يمكن مشاركته: -shotPagePrivacyMessage = أي شخص لديه الرابط يمكنه رؤية اللقطة. -shotPageCopyImageText = - .label = انسخ نص الصورة -shotPageConfirmDeletion = أمتأكد أنك تريد حذف هذه اللقطة إلى الأبد؟ -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = إن تركت اللقطة وشأنها فستُحذف دون رجعة . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = استعدها حتى { $date } -shotPageExpiredMessage = انتهت صلاحية هذه اللقطة. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = ها هي الصفحة التي أخذت اللقطة منها: -shotPageDeleteButton = - .title = احذف هذه اللقطة -shotPageDownloadShot = - .title = نزّل -shotPageEditButton = - .title = حرّر هذه الصورة -shotPagefavoriteButton = - .title = أضِف اللقطة إلى المفضلة -shotPageBackToHomeButton = - .title = صفحة البداية -shotPageAllShotsButton = - .title = كل اللقطات -shotPageScreenshotsDescriptionServerless = لقطات الشاشة باتت أسهل. خذ لقطات الشاشة و نزّلها دون مغادرة فَيَرفُكس. -shotPageDMCAMessage = لم تعد هذه اللقطة متاحة نظرًا لادعاء الملكية الفكرية لطرف آخر. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = رجاء أرسل بريدا إلكترونيا إلى { $dmca } لطلب المزيد من المعلومات. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = إذا خضعت لقطاتك لادعاءات متعددة، فقد نلغي وصولك إلى لقطات فَيرفُكس. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = رجاء إدراج مسار هذه اللقطة في بريدك: { $url } -shotPageKeepFor = إلى متى يتعين إبقاء هذه اللقطة؟ -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = اختر وقتًا -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = إلى الأبد ∞ -shotPageKeepTenMinutes = ١٠ دقائق -shotPageKeepOneHour = ساعة واحدة -shotPageKeepOneDay = يوم واحد -shotPageKeepOneWeek = أسبوع واحد -shotPageKeepTwoWeeks = أسبوعان -shotPageKeepOneMonth = شهر واحد -shotPageSaveExpiration = احفظ -shotPageCancelExpiration = ألغِ -shotPageDoesNotExpire = لا تنتهي صلاحيتها -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = تنتهي -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = انتهت -timeDiffJustNow = للتو -timeDiffMinutesAgo = - { $number -> - [zero] منذ أقل من دقيقة - [one] منذ دقيقة - [two] منذ دقيقتين - [few] منذ { $number } دقائق - [many] منذ { $number } دقيقة - *[other] منذ { $number } دقيقة - } -timeDiffHoursAgo = - { $number -> - [zero] منذ أقل من ساعة - [one] منذ ساعة - [two] منذ ساعتين - [few] منذ { $number } ساعات - [many] منذ { $number } ساعة - *[other] منذ { $number } ساعة - } -timeDiffDaysAgo = - { $number -> - [one] بالأمس - [two] قبل أمس - [few] منذ { $number } أيام - [many] منذ { $number } يومًا - *[other] منذ { $number } يوم - } -timeDiffFutureSeconds = بعد بضع ثوان -timeDiffFutureMinutes = - { $number -> - [zero] بعد بضع ثوان - [one] بعد دقيقة - [two] بعد دقيقتين - [few] بعد { $number } دقائق - [many] بعد { $number } دقيقة - *[other] بعد { $number } دقيقة - } -timeDiffFutureHours = - { $number -> - [zero] بعد أقل من ساعة - [one] بعد ساعة - [two] بعد ساعتين - [few] بعد { $number } ساعات - [many] بعد { $number } ساعة - *[other] بعد { $number } ساعة - } -timeDiffFutureDays = - { $number -> - [one] غدا - [two] بعد غد - [few] بعد { $number } أيام - [many] بعد { $number } يومًا - *[other] بعد { $number } يوم - } -errorThirdPartyCookiesEnabled = إذا أخذت هذه اللقطة و لا تستطيع حذفها، فقد تحتاج إلى تمكين كعكات الأطراف الخارجية مؤقتًا من تفضيلات المتصفح. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = سجّل ملاحظة! -promoMessage = تتيح لك أدوات التحرير المتقدّمة اقتصاص وإبراز وإضافة النصوص إلى اللقطة. -promoLink = لمَ لا تجربها؟ -promoCloseButton = - .title = أغلِق التنبيه - -## Annotations - -annotationPenButton = - .title = قلم -annotationHighlighterButton = - .title = قلم تحديد -annotationUndoButton = - .title = تراجَع -annotationRedoButton = - .title = أعِد -annotationTextButton = - .title = أضِف نصا -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = امسح -annotationCropButton = - .title = اقتص -annotationSaveEditButton = احفظ - .title = احفظ التعديل -annotationCancelEditButton = ألغِ - .title = ألغِ التعديل -annotationCropConfirmButton = أكّد - .title = أكّد التحديد -annotationCropCancelButton = ألغِ - .title = ألغِ التحديد -annotationColorWhite = - .title = الأبيض -annotationColorBlack = - .title = الأسود -annotationColorRed = - .title = الأحمر -annotationColorGreen = - .title = الأخضر -annotationColorBlue = - .title = الأزرق -annotationColorYellow = - .title = الأصفر -annotationColorPurple = - .title = الأرجواني -annotationColorSeaGreen = - .title = الأخضر البحري -annotationColorGrey = - .title = الرمادي -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = حجم النص -# Values shown in text size selection dropdown -textSizeSmall = صغير -textSizeMedium = متوسط -textSizeLarge = كبير -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = أكّد - .title = أكّد -textToolCancelButton = ألغِ - .title = ألغِ -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = مرحبًا - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = حدث خطأ ما -copyImageErrorMessage = تعذّر نسخ اللقطة إلى الحافظة. - -## Settings Page - -settingsDisconnectButton = اقطع الاتصال - .title = اقطع الاتصال -settingsGuestAccountMessage = حساب ضيف -settingsSignInButton = لِج - .title = لِج -SettingsPageHeader = إعدادات لقطات شاشة فَيَرفُكس -settingsFirefoxAccountSubHeader = حساب فَيَرفُكس -settingsClosePreferences = - .title = أغلِق التفضيلات -settingsFxaDisconnectAlertMessage = أمتأكّد من فصل هذا الجهاز من حساب فَيَرفُكس لديك؟ -settingsFxaDisconnectDescription = إن خرجت فسيكون عليك الولوج ثانيةً لتصل إلى لقطاتك. -settingsFxaConnectDescription = يمكنك الولوج لتصل إلى لقطاتك عبر مختلف الأجهزة. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = خطأ أثناء حذف اللقطة: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = لقطاتي: ابحث عن { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = خطأ أثناء تصيير الصفحة: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = ابحث في لقطاتي -shotIndexPageNoShotsMessage = لا لقطات محفوظة. -shotIndexPageNoShotsInvitation = حرّك نفسك والتقط شيئا. -shotIndexPageLookingForShots = يبحث عن لقطاتك… -shotIndexPageNoSearchResultsIntro = إم -shotIndexPageNoSearchResults = تعذّر العثور على أي لقطة تطابق معايير البحث. -shotIndexPageMyShotsButton = - .title = لقطاتي -shotIndexPageClearSearchButton = - .title = امسح البحث -shotIndexPageConfirmShotDelete = أنحذف هذه اللقطة؟ -shotIndexPagePreviousPage = - .title = الصفحة السابقة -shotIndexPageNextPage = - .title = الصفحة التالية -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = هذه ليست لقطة محبّبة وسينقضي تاريخها -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = هذه لقطة في قائمة المفضلة، صلاحيتها لا تنقضي -shotIndexSyncedShot = - .title = أُخذت اللقطة من جهاز آخر -shotIndexAlertErrorFavoriteShot = عطل في تحديث حالة اللقطة المفضلة - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = أمتأكد من حذف هذه اللقطة؟ -shotDeleteCancel = ألغِ - .title = ألغِ -shotDeleteConfirm = احذف - .title = احذف - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = لتصديرها: استخدم ”ملف > احفظ الصفحة باسم…“ وستجد لقطاتك في المجلد { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = إحصائيات «لقطات فَيرفُكس» -metricsPageTotalsQueryTitle = المجموع -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = نظرة عامة على «اللقطات» -metricsPageTotalsQueryDevices = مجموع الأجهزة المسجلة -metricsPageTotalsQueryActiveShots = اللقطات النشطة -metricsPageTotalsQueryExpiredShots = منتهية الصلاحية (و لكن يمكن استعادتها) -metricsPageTotalsQueryExpiredDeletedShots = منتهية الصلاحية (و محذوفة) -metricsPageShotsQueryTitle = اللقطات في اليوم -metricsPageShotsQueryDescription = عدد اللقطات المُنشأة يوميا (خلال الثلاثين يوما الماضية) -metricsPageShotsQueryCount = عدد اللقطات -metricsPageShotsQueryDay = اليوم -metricsPageUsersQueryTitle = المستخدمين في اليوم -metricsPageUsersQueryDescription = عدد المستخدمين الذين أنشئوا لقطة واحدة على الأقل في اليوم (آخر ٣٠ يوم) -metricsPageUsersQueryCount = عدد المستخدمين -metricsPageUsersQueryDay = اليوم -metricsPageUserShotsQueryTitle = عدد اللقطات لكل مستخدم -metricsPageUserShotsQueryDescription = عدد المستخدمين اللذين لديهم ما مجموعه ن من اللقطات -metricsPageUserShotsQueryCount = عدد المستخدمين -metricsPageUserShotsQueryShots = العدد التقريبي للقطات النشطة (غير المنتهية) -metricsPageRetentionQueryTitle = الاحتفاظ بالأسبوع -metricsPageRetentionQueryDescription = عدد الأيام من لقطة المستخدم الأولى إلى اللقطة الأخيرة، مجمعة حسب أسبوع البداية -metricsPageRetentionQueryUsers = عدد المستخدمين -metricsPageRetentionQueryDays = عدد الأيام من لقطة المستخدم الأولى إلى اللقطة الأخيرة -metricsPageRetentionQueryFirstWeek = الأسبوع الذي أنشأ فيه المستخدم أول لقطة -metricsPageTotalRetentionQueryTitle = الاحتفاظ الكلي -metricsPageTotalRetentionQueryDescription = طول الوقت الذي ينشئ فيه المستخدمين لقطات، مجمعة حسب الأسبوع -metricsPageTotalRetentionQueryUsers = عدد المستخدمين -metricsPageTotalRetentionQueryDays = الأيام التي ينشئ فيها المستخدمين اللقطات -metricsPageVersionQueryTitle = إصدارة الإضافة -metricsPageVersionQueryDescription = إصدارة لإضافة المستخدمة أثناء الولوج، في آخر ١٤ يوم -metricsPageVersionQueryUsers = عدد المستخدمين الوالجين -metricsPageVersionQueryVersion = إصدارة الإضافة -metricsPageVersionQueryLastSeen = اليوم -metricsPageHeader = الإحصائيات -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = أنشئت في: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (وقت قاعدة البيانات: { $created } مللي ثانية) diff --git a/locales/as/server.ftl b/locales/as/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/as/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/ast/server.ftl b/locales/ast/server.ftl deleted file mode 100644 index 821140031e..0000000000 --- a/locales/ast/server.ftl +++ /dev/null @@ -1,170 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Les mios captures -gHomeLink = Aniciu -gNoShots = - .alt = Nun s'alcontraron captures -gSettings = Axustes -gSignIn = Aniciar sesión - -## Header - -signInButton = - .aria-label = Aniciar sesión -settingsButton = - .aria-label = Axustes - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Términos -footerLinkFaqs = Entrugues frequentes -footerLinkDiscourse = Dar feedback -footerLinkRemoveAllData = Desaniciar tolos datos - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creando { $title } -creatingPageTitleDefault = páxina -creatingPageWaitMessage = Guardando la to captura... - -## Home page - -homePageButtonMyShots = Dir a Les mios captures -homePageTeaser = Próximamente... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Descarga de baldre -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Cómo funciona Firefox Screenhoots -homePageGetStartedTitle = Entamar -homePageLegalLink = Llegal -homePagePrivacyLink = Privacidá -homePageTermsLink = Términos -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageErrorGeneric = Asocedió un fallu -leavePageButtonProceed = Siguir -leavePageButtonCancel = Encaboxar - -## Not Found page - -notFoundPageTitle = Nun s'alcontró la páxina -notFoundPageIntro = Ups. -notFoundPageDescription = Nun s'alcontró la páxina. - -## Shot page - -shotPageShareButton = - .title = Compartir -shotPageCopy = Copiar -shotPageCopied = Copióse -shotPageDownloadShot = - .title = Baxar -shotPageDownload = Baxar -shotPageKeepTenMinutes = 10 minutos -shotPageKeepOneHour = 1 hora -shotPageKeepOneDay = 1 día -shotPageKeepOneWeek = 1 selmana -shotPageKeepTwoWeeks = 2 selmanes -shotPageKeepOneMonth = 1 mes -shotPageSaveExpiration = guardar -shotPageCancelExpiration = encaboxar -shotPageDoesNotExpire = nun caduca -timeDiffJustNow = xusto agora -timeDiffDaysAgo = - { $number -> - [one] ayeri - *[other] hai { $number } díes - } -timeDiffFutureMinutes = - { $number -> - [one] en 1 minutu - *[other] en { $number } minutos - } -timeDiffFutureDays = - { $number -> - [one] mañana - *[other] en { $number } díes - } - -## Shot Page New Feature Promotion Dialog. - - -## Annotations - -annotationUndoButton = - .title = Desfacer -annotationRedoButton = - .title = Refacer -annotationTextButton = - .title = Amestar testu -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Llimpiar -annotationSaveEditButton = Guardar - .title = Guarda la edición -annotationCancelEditButton = Encaboxar - .title = Encaboxar la edición -annotationCropConfirmButton = Confirmar - .title = Confirma la esbilla -annotationCropCancelButton = Encaboxar - .title = Encaboxa la esbilla -annotationColorWhite = - .title = Blancu -annotationColorBlack = - .title = Prietu -annotationColorRed = - .title = Bermeyu -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Azul -annotationColorYellow = - .title = Mariellu -annotationColorPurple = - .title = Moráu -annotationColorSeaGreen = - .title = Verde mar -annotationColorGrey = - .title = Buxu -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tamañu del testu -# Values shown in text size selection dropdown -textSizeSmall = Pequeñu -textSizeMedium = Mediu -textSizeLarge = Grande - -## Settings Page - - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Fallu desaniciando la captura: { $status } { $statusText } -shotIndexPageNoSearchResultsIntro = Umm - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - -metricsPageShotsQueryDay = Día -metricsPageUsersQueryDay = Día -metricsPageUserShotsQueryCount = Númberu d'usuarios -metricsPageRetentionQueryUsers = Númberu d'usuarios -metricsPageTotalRetentionQueryUsers = Númberu d'usuarios -metricsPageVersionQueryLastSeen = Día -metricsPageHeader = Métriques diff --git a/locales/az/server.ftl b/locales/az/server.ftl deleted file mode 100644 index e00cb355de..0000000000 --- a/locales/az/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Ekran Görüntülərim -gHomeLink = Ev -gNoShots = - .alt = Ekran görüntüsü tapılmadı -gScreenshotsDescriptionServerless = Ekran görüntüləri asanlaşdırıldı. Ekran görüntülərinizi Firefox səyyahınızı tərk etmədən çəkin və endirin. - -## Header - -buttonSettings = - .title = Tənzimləmələr -buttonSignIn = - .title = Daxil ol -screenshotsLogo = - .title = Screenshots Ana Səhifəsi -bannerSignIn = Cihazlarınız arasında görüntülərinizi görmək üçün daxil olun və ya qeyd olun və seçilmiş görüntülərinizi daimi olaraq saxlayın. -bannerUpsell = { gScreenshotsDescription } Firefox Endir -shutdownWarning = Saxlanılmış ekran görüntülərinin vaxtı yaxında çıxacaq. İyun ayından etibarən Ekran Görüntüləri onlayn saxlama xidmətini dayandıracaq. Kitabxananızdaki görüntüləri saxlamaq istəyirsiniz? Kompüterinizə endirin. -shutdownPageTitle = Screenshots xidməti dəyişir -shutdownPageDescription = İyun ayından etibarən Screenshots xidməti ekran görüntülərini onlayn saxlama imkanını qaldıracaq. Kitabxananızdakı görüntüləri saxlamaq istəyirsiniz? Görüntüləri bir-bir və ya toplu halda endirin. Bu özəlliyi işlətdiyiniz üçün təşəkkürlər, narahatçılıq üçün üzr istəyirik. -shutdownPageContinue = Ümid edirik Screenshots özəlliyini ekran görüntülərinizi çəkmək, köçürmək və endirmək üçün işlətməyə davam edəcəksiniz. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefox Screenshots-dakı yeniliklər nələrdir? -onboardingPromoMessage = Artıq Screenshots-a Firefox Hesabınız ilə daxil olun və daha çox iş görün: -onboardingPromoMessageListItem1 = Kitabxananızı bütün cihazlarda görə bilərsiz -onboardingPromoMessageListItem2 = Seçilmiş görüntülərinizi həmişəlik saxlaya bilərsiz -onboardingPromoDismissButton = Qapat - .title = Qapat -onboardingPromoSigninButton = Daxil ol - .title = Daxil ol - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Şərtlər -footerLinkPrivacy = Məxfilik Bildirişi -footerReportShot = Görüntünü şikayət et - .title = Bu görüntünü təhqir, spam və ya digər problemlər üçün şikayət et -footerLinkFaqs = ÇSS -footerLinkDMCA = Müəllif hüquqlarının pozuntusu haqqında xəbər ver -footerLinkDiscourse = Əks-əlaqə ver -footerLinkRemoveAllData = Bütün məlumatları sil - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } yaradılır -creatingPageTitleDefault = səhifə -creatingPageWaitMessage = Ekran görüntünüz saxlanılır… - -## Home page - -homePageDescription = - .content = İntuitiv ekran görüntüləri səyyaha bağlıdırlar. İnterneti Firefox ilə gəzərkən ekran görüntülərini çəkin, saxlayın və paylaşın. -homePageButtonMyShots = Ekran görüntülərimə get -homePageTeaser = Tezliklə… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Pulsuz Endir -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Ekran Görüntüləri necə işləyir -homePageGetStartedTitle = Başla -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Ünvan sətrindəki səhifə əməliyyatları menyusundan Ekran Görüntüləri ikonunu seçin və Ekran Görüntüləri menyusu səyyahınızın pəncərəsinin üstündə peyda olacaq. -homePageCaptureRegion = Bölgəni çək -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Çəkmək istədiyiniz sahəni seçmək üçün klikləyin və daşıyın. Ya da sadəcə üzərinə gəlin və klikləyin — Screenshots sahəni sizin üçün seçəcək. Gördüyünüzü bəyəndiniz? Ekran görüntünüzü onlayn saxlamaq üçün Saxla seçin və ya aşağı ox düyməsi ilə kompüterinizə endirin. -homePageCapturePage = Səhifəni çək -homePageCapturePageDescription = Bütün səhifəni çəkmək üçün sağ yuxarı küncdəki düymələrdən istifadə edin. Görünəni Saxla düyməsi səhifənin sürüşdürmədən gördüyünüz hissəsini, Bütün Səhifəni Saxla düyməsi isə səhifədə olan hər şeyi çəkəcək. -homePageDownloadCopy = Endir və ya Köçür -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Ən yaxşı görüntülərinizi çəkin. Screenshots ilə görüntülərinizi endirə və ya birbaşa mübadilə buferinə köçürdə bilərsiz. -homePageLegalLink = Hüquqi -homePagePrivacyLink = Məxfilik -homePageTermsLink = Şərtlər -homePageCookiesLink = Çərəzlər - -## Leave Screenshots page - -leavePageRemoveAllData = Bütün məlumatlar silindi -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Hesabınızı silmək üçün Firefox Screenshots qurulu olmalıdır və ya Firefox Hesabınıza giriş etmiş olmalısınız -leavePageErrorGeneric = Xəta baş verdi -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Bu bütün Firefox Screenshots məlumatlarınızı həmişəlik siləcək. -leavePageButtonProceed = Davam et -leavePageButtonCancel = Ləğv et -leavePageDeleted = Bütün ekran görüntüləriniz silindi! - -## Not Found page - -notFoundPageTitle = Səhifə tapılmadı -notFoundPageIntro = Uups. -notFoundPageDescription = Səhifə tapılmadı. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Ekran görüntüsü: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Başa çatma tarixini saxlamada xəta -shotPageAlertErrorDeletingShot = Görüntü silmədə xəta -shotPageAlertErrorUpdatingTitle = Başlıq saxlanılması xətası -shotPageConfirmDelete = Bu görüntünü həmişəlik silmək istədiyinizə əminsiniz? -shotPageShareButton = - .title = Paylaş -shotPageCopyButton = - .title = Şəkli mübadilə buferinə köçür -shotPageCopyActionLabel = Köçür -shotPageCopied = Köçürüldü -shotPageShareFacebook = - .title = Facebook-da paylaş -shotPageShareTwitter = - .title = Twitter-də paylaş -shotPageSharePinterest = - .title = Pinterest-də paylaş -shotPageShareEmail = - .title = Keçidi e-poçt ilə paylaş -shotPageShareLink = Bu görüntü üçün paylaşıla bilən keçid əldə edin: -shotPagePrivacyMessage = Keçidi olan hər kəs bu görüntüyə baxa bilər. -shotPageCopyImageText = - .label = Şəklin mətnini köçürt -shotPageConfirmDeletion = Bu görüntünü həmişəlik silmək istədiyinizə əminsiniz? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Əgər heç bir şey etməsəniz, bu şəkil həmişəlik silinəcək . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date } tarixinə qədər bərpa et. -shotPageExpiredMessage = Bu görüntünün vaxtı keçib. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Görüntünün çəkildiyi səhifənin ünvanı: -shotPageDeleteButton = - .title = Bu görüntünü sil -shotPageDownloadShot = - .title = Endir -shotPageEditButton = - .title = Bu şəkli redaktə et -shotPagefavoriteButton = - .title = Bu görüntünü seçilmiş et -shotPageBackToHomeButton = - .title = Ana Səhifə -shotPageAllShotsButton = - .title = Bütün Görüntülər -shotPageScreenshotsDescriptionServerless = Ekran görüntüləri asanlaşdırıldı. Firefox səyyahınızı tərk etmədən ekran görüntülərinizi çəkin və endirin. -shotPageDMCAMessage = Bu görüntü üçüncü tərəfin müəllif hüquqlarının pozuntusu tələbinə görə artıq əlçatan deyil. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Lütfən, əlavə məlumat üçün { $dmca } ilə əlaqə saxlayın. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Əgər görüntüləriniz bir neçə dəfə şikayət edilsə, Firefox Screnshots girişinizi bağlaya bilərik. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Lütfən, bu görüntünün keçidini e-poçtunuza əlavə edin: { $url } -shotPageKeepFor = Bu görüntü nə qədər müddətə saxlanılsın? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Vaxtı seçin -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Sonsuz ∞ -shotPageKeepTenMinutes = 10 dəqiqə -shotPageKeepOneHour = 1 saat -shotPageKeepOneDay = 1 gün -shotPageKeepOneWeek = 1 həftə -shotPageKeepTwoWeeks = 2 həftə -shotPageKeepOneMonth = 1 ay -shotPageSaveExpiration = saxla -shotPageCancelExpiration = ləğv et -shotPageDoesNotExpire = vaxtı çıxmasın -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = silinəcək -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = silindi -timeDiffJustNow = indicə -timeDiffMinutesAgo = - { $number -> - [one] 1 dəqiqə əvvəl - *[other] { $number } dəqiqə əvvəl - } -timeDiffHoursAgo = - { $number -> - [one] 1 saat əvvəl - *[other] { $number } saat əvvəl - } -timeDiffDaysAgo = - { $number -> - [one] dünən - *[other] { $number } gün əvvəl - } -timeDiffFutureSeconds = bir neçə saniyə sonra -timeDiffFutureMinutes = - { $number -> - [one] 1 dəqiqə sonra - *[other] { $number } dəqiqə sonra - } -timeDiffFutureHours = - { $number -> - [one] 1 saat sonra - *[other] { $number } saat sonra - } -timeDiffFutureDays = - { $number -> - [one] sabah - *[other] { $number } gün sonra - } -errorThirdPartyCookiesEnabled = Əgər bu ekran görüntüsünü siz çəkmisinizsə və onu silə bilmirsinizsə, onda səyyahınızın nizamlamalarında müvəqqəti olaraq üçüncü tərəf çərəzləri aktivləşdirməlisiniz. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Qeyd alın! -promoMessage = Yenilənmiş redaktə etmə alətləri görüntülərinizi kəsməyə, işıqlandırmağa və hətta yazı da əlavə etməyə imkan verirlər. -promoLink = Yoxlayın -promoCloseButton = - .title = Bildirişi qapat - -## Annotations - -annotationPenButton = - .title = Qələm -annotationHighlighterButton = - .title = Marker -annotationUndoButton = - .title = Geri al -annotationRedoButton = - .title = Təkrarla -annotationTextButton = - .title = Mətn əlavə et -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Təmizlə -annotationCropButton = - .title = Kəs -annotationSaveEditButton = Saxla - .title = Dəyişikliyi saxla -annotationCancelEditButton = Ləğv et - .title = Dəyişikliyi ləğv et -annotationCropConfirmButton = Təsdiqlə - .title = Seçilənləri təsdiqlə -annotationCropCancelButton = Ləğv et - .title = Seçilənləri ləğv et -annotationColorWhite = - .title = Ağ -annotationColorBlack = - .title = Qara -annotationColorRed = - .title = Qırmızı -annotationColorGreen = - .title = Yaşıl -annotationColorBlue = - .title = Göy -annotationColorYellow = - .title = Sarı -annotationColorPurple = - .title = Bənövşəyi -annotationColorSeaGreen = - .title = Dəniz yaşılı -annotationColorGrey = - .title = Boz -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Mətnin ölçüsü -# Values shown in text size selection dropdown -textSizeSmall = Balaca -textSizeMedium = Orta -textSizeLarge = Böyük -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Təsdiqlə - .title = Təsdiqlə -textToolCancelButton = Ləğv et - .title = Ləğv et -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Salam - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Nəsə səhv getdi -copyImageErrorMessage = Şəkliniz mübadilə buferinə köçürülə bilmir. - -## Settings Page - -settingsDisconnectButton = Əlaqəni kəs - .title = Əlaqəni kəs -settingsGuestAccountMessage = Qonaq Hesabı -settingsSignInButton = Daxil ol - .title = Daxil ol -SettingsPageHeader = Firefox Screenshots Tənzimləmələri -settingsFirefoxAccountSubHeader = Firefox Hesabı -settingsClosePreferences = - .title = Nizamlamaları qapat -settingsFxaDisconnectAlertMessage = Bu cihazı Firefox Hesabınızdan ayırmaq istədiyinizə əminsiniz? -settingsFxaDisconnectDescription = Əgər çıxsanız ekran görüntülərinizi təkrar görmək üçün daxil olmalı olacaqsınız. -settingsFxaConnectDescription = Daxil olaraq görüntülərinizi bütün cihazlarınızda görə bilərsiz. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Görüntünün silinməsində xəta: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mənim Görüntülərim: { $searchTerm } üçün axtarış -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Səhifənin renderinqində xəta: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Görüntülərimi axtar -shotIndexPageNoShotsMessage = Saxlanılmış görüntü yoxdur. -shotIndexPageNoShotsInvitation = İrəli, bir neçəsini yaradın. -shotIndexPageLookingForShots = Görüntülərinizi axtarırıq… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Axtarışınıza uyğun görüntü tapa bilmədik. -shotIndexPageMyShotsButton = - .title = Ekran Görüntülərim -shotIndexPageClearSearchButton = - .title = Axtarışı təmizlə -shotIndexPageConfirmShotDelete = Bu görüntü silinsin? -shotIndexPagePreviousPage = - .title = Əvvəlki səhifə -shotIndexPageNextPage = - .title = Sonrakı səhifə -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Bu seçilmiş görüntü deyil və vaxtı çıxacaq -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Bu seçilmiş görüntüdür və bunun vaxtı çıxmır -shotIndexSyncedShot = - .title = Görüntü başqa cihazda çəkilib -shotIndexAlertErrorFavoriteShot = Seçilmiş görüntünün statusunu yeniləmədə xəta baş verdi - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Bu görüntünü silmək istədiyinizdən əminsiniz? -shotDeleteCancel = Ləğv et - .title = Ləğv et -shotDeleteConfirm = Sil - .title = Sil - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = İxrac etmək üçün: Fayl > Fərqli saxla… seçin və { $folder } qovluğunda ekran görüntülərinizi tapacaqsınız - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots Metrikləri -metricsPageTotalsQueryTitle = Ümumi -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Screenshots-un İcmalı -metricsPageTotalsQueryDevices = Ümumi qeydiyyatdan keçmiş cihazlar -metricsPageTotalsQueryActiveShots = Aktiv görüntülər -metricsPageTotalsQueryExpiredShots = Vaxtı keçib (lakin bərpa oluna bilər) -metricsPageTotalsQueryExpiredDeletedShots = Vaxtı keçib (və silinib) -metricsPageShotsQueryTitle = Günlük Görüntülər -metricsPageShotsQueryDescription = Hər gün yaradılmış görüntülərin sayı (son 30 gün ərzində) -metricsPageShotsQueryCount = Görüntülərin sayı -metricsPageShotsQueryDay = Gün -metricsPageUsersQueryTitle = Günlük İstifadəçilər -metricsPageUsersQueryDescription = Gün ərzində heç olmasa bir ekran görüntüsü yaratmış istifadəçilərin sayı (son 30 gün) -metricsPageUsersQueryCount = İstifadəçilərin sayı -metricsPageUsersQueryDay = Gün -metricsPageUserShotsQueryTitle = İstifadəçi Başına Görüntü Sayı -metricsPageUserShotsQueryDescription = Ümumi olaraq hardasa N görüntü çəkən istifadəçilərin sayı -metricsPageUserShotsQueryCount = İstifadəçilərin Sayı -metricsPageUserShotsQueryShots = Aktiv (vaxtı çıxmamış) görüntülərin təxmini sayısı -metricsPageRetentionQueryTitle = Həftəlik saxlama yaddaşı -metricsPageRetentionQueryDescription = İstifadəçinin ilk ekran görüntüsündən ən sonuncusuna qədər olan günlərin sayı, həftənin başlanğıc gününə görə qruplaşdırılıb -metricsPageRetentionQueryUsers = İstifadəçilərin sayı -metricsPageRetentionQueryDays = İstifadəçinin ilk görüntüsündən sonuncusuna qədər olan günlər -metricsPageRetentionQueryFirstWeek = İstifadəçinin ilk görüntü yaratdığı həftə -metricsPageTotalRetentionQueryTitle = Ümumi saxlama yaddaşı -metricsPageTotalRetentionQueryDescription = İstifadəçilərin ekran görüntülərini yaratmağa sərf etdikləri vaxt, həftəyə görə qruplaşdırılıb -metricsPageTotalRetentionQueryUsers = İstifadəçilərin sayı -metricsPageTotalRetentionQueryDays = İstifadəçinin görüntü yaratdığı günlər -metricsPageVersionQueryTitle = Əlavə Versiyası -metricsPageVersionQueryDescription = Son 14 gün ərzində giriş zamanı istifadə olunmuş əlavənin versiyası -metricsPageVersionQueryUsers = Daxil olmuş istifadəçilərin sayı -metricsPageVersionQueryVersion = Əlavə versiyası -metricsPageVersionQueryLastSeen = Gün -metricsPageHeader = Metriklər -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Törədilib: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (məlumat bazasının vaxtı: { $time }ms) diff --git a/locales/be/server.ftl b/locales/be/server.ftl deleted file mode 100644 index 0cf3d23418..0000000000 --- a/locales/be/server.ftl +++ /dev/null @@ -1,396 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Мае здымкі -gHomeLink = Хатняя старонка -gNoShots = - .alt = здымкі не знойдзены -gScreenshotsDescription = Рабіць скрыншоты стала прасцей. Рабіце, захоўвайце і дзяліцеся скрыншотамі, не пакідаючы Firefox. - -## Header - -buttonSettings = - .title = Налады -buttonSignIn = - .title = Увайсці -screenshotsLogo = - .title = Хатняя старонка Screenshots -bannerSignIn = Увайдзіце або зарэгіструйцеся, каб мець доступ да вашых здымкаў з розных прылад і захоўваць упадабаныя заўсёды. -bannerUpsell = { gScreenshotsDescription } Атрымаць Firefox -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Што новага ў Firefox Screenshots? -onboardingPromoMessage = Цяпер увайдзіце ў Screenshots з дапамогай уліковага запісу Firefox і зрабіце больш: -onboardingPromoMessageListItem1 = Атрымайце доступ да сваёй бібліятэкі на ўсіх прыладах -onboardingPromoMessageListItem2 = Захоўвайце вашы ўлюбёныя здымкі заўжды -onboardingPromoDismissButton = Адхіліць - .title = Адхіліць -onboardingPromoSigninButton = Увайсці - .title = Увайсці - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Умовы выкарыстання -footerLinkPrivacy = Паведамленне аб прыватнасці -footerReportShot = Паведаміць пра здымак - .title = Паведаміць, што гэтым здымкам злоўжываюць, спамяць, ці яшчэ што -footerLinkFaqs = Пытанні і адказы -footerLinkDMCA = Паведаміць аб парушэнні аўтарскіх правоў -footerLinkDiscourse = Даць водгук -footerLinkRemoveAllData = Выдаліць усе дадзеныя - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Стварэнне { $title } -creatingPageTitleDefault = старонка -creatingPageWaitMessage = Захаванне здымка… - -## Home page - -homePageDescription = - .content = Інтуітыўныя скрыншоты наўпрост у браўзеры. Захоплівайце, захоўвайце і дзяліцеся скрыншотамі пры праглядзе вэб-старонак з дапамогай Firefox. -homePageButtonMyShots = Перайсці да маіх здымкаў -homePageTeaser = Хутка... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Сцягнуць бясплатна -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Як працуе Firefox Screenshots -homePageGetStartedTitle = Пачаць -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Выберыце значок Screenshots з меню Дзеянні старонкі ў адрасным радку і меню Screenshots з'явіцца ў верхняй частцы акна браўзера. -homePageCaptureRegion = Захоп вобласці -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Пстрыкніце і перацягніце, каб выбраць вобласць, якую вы хочаце захапіць. Ці проста навядзіце мышшу і пстрыкніце - Screenshots абярэ вобласць самі. Падабаецца, што вы бачыце? Выберыце «Захаваць», каб атрымаць магчымасць апублікаваць ваш скрыншот анлайн або пстрыкніце па кнопцы са стрэлкай ўніз, каб загрузіць здымак на ваш камп'ютар. -homePageCapturePage = Захоп старонкі -homePageCapturePageDescription = З дапамогай кнопак у верхнім правым куце вы можаце захапіць старонку цалкам. Кнопка «Захаваць бачнае» захопіць бачнае змесціва старонкі, якое даступна без пракручвання, а «Захаваць ўсю старонку» захопіць ўсю старонку цалкам. -homePageSaveShare = Захаваць і падзяліцца -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageShaveShareFavoriteDescription = Зрабіце свой лепшы здымак. Потым захавайце яго ў анлайнавай бібліятэцы здымкаў экрана, а Firefox скапіруе спасылку ў ваш буфер абмену, каб здымкам было лёгка падзяліцца. Здымкі ў бібліятэцы аўтаматычна выдаляюцца пасля двух тыдняў, але вы можаце сцерці іх у любы час, або захоўваць даўжэй. -homePageSignInTitle = Вашы здымкі ўсюды -homePageSignInDescription = Увайдзіце ў сэрвіс Screenshots з уліковым запісам Firefox, каб мець доступ да сваіх здымкаў экрана ўсюды, дзе вы карыстаецеся Firefox. І дадатковы бонус: вы можаце захоўваць улюбёныя здымкі безтэрмінова. -homePageLegalLink = Юрыдычная інфармацыя -homePagePrivacyLink = Прыватнасць -homePageTermsLink = Умовамі выкарыстання -homePageCookiesLink = Кукі - -## Leave Screenshots page - -leavePageRemoveAllData = Выдаліць усе дадзеныя -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Для выдалення вашага ўліковага запісу трэба каб у вас быў усталяваны Firefox Screenshots, або каб вы ўвайшлі ў уліковы запіс Firefox -leavePageErrorGeneric = Здарылася памылка -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Гэта дзеянне назаўжды выдаліць усе вашы дадзеныя Firefox Screenshots. -leavePageButtonProceed = Працягнуць -leavePageButtonCancel = Адмяніць -leavePageDeleted = Усе вашыя здымкі былі сцёртыя! - -## Not Found page - -notFoundPageTitle = Старонка не знойдзена -notFoundPageIntro = Вой! -notFoundPageDescription = Старонка не знойдзена. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Скрыншот: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Памылка пры захаванні часу заканчэння -shotPageAlertErrorDeletingShot = Памылка пры выдаленні здымка -shotPageAlertErrorUpdatingTitle = Памылка захавання назвы -shotPageConfirmDelete = Вы сапраўды хочаце назаўсёды выдаліць гэты здымак? -shotPageShareButton = - .title = Падзяліцца -shotPageCopyButton = - .title = Капіяваць відарыс у буфер абмену -shotPageCopyActionLabel = Капіяваць -shotPageCopied = Скапіявана -shotPageShareFacebook = - .title = Падзяліцца на Фэйсбуку -shotPageShareTwitter = - .title = Падзяліцца ў Твітары -shotPageSharePinterest = - .title = Падзяліцца ў Pinterest -shotPageShareEmail = - .title = Падзяліцца спасылкай па э-пошце -shotPageShareLink = Атрымаць публічную спасылку на гэты здымак: -shotPagePrivacyMessage = Любы, хто мае гэту спасылку, можа праглядаць гэты здымак. -shotPageCopyImageText = - .label = Капіяваць тэкст выявы -shotPageConfirmDeletion = Вы сапраўды хочаце назаўсёды выдаліць гэты здымак? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Калі вы нічога не будзеце рабіць, здымак будзе выдалены назаўсёды . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = працягнуты да { $date } -shotPageExpiredMessage = Гэты здымак пратэрмінаваны. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Старонка, з якой створаны гэты здымак: -shotPageDeleteButton = - .title = Выдаліць гэты здымак -shotPageDownloadShot = - .title = Сцягнуць -shotPageEditButton = - .title = Рэдагаваць гэту выяву -shotPagefavoriteButton = - .title = Дадаць гэты здымак у абраныя -shotPageBackToHomeButton = - .title = Хатняя старонка -shotPageAllShotsButton = - .title = Усе здымкі -shotPageScreenshotsDescription = Рабіць скрыншоты стала прасцей. Рабіце, захоўвайце і дзяліцеся скрыншотамі, не пакідаючы Firefox. -shotPageDMCAMessage = Гэты здымак больш недаступны з-за парушэння аўтарскіх правоў трэцяга боку. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Калі ласка, напішыце на { $dmca }, каб запытаць дадатковую інфармацыю. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Калі на вашы здымкі паскардзіліся некалькі разоў, мы можам заблакаваць вам доступ да Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Калі ласка, дадайце да вашага ліста спасылку на гэты здымак: { $url } -shotPageKeepFor = Як доўга будзе захоўвацца гэты здымак? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Выберыце час -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Бясконца ∞ -shotPageKeepTenMinutes = 10 хвілін -shotPageKeepOneHour = 1гадзіну -shotPageKeepOneDay = 1 дзень -shotPageKeepOneWeek = 1 тыдзень -shotPageKeepTwoWeeks = 2 тыдні -shotPageKeepOneMonth = 1 месяц -shotPageSaveExpiration = захаваць -shotPageCancelExpiration = адмяніць -shotPageDoesNotExpire = неабмежаваны тэрмін -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = тэрмін захоўвання мінае -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = тэрмін захоўвання скончыўся -timeDiffJustNow = толькі што -timeDiffMinutesAgo = - { $number -> - [one] хвіліну таму - [few] { $number } хвіліны таму - *[other] { $number } хвілін таму - } -timeDiffHoursAgo = - { $number -> - [one] гадзіну таму - [few] { $number } гадзіны таму - *[other] { $number } гадзін таму - } -timeDiffDaysAgo = - { $number -> - [one] учора - [few] { $number } дні таму - *[other] { $number } дзён таму - } -timeDiffFutureSeconds = праз некалькі секунд -timeDiffFutureMinutes = - { $number -> - [one] за хвіліну - [few] за { $number } хвіліны - *[other] за { $number } хвілін - } -timeDiffFutureHours = - { $number -> - [one] за гадзіну - [few] за { $number } гадзіны - *[other] за { $number } гадзін - } -timeDiffFutureDays = - { $number -> - [one] заўтра - [few] за { $number } дні - *[other] за { $number } дзён - } -errorThirdPartyCookiesEnabled = Калі вы зрабілі гэты здымак і не можаце яго выдаліць, вам можа спатрэбіцца часова ўключыць прыём кукі з пабочных сайтаў у наладах вашага браўзера. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Заўважце! -promoMessage = Абноўленыя прылады рэдагавання могуць абразаць, падсвятляць, і нават дадаваць тэкст да вашага здымку. -promoLink = Паспрабаваць -promoCloseButton = - .title = Закрыць паведамленне - -## Annotations - -annotationPenButton = - .title = Асадка -annotationHighlighterButton = - .title = Маркер -annotationUndoButton = - .title = Адкаціць -annotationRedoButton = - .title = Паўтарыць -annotationTextButton = - .title = Дадаць тэкст -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Ачысціць -annotationCropButton = - .title = Абрэзаць -annotationSaveEditButton = Захаваць - .title = Захаваць змены -annotationCancelEditButton = Скасаваць - .title = Скасаваць змены -annotationCropConfirmButton = Пацвердзіць - .title = Пацвердзіць вылучэнне -annotationCropCancelButton = Скасаваць - .title = Скасаваць вылучэнне -annotationColorWhite = - .title = Белы -annotationColorBlack = - .title = Чорны -annotationColorRed = - .title = Чырвоны -annotationColorGreen = - .title = Зялёны -annotationColorBlue = - .title = Сіні -annotationColorYellow = - .title = Жоўты -annotationColorPurple = - .title = Фіялетавы -annotationColorSeaGreen = - .title = Сіня-зялёны -annotationColorGrey = - .title = Шэры -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Памер тэксту -# Values shown in text size selection dropdown -textSizeSmall = Дробны -textSizeMedium = Сярэдні -textSizeLarge = Вялікі -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Сцвердзіць - .title = Сцвердзіць -textToolCancelButton = Скасаваць - .title = Скасаваць -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Вітаем - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Нешта пайшло не так -copyImageErrorMessage = Немагчыма скапіраваць ваш здымак у буфер абмену. - -## Settings Page - -settingsDisconnectButton = Адлучыцца - .title = Адлучыцца -settingsGuestAccountMessage = Гасцявы уліковы запіс -settingsSignInButton = Увайсці - .title = Увайсці -SettingsPageHeader = Налады Firefox Screenshots -settingsFirefoxAccountSubHeader = Уліковы запіс Firefox -settingsClosePreferences = - .title = Закрыць налады -settingsFxaDisconnectAlertMessage = Вы ўпэўнены, што хочаце адлучыць гэту прыладу ад свайго ўліковага запісу Firefox? -settingsFxaDisconnectDescription = Калі вы выйдзіце, вам спатрэбіцца ўвайсці ізноў, каб аднавіць доступ да вашых здымкаў. -settingsFxaConnectDescription = Вы можаце ўвайсці, каб мець доступ да сваіх здымкаў экрана з розных прылад. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Памылка выдалення здымку: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Мае здымкі: пошук { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Памылка рэндэрынгу старонкі: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Пошук маіх здымкаў -shotIndexPageNoShotsMessage = Няма захаваных здымкаў. -shotIndexPageNoShotsInvitation = Давайце, стварыце некалькі. -shotIndexPageLookingForShots = Пошук вашых здымкаў… -shotIndexPageNoSearchResultsIntro = Хмм -shotIndexPageNoSearchResults = Мы не можам знайсці здымкі па вашаму запыту. -shotIndexPageMyShotsButton = - .title = Мае здымкі -shotIndexPageClearSearchButton = - .title = Ачысціць пошук -shotIndexPageConfirmShotDelete = Выдаліць гэты здымак? -shotIndexPagePreviousPage = - .title = Папярэдняя старонка -shotIndexPageNextPage = - .title = Наступная старонка -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Гэта не ўпадабаны здымак, яго тэрмін захоўвання скончыцца -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Гэта абраны здымак, ён мае неабмежаваны тэрмін -shotIndexSyncedShot = - .title = Здымак зроблены на іншай прыладзе -shotIndexAlertErrorFavoriteShot = Памылка пры абнаўленні статусу здымка «улюбёны» - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Вы ўпэўненыя, што жадаеце выдаліць гэты здымак? -shotDeleteCancel = Адмяніць - .title = Адмяніць -shotDeleteConfirm = Выдаліць - .title = Выдаліць - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Метрыкі Firefox Screenshots -metricsPageTotalsQueryTitle = Вынікі -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Агляд Screenshots -metricsPageTotalsQueryDevices = Усяго зарэгістраваных прылад -metricsPageTotalsQueryActiveShots = Актыўныя здымкі -metricsPageTotalsQueryExpiredShots = Тэрмін захоўвання мінуў (але можна аднавіць) -metricsPageTotalsQueryExpiredDeletedShots = Тэрмін захоўвання мінуў (здымак выдалены) -metricsPageShotsQueryTitle = Здымкаў у дзень -metricsPageShotsQueryDescription = Колькасць здымкаў, створаных за кожны дзень (за апошнія 30 дзён) -metricsPageShotsQueryCount = Колькасць здымкаў -metricsPageShotsQueryDay = Дзень -metricsPageUsersQueryTitle = Карыстальнікаў у дзень -metricsPageUsersQueryDescription = Колькасць карыстальнікаў, якія стварылі хаця б адзін здымак за дзень (30 дзён) -metricsPageUsersQueryCount = Колькасць карыстальнікаў -metricsPageUsersQueryDay = Дзень -metricsPageUserShotsQueryTitle = Колькасць здымкаў на карыстальніка -metricsPageUserShotsQueryDescription = Колькасць карыстальнікаў, якія зрабілі ўсяго каля N здымкаў -metricsPageUserShotsQueryCount = Колькасць карыстальнікаў -metricsPageUserShotsQueryShots = Прыкладная колькасць актыўных здымкаў (тэрмін захоўвання якіх не мінуў) -metricsPageRetentionQueryTitle = Захаванняў за тыдзень -metricsPageRetentionQueryDescription = Колькасць дзён ад першага здымка карыстальніка да апошняга, згрупаваныя па пачаткам тыдня -metricsPageRetentionQueryUsers = Колькасць карыстальнікаў -metricsPageRetentionQueryDays = Дзён ад першага да апошняга здымка карыстальніка -metricsPageRetentionQueryFirstWeek = Тыдзень, на якім карыстальнік стварыў першы здымак -metricsPageTotalRetentionQueryTitle = Агульная колькасць -metricsPageTotalRetentionQueryDescription = Час, які карыстальнікі марнуюць на стварэнне здымкаў, згрупаваны па тыднях -metricsPageTotalRetentionQueryUsers = Колькасць карыстальнікаў -metricsPageTotalRetentionQueryDays = Дні, у якія карыстальнік ствараў здымкі -metricsPageVersionQueryTitle = Версія дадатка -metricsPageVersionQueryDescription = Версія дадатку, якая выкарыстоўваецца пры ўваходзе, за апошнія 14 дзён -metricsPageVersionQueryUsers = Колькасць карыстальнікаў, якія ўваходзяць -metricsPageVersionQueryVersion = Версія дадатка -metricsPageVersionQueryLastSeen = Дзень -metricsPageHeader = Метрыкі -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Створана: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (час базы дадзеных: { $time }ms) diff --git a/locales/bg/server.ftl b/locales/bg/server.ftl deleted file mode 100644 index b4bea806b2..0000000000 --- a/locales/bg/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Моите снимки -gHomeLink = Начална страница -gNoShots = - .alt = Няма снимки на екрана -gScreenshotsDescriptionServerless = Лесно правене на екранни снимки. Създавайте и изтегляйте снимки на екрана без да напускате Firefox. - -## Header - -buttonSettings = - .title = Настройки -buttonSignIn = - .title = Вписване -screenshotsLogo = - .title = Страница на Screenshots -bannerSignIn = Впишете се или се регистрирайте, за да получите достъп до вашите снимки от други устройства и за да запазите вашите любими снимки завинаги. -bannerUpsell = { gScreenshotsDescription } Вземете Firefox сега -shutdownWarning = Запазените снимки скоро губят давност. Считано но юни Screenshots няма да предлага съхранение онлайн. Искате ли да запазите снимките от библиотеката си? Изтеглете ги на компютъра си. -shutdownPageTitle = Screenshots се променя -shutdownPageDescription = Считано но юни Screenshots няма да предлага съхранение онлайн. Искате ли да запазите снимките от библиотеката си? Изтеглете ги поединично или в пакет. Благодарим ви, че използвахте тази функция и съжаляваме за създадените неудобства. -shutdownPageContinue = Надяваме се да продължите да използвате Screenshots, за да правите, копирате и изтегляте снимки. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Какво е новото във Firefox Screenshots? -onboardingPromoMessage = Сега, впишете се в Screenshots с Firefox Account, за да: -onboardingPromoMessageListItem1 = Имате достъп до библиотеката на всичките ви устройства -onboardingPromoMessageListItem2 = Съхранявате любимите си снимки завинаги -onboardingPromoDismissButton = Прекратяване - .title = Прекратяване -onboardingPromoSigninButton = Вписване - .title = Вписване - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Условия -footerLinkPrivacy = Политика на поверителност -footerReportShot = Докладване на снимка - .title = Докладвайте снимката за злоупотреба, спам или друг проблем -footerLinkFaqs = Въпроси и отговори -footerLinkDMCA = Доклад за нарушение на авторско право -footerLinkDiscourse = Обратна връзка -footerLinkRemoveAllData = Премахване на всички данни - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Създаване на { $title } -creatingPageTitleDefault = страница -creatingPageWaitMessage = Запазване на снимката… - -## Home page - -homePageDescription = - .content = Вградена възможност за снимане на екрана. Правете, запазвайте и споделяйте снимки на екрана докато разглеждате Мрежата с Firefox. -homePageButtonMyShots = Моите снимки -homePageTeaser = Очаквайте скоро… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Свободно изтегляне -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Как работи Firefox Screenshots -homePageGetStartedTitle = Първи стъпки -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Изберете „Снимка на екрана“ от менюто с действия със страницата в адресната лента и менюто на „Screenshots“ ще се появи върху текущата страница. -homePageCaptureRegion = Улавяне на част от екрана -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Натиснете и влачете, за да изберете областта която желаете да уловите. Или просто поставете курсора отгоре и натиснете – Screenshots сама ще избере площта вместо вас. Харесва ли ви? Изберете „Запазване“, за да имате снимката онлайн или бутона със стрелка надолу, за да я изтеглите на вашия компютър. -homePageCapturePage = Улавяне на страница -homePageCapturePageDescription = Използвайте бутоните в горния десен ъгъл, за да снимате цели страници. Бутонът „Запазване на видимата област“ ще улови областта, която виждате без прелистване, а „Запазване на цялата страница“ – всичко на страницата. -homePageDownloadCopy = Изтегляне или копиране -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Вземете най-добрите си снимки. Screenshots ви дава възможност да изтеглите избрани снмики или да ги копирате в системния буфер. -homePageLegalLink = Правни въпроси -homePagePrivacyLink = Поверителност -homePageTermsLink = Условия -homePageCookiesLink = Бисквитки - -## Leave Screenshots page - -leavePageRemoveAllData = Премахване на всички данни -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Трябва да имате инсталирани Снимки на екрана за Firefox или да сте вписани с Firefox Account, за да може да изтриете вашата сметка -leavePageErrorGeneric = Възникна грешка -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Така вашата информация в Firefox Screenshots ще бъде необратимо премахната. -leavePageButtonProceed = Продължаване -leavePageButtonCancel = Отказ -leavePageDeleted = Всички ваши снимки бяха премахнати! - -## Not Found page - -notFoundPageTitle = Страницата не е намерена -notFoundPageIntro = Олеле. -notFoundPageDescription = Страницата не е намерена. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Снимка на екрана: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Грешка при запазване на срока на изтичане -shotPageAlertErrorDeletingShot = Грешка при изтриване на изображението -shotPageAlertErrorUpdatingTitle = Грешка при запазване на заглавието -shotPageConfirmDelete = Сигурни ли сте, че желаете изображението да бъде необратимо премахнато? -shotPageShareButton = - .title = Споделяне -shotPageCopyButton = - .title = Копиране на снимката в системния буфер -shotPageCopyActionLabel = Копиране -shotPageCopied = Копирано -shotPageShareFacebook = - .title = Споделяне във Facebook -shotPageShareTwitter = - .title = Споделяне в Twitter -shotPageSharePinterest = - .title = Споделяне в Pinterest -shotPageShareEmail = - .title = Споделяне препратката по ел. поща -shotPageShareLink = Препратка за споделяне към снимката: -shotPagePrivacyMessage = Всеки, който има препратката може да вижда снимката. -shotPageCopyImageText = - .label = Копиране на текста от снимката -shotPageConfirmDeletion = Сигурни ли сте, че желаете изображението да бъде необратимо премахнато? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ако не правите нищо тази снимка ще бъде необратимо премахната -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = възстановяване до { $date } -shotPageExpiredMessage = Тази снимка е с изтекла давност. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Това е страницата, от която е направена: -shotPageDeleteButton = - .title = Премахване на снимката -shotPageDownloadShot = - .title = Изтегляне -shotPageEditButton = - .title = Промяна на изображението -shotPagefavoriteButton = - .title = Отбележи тази снимка -shotPageBackToHomeButton = - .title = Страница -shotPageAllShotsButton = - .title = Всички снимки -shotPageScreenshotsDescriptionServerless = Лесно правене на екранни снимки. Създавайте и изтегляйте снимки на екрана без да напускате Firefox. -shotPageDMCAMessage = Това изображение вече не е налично, защото е докладвано като обект на авторско право. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Моля, за повече информация пишете до { $dmca }. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ако много хора докладват вашите изображения, може да откажем достъп до Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Моля, включете препратка към тази снимка във вашето писмо: { $url } -shotPageKeepFor = Колко дълго снимката да бъде пазена? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = продължителност -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Безкрайно ∞ -shotPageKeepTenMinutes = 10 минути -shotPageKeepOneHour = 1 час -shotPageKeepOneDay = 1 ден -shotPageKeepOneWeek = 1 седмица -shotPageKeepTwoWeeks = 2 седмици -shotPageKeepOneMonth = 1 месец -shotPageSaveExpiration = запазване -shotPageCancelExpiration = отказване -shotPageDoesNotExpire = не изтича -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = изтича -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = изтекло -timeDiffJustNow = току-що -timeDiffMinutesAgo = - { $number -> - [one] преди минута - *[other] преди { $number } минути - } -timeDiffHoursAgo = - { $number -> - [one] преди час - *[other] преди { $number } часа - } -timeDiffDaysAgo = - { $number -> - [one] вчера - *[other] преди { $number } дена - } -timeDiffFutureSeconds = след секунди -timeDiffFutureMinutes = - { $number -> - [one] след минута - *[other] след { $number } минути - } -timeDiffFutureHours = - { $number -> - [one] след час - *[other] след { $number } часа - } -timeDiffFutureDays = - { $number -> - [one] утре - *[other] след { $number } дни - } -errorThirdPartyCookiesEnabled = Ако сте направили тази снимка и не можете да я изтриете може да пробвате временно да включите бисквитките от трети страни в настройките на четеца. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Забележете! -promoMessage = Обновените инструменти за редактиране на снимки ви позволяват да ги отрязвате, рисувате за подчертаване и дори да им добавяте текст. -promoLink = Изпробвайте ги -promoCloseButton = - .title = Затваряне на известието - -## Annotations - -annotationPenButton = - .title = Писалка -annotationHighlighterButton = - .title = Маркер -annotationUndoButton = - .title = Отменяне -annotationRedoButton = - .title = Повтаряне -annotationTextButton = - .title = Добавяне на текст -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Изчистване -annotationCropButton = - .title = Изрязване -annotationSaveEditButton = Запазване - .title = Запазване на промените -annotationCancelEditButton = Отказ - .title = Отказ от промените -annotationCropConfirmButton = Потвърждение - .title = Потвърждаване на избора -annotationCropCancelButton = Отказ - .title = Отказване от избора -annotationColorWhite = - .title = Бяло -annotationColorBlack = - .title = Черно -annotationColorRed = - .title = Червено -annotationColorGreen = - .title = Зелено -annotationColorBlue = - .title = Синьо -annotationColorYellow = - .title = Жълто -annotationColorPurple = - .title = Лилаво -annotationColorSeaGreen = - .title = Синьо-зелено -annotationColorGrey = - .title = Сиво -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Размер на текста -# Values shown in text size selection dropdown -textSizeSmall = Малък -textSizeMedium = Среден -textSizeLarge = Голям -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Потвърждение - .title = Потвърждение -textToolCancelButton = Отказ - .title = Отказ -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Здравейте - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Нещо се обърка -copyImageErrorMessage = Снимката не може да бъде копирана в системния буфер. - -## Settings Page - -settingsDisconnectButton = Изключване - .title = Изключване -settingsGuestAccountMessage = Сметка за гости -settingsSignInButton = Вписване - .title = Вписване -SettingsPageHeader = Настройки на Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox Account -settingsClosePreferences = - .title = Затваряне -settingsFxaDisconnectAlertMessage = Сигурни ли сте, че искате да изключите това устройство от Firefox Account? -settingsFxaDisconnectDescription = Ако се отпишете, ще трябва да се впишете отново за възстановяване на достъпа до вашите снимки. -settingsFxaConnectDescription = Можете да се впишете, за да имате достъп до вашите снимки на всички ваши устройства. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Грешка при изтриване на изображението: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Моите снимки: търсене на { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Грешка при изчертаване на страницата: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Търсене в моите снимки -shotIndexPageNoShotsMessage = Няма запазени снимки. -shotIndexPageNoShotsInvitation = Хайде, направете няколко. -shotIndexPageLookingForShots = Търсене на вашите снимки… -shotIndexPageNoSearchResultsIntro = Хмм -shotIndexPageNoSearchResults = Не намираме снимки, които отговарят на търсенето ви. -shotIndexPageMyShotsButton = - .title = Моите снимки -shotIndexPageClearSearchButton = - .title = Изчистване на търсенето -shotIndexPageConfirmShotDelete = Сигурни ли сте, че желаете снимката да бъде премахната? -shotIndexPagePreviousPage = - .title = Предишна страница -shotIndexPageNextPage = - .title = Следваща страница -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Снимката не е любима и давността ѝ ще изтече -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Това е отбелязана снимка и тя няма срок на съхранение -shotIndexSyncedShot = - .title = Снимка от друго устройство -shotIndexAlertErrorFavoriteShot = Грешка при обновяване на състоянието на любимите снимки - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Сигурни ли сте, че желаете да изтриете тази снимка? -shotDeleteCancel = Отказ - .title = Отказ -shotDeleteConfirm = Изтриване - .title = Изтриване - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = За да изтеглите изберете: Файл > Запазване като… и ще намерите снимките в папка { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Метрики на Firefox Screenshots -metricsPageTotalsQueryTitle = Общо -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Преглед на снимките -metricsPageTotalsQueryDevices = Общ брой регистрирани устройства -metricsPageTotalsQueryActiveShots = Активни снимки -metricsPageTotalsQueryExpiredShots = С изтекъл срок (но възстановими) -metricsPageTotalsQueryExpiredDeletedShots = С изтекъл срок (и изтрити) -metricsPageShotsQueryTitle = Снимки на ден -metricsPageShotsQueryDescription = Брой снимки, създавани всеки ден (за последните 30 дена) -metricsPageShotsQueryCount = Брой снимки -metricsPageShotsQueryDay = Ден -metricsPageUsersQueryTitle = Потребители на ден -metricsPageUsersQueryDescription = Брой потребители на ден, които са създали най-малко една снимка (за последните 30 дена) -metricsPageUsersQueryCount = Брой потребители -metricsPageUsersQueryDay = Ден -metricsPageUserShotsQueryTitle = Брой снимки на потребител -metricsPageUserShotsQueryDescription = Брой потребители, които имат общо около N на брой снимки -metricsPageUserShotsQueryCount = Брой потребители -metricsPageUserShotsQueryShots = Приблизителен брой на активни (с неизтекъл срок) снимки -metricsPageRetentionQueryTitle = Запазване по седмици -metricsPageRetentionQueryDescription = Брой дни от първата снимка на потребителя до последната снимка, групирани по началната седмица -metricsPageRetentionQueryUsers = Брой потребители -metricsPageRetentionQueryDays = Дни от първата снимка на потребителя до последната -metricsPageRetentionQueryFirstWeek = Седмица на първата снимка на потребителя -metricsPageTotalRetentionQueryTitle = Общо запазване -metricsPageTotalRetentionQueryDescription = Продължителност на създаването на снимки от потребителите, групирани по седмица -metricsPageTotalRetentionQueryUsers = Брой потребители -metricsPageTotalRetentionQueryDays = Дни, през които потребителят е създавал снимки -metricsPageVersionQueryTitle = Версия на добавката -metricsPageVersionQueryDescription = Версия на добавката, използвана при влизане, през последните 14 дена -metricsPageVersionQueryUsers = Брой влезли потребители -metricsPageVersionQueryVersion = Версия на добавката -metricsPageVersionQueryLastSeen = Ден -metricsPageHeader = Метрики -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Генерирани в: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (време в базата от данни: { $time }ms) diff --git a/locales/bn-BD/server.ftl b/locales/bn-BD/server.ftl deleted file mode 100644 index b660b3c1b9..0000000000 --- a/locales/bn-BD/server.ftl +++ /dev/null @@ -1,363 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = আমার শটসমূহ -gHomeLink = হোম -gNoShots = - .alt = কোন শট পাওয়া যায়নি - -## Header - -buttonSettings = - .title = সেটিং -buttonSignIn = - .title = সাইন ইন -screenshotsLogo = - .title = Screenshots নীড় -bannerUpsell = { gScreenshotsDescription } Firefox ডাউনলোড করুন -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefox Screenshots এ নতুন কি আছে? -onboardingPromoDismissButton = বাতিল - .title = বাতিল -onboardingPromoSigninButton = সাইন ইন - .title = সাইন ইন - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = শর্তাবলী -footerLinkPrivacy = গোপনীয়তা নোটিশ -footerLinkFaqs = সাধারণত জিজ্ঞাসিত প্রশ্নাবলী -footerLinkDMCA = IP নিয়মলঙ্ঘন রিপোর্ট করুন -footerLinkDiscourse = প্রতিক্রিয়া জানান -footerLinkRemoveAllData = সকল ডাটা অপসারণ করুন - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } তৈরি করছে -creatingPageTitleDefault = পৃষ্ঠা -creatingPageWaitMessage = আপনার শট সংরক্ষিত হচ্ছে... - -## Home page - -homePageDescription = - .content = Firefox ব্যবহার করে ওয়েব ব্রাউজিং করার সময়ে স্ক্রিনশট ক্যাপচার, সংরক্ষণ ও শেয়ার করুন। ব্রাউজারের মধ্যেই স্বতঃস্ফুর্ত স্ক্রিনশট প্রস্তুত হয়ে যাবে। -homePageButtonMyShots = আমার শটে যাও -homePageTeaser = শীঘ্রই আসিতেছে... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = বিনামূল্যে ডাউনলোড -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots কিভাবে কাজ করে -homePageGetStartedTitle = শুরু হয়েছে -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = এড্রেস বারে অবস্থিত পেজ একশন মেনু থেকে স্ক্রিনশট আইকন সিলেক্ট করুন, এতে করে স্ক্রিনশট মেনু আপনার ব্রাউজার উইন্ডোর উপরের দিকে চলে আসবে। -homePageCaptureRegion = একটি অংশ ক্যাপচার করুন -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = ক্লিক এবং ড্রাগ করে এলাকা নির্বাচন করুন, যতটুকু আপনি ক্যাপচার করতে চান। অথবা হোভার করে ক্লিক করুন -- Screenshots আপনার হয়ে ওই এলাকাটা নির্বাচন করবে। আপনি সেটা সঠিক মনে করছেন? তাহলে সংরক্ষণ করে অনলাইনে রাখুন ব্যবহারের জন্যৈ অথবা নিম্নমুখি তীর চিহ্নে নির্বাচন করে আপনার কম্পিউটারে ডাউনলোড করে রাখুন। -homePageCapturePage = একটি পেজ ক্যাপচার করুন -homePageCapturePageDescription = পেজসমূহ সম্পূর্ণ ক্যাপচার করতে চাইলে উপরের ডান দিকের বোতাম ব্যবহার করুন। আপনি স্ক্রলিং না করে একটি ওয়েব পেজের যতটুকু অংশ দেখতে পান, তা ক্যাপচার করে দৃশ্যমান সংরক্ষণ বোতামটি, আর সম্পূর্ণ পেজ সংরক্ষণ ওই ওয়েবে পেজের সবকিছু ক্যাপচার করে। -homePageDownloadCopy = ডাউনলোড অথবা অনুলিপি -homePageLegalLink = আইনগত -homePagePrivacyLink = গোপনীয়তা -homePageTermsLink = শর্তাবলী -homePageCookiesLink = কুকি - -## Leave Screenshots page - -leavePageRemoveAllData = সকল ডাটা অপসারণ করুন -leavePageErrorGeneric = একটি ত্রুটি দেখা দিয়েছে। -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = এতে করে আপনার Firefox Screenshots এর সকল ডাটা স্থায়ীরূপে মুছে যাবে। -leavePageButtonProceed = অগ্রসর হন -leavePageButtonCancel = বাতিল -leavePageDeleted = আপনার সকল স্ক্রীনশট মুছে দেওয়া হয়েছে! - -## Not Found page - -notFoundPageTitle = পাতাটি পাওয়া যায়নি -notFoundPageIntro = ওহো! -notFoundPageDescription = পাতাটি পাওয়া যায়নি। - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = স্ক্রিনশট: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = সমাপ্তি সংরক্ষণে ত্রুটি -shotPageAlertErrorDeletingShot = শটটি মুছতে ভুল -shotPageAlertErrorUpdatingTitle = টাইটেল সংরক্ষণে ত্রুটি -shotPageConfirmDelete = আপনি কি নিশ্চিত যে আপনি এই শটটি মুছে ফেলতে চান? -shotPageShareButton = - .title = শেয়ার -shotPageCopyButton = - .title = ক্লিপবোর্ডে ছবি অনুলিপি করুন -shotPageCopyActionLabel = অনুলিপি -shotPageCopied = কপি করা হয়েছে -shotPageShareFacebook = - .title = Facebook শেয়ার করুন -shotPageShareTwitter = - .title = Twitter এ শেয়ার করুন -shotPageSharePinterest = - .title = Pinterest এ শেয়ার করুন -shotPageShareEmail = - .title = ইমেইলে লিংক শেয়ার করুন -shotPageShareLink = শটটির জন্য শেয়ারযোগ্য লিঙ্ক নিন: -shotPagePrivacyMessage = এই লিংকে যেকেউ শটটি দেখতে পারবে। -shotPageCopyImageText = - .label = ছবির টেক্সট কপি করুন -shotPageConfirmDeletion = আপনি কি নিশ্চিত এই শটটি স্থায়ীরূপে মুছে ফেলতে চান? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = আপনি যদি কিছু না করেন, তাহলে এই শটটি স্থায়ীরূপে মুছে ফেলা হবে . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date } তারিখ পর্যন্ত পুনঃস্থাপন করবে -shotPageExpiredMessage = শটটি মেয়াদোত্তীর্ণ -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = এই সেই পেজ যা প্রথমে তৈরী করা হয়েছিলো: -shotPageDeleteButton = - .title = শটটি মুছে ফেলুন -shotPageDownloadShot = - .title = ডাউনলোড -shotPageEditButton = - .title = ছবি সম্পাদনা করুন -shotPagefavoriteButton = - .title = শটটি প্রিয় হিসেবে চিহ্নিত করুন -shotPageBackToHomeButton = - .title = নীড়পাতা -shotPageAllShotsButton = - .title = সব শট -shotPageDMCAMessage = এক তৃতীয় পক্ষের মেধাসত্ত্ব দাবীর প্রেক্ষিতে শটটি আর পাওয়া যাবে না। -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = আরও তথ্যের জন্যে { $dmca } কে মেইল করে অনুরোধ করুন। -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = আপনার স্ক্রিনশটের উপর আপনি ব্যতীত বহুপক্ষীয় দাবি থাকলে, Firefox Screenshots থেকে আপনার প্রবেশাধিকার রদ করা হবে। -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = অনুগ্রহ করে এই সটটির URL আপনার ইমেইলে সংযুক্ত করুন: { $url } -shotPageKeepFor = এই সটটি কতদিন পর্যন্ত রাখতে চান? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = সময় নির্বাচন করুন -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = অনিশ্চিতভাবে ∞ -shotPageKeepTenMinutes = ১০ মিনিট -shotPageKeepOneHour = ১ ঘন্টা -shotPageKeepOneDay = ১ দিন -shotPageKeepOneWeek = ১ সপ্তাহ -shotPageKeepTwoWeeks = ২ সপ্তাহ -shotPageKeepOneMonth = ১ মাস -shotPageSaveExpiration = সংরক্ষণ -shotPageCancelExpiration = বাতিল -shotPageDoesNotExpire = বাতিল হয়ে যাবে না -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = দিনে মেয়াদোত্তীর্ণ হয়ে যাবে -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = মেয়াদোত্তীর্ণ -timeDiffJustNow = এখনই -timeDiffMinutesAgo = - { $number -> - [one] ১ মিনিট আগে - *[other] { $number } মিনিট আগে - } -timeDiffHoursAgo = - { $number -> - [one] ১ ঘন্টা আগে - *[other] { $number } ঘন্টা আগে - } -timeDiffDaysAgo = - { $number -> - [one] গতকাল - *[other] { $number } দিন আগে - } -timeDiffFutureSeconds = কিছুক্ষণের মধ্যেই -timeDiffFutureMinutes = - { $number -> - [one] ১ মিনিটের মধ্যে - *[other] { $number } মিনিটের মধ্যে - } -timeDiffFutureHours = - { $number -> - [one] ১ ঘন্টার মধ্যে - *[other] { $number } ঘন্টার মধ্যে - } -timeDiffFutureDays = - { $number -> - [one] আগামীকাল - *[other] { $number } দিনের মধ্যে - } -errorThirdPartyCookiesEnabled = আপনি যদি শট নেন, কিন্তু মুছে ফেলতে না পারেন, তাহলে আপনার ব্রাউজারের অপশন থেকে তৃতীয় পক্ষের কুকিজ অস্থায়ীভাবে সক্রিয় করতে হতে পারে। - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle =   নোট করুন! -promoMessage = আপডেট করা সম্পাদনার সরঞ্জাম আপনাকে ক্রপ, হাইলাইট এবং এমনকি আপনার শটে টেক্সট লিখতে দিবে। -promoLink = এগুলে একবার চেষ্টা করে দেখুন -promoCloseButton = - .title = বিজ্ঞপ্তি বন্ধ করুন - -## Annotations - -annotationPenButton = - .title = কলম -annotationHighlighterButton = - .title = হাইলাইটার -annotationUndoButton = - .title = আনডু -annotationRedoButton = - .title = পুনরায় কর -annotationTextButton = - .title = টেক্সট লিখুন -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = পরিষ্কার করুন -annotationCropButton = - .title = ছাঁটুন -annotationSaveEditButton = সংরক্ষণ - .title = সংরক্ষণ সম্পাদন -annotationCancelEditButton = বাতিল - .title = সম্পাদন বাতিল করুন -annotationCropConfirmButton = নিশ্চিতকরণ - .title = নির্বাচন নিশ্চিতকরণ -annotationCropCancelButton = বাতিল - .title = নির্বাচন বাতিল -annotationColorWhite = - .title = সাদা -annotationColorBlack = - .title = কালো -annotationColorRed = - .title = লাল -annotationColorGreen = - .title = সবুজ -annotationColorBlue = - .title = নীল -annotationColorYellow = - .title = হলুদ -annotationColorPurple = - .title = বেগুনি -annotationColorSeaGreen = - .title = গাঢ় সবুজ -annotationColorGrey = - .title = ধূসর -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = টেক্সট আকার -# Values shown in text size selection dropdown -textSizeSmall = ছোট -textSizeMedium = মধ্যম -textSizeLarge = বড় -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = নিশ্চিত - .title = নিশ্চিত করুন -textToolCancelButton = বাতিল - .title = বাতিল -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = স্বাগতম - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = কোন একটা সমস্যা হয়েছে - -## Settings Page - -settingsDisconnectButton = বিচ্ছিন্ন - .title = বিচ্ছিন্ন -settingsGuestAccountMessage = অতিথি অ্যাকাউন্ট -settingsSignInButton = সাইন ইন - .title = সাইন ইন -SettingsPageHeader = Firefox স্ক্রিনশট সেটিংস -settingsFirefoxAccountSubHeader = Firefox Account -settingsClosePreferences = - .title = পছন্দসমূহ বন্ধ করুন - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = { $status } { $statusText } ত্রুটির কারণে মোছা যাচ্ছে না -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = আমার সটসমূহ: { $searchTerm } এর জন্যে অনুসন্ধান করো -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = { $error } পেজটি উপস্থাপনে ত্রুটি -shotIndexPageSearchPlaceholder = - .placeholder = আমার শটগুলো খুঁজুন -shotIndexPageNoShotsMessage = কোন সংরক্ষিত শট নেই। -shotIndexPageNoShotsInvitation = নিন, কিছু তৈরি করুন। -shotIndexPageLookingForShots = আপনার শট খোঁজ করছি... -shotIndexPageNoSearchResultsIntro = হমম -shotIndexPageNoSearchResults = আমরা আপনার খোঁজার সাথে সম্পর্কিত কোন শট পাই নাই। -shotIndexPageMyShotsButton = - .title = আমার শট -shotIndexPageClearSearchButton = - .title = সার্চ পরিষ্কার করুন -shotIndexPageConfirmShotDelete = এই শটটি মুছবেন? -shotIndexPagePreviousPage = - .title = আগের পাতা -shotIndexPageNextPage = - .title = পরের পাতা - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = আপনি কি এই শটটি মুছে ফেলতে চান? -shotDeleteCancel = বাতিল - .title = বাতিল -shotDeleteConfirm = অপসারণ - .title = অপসারণ - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots ম্যাট্রিক্স -metricsPageTotalsQueryTitle = সর্বমোট -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Screenshots এর সংক্ষিপ্ত বিবরণ -metricsPageTotalsQueryDevices = সর্বমোট রেজিস্ট্রিকৃত ডিভাইস -metricsPageTotalsQueryActiveShots = সক্রিয় শটসমূহ -metricsPageTotalsQueryExpiredShots = মেয়াদোত্তীর্ণ (কিন্তু পুনরোদ্ধার করা যাবে) -metricsPageTotalsQueryExpiredDeletedShots = Kare ne okato (ki bene kikwanyo woko) -metricsPageShotsQueryTitle = দিনের ভিত্তিতে সংক্ষিপ্ত -metricsPageShotsQueryDescription = প্রতিদিন তৈরীকৃত সটের সংখ্যা (গত ৩০ দিনে) -metricsPageShotsQueryCount = শট সংখ্যা -metricsPageShotsQueryDay = দিন -metricsPageUsersQueryTitle = দিনে ব্যবহারকারীর সংখ্যা -metricsPageUsersQueryDescription = যেসকল ব্যবহারকারী অন্তঃত একটি সট তৈরী করেছেন, তাদের সংখ্যা (গত ৩০ দিনে) -metricsPageUsersQueryCount = ব্যবহারকারীর সংখ্যা -metricsPageUsersQueryDay = দিন -metricsPageUserShotsQueryTitle = ব্যবহারকারী প্রতি সট সংখ্যা -metricsPageUserShotsQueryDescription = ব্যবহারকারীর সংখ্যা যাদের N সংখ্যক সট রয়েছে -metricsPageUserShotsQueryCount = ব্যবহারকারীর সংখ্যা -metricsPageUserShotsQueryShots = সক্রিয় (মেয়াদ রয়েছে এমন) সটসমূহের আনুমানিক সংখ্যা -metricsPageRetentionQueryTitle = সপ্তাহের জের -metricsPageRetentionQueryDescription = ব্যবহারকারীর প্রথম আর সর্বশেষ তৈরীকৃত সট নেওয়ার মধ্যের দিনগুলো, শুরু করা সপ্তাহের ভিত্তিতে -metricsPageRetentionQueryUsers = ব্যবহারকারীর সংখ্যা -metricsPageRetentionQueryDays = ব্যবহারকারীর প্রথম আর সর্বশেষ তৈরীকৃত সট নেওয়ার মধ্যের দিনগুলো -metricsPageRetentionQueryFirstWeek = যে সপ্তাহে ব্যবহারকীর প্রথম সট তৈরী করেছিলো -metricsPageTotalRetentionQueryTitle = সর্বমোট জের -metricsPageTotalRetentionQueryDescription = যতটা সময় ধরে ব্যবহারকারীরা সট তৈরী করছে, সপ্তাহের ভিত্তিতে -metricsPageTotalRetentionQueryUsers = ব্যবহারকারীর সংখ্যা -metricsPageTotalRetentionQueryDays = যতদিন যাবত ব্যবহারকারীগণ সট তৈরী করছেন -metricsPageVersionQueryTitle = অ্যাড-অনের সংস্করণ -metricsPageVersionQueryDescription = গত ১৪ দিনে অ্যাড-অনের যে সংস্করণ ব্যবহার করে লগিন করা হয়েছে -metricsPageVersionQueryUsers = লগিন করা ব্যবহারকারীর সংখ্যা -metricsPageVersionQueryVersion = অ্যাড-অনের সংস্করণ -metricsPageVersionQueryLastSeen = দিন -metricsPageHeader = মেট্রিক্স -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = তৈরীর সময়: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (ডেটাবেসের সময়: { $time }ms) diff --git a/locales/bn-IN/server.ftl b/locales/bn-IN/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/bn-IN/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/br/server.ftl b/locales/br/server.ftl deleted file mode 100644 index 0652039ade..0000000000 --- a/locales/br/server.ftl +++ /dev/null @@ -1,411 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Ma zapadennoù -gHomeLink = Degemer -gNoShots = - .alt = Tapadenn ebet kavet -gScreenshotsDescriptionServerless = Tapadennoù-skramm en un doare eeun. Skeudennit ha pellgargit tapadennoù-skramm hep kuitaat Firefox. - -## Header - -buttonSettings = - .title = Arventennoù -buttonSignIn = - .title = Kennaskañ -screenshotsLogo = - .title = Degemer Screenshots -bannerSignIn = Kennaskit pe marilhit evit haeziñ ho tapadennoù war ho holl drevnadoù hag enrollit ho pennrolloù da viken. -bannerUpsell = { gScreenshotsDescription } Kaout Firefox bremañ -shutdownWarning = Tapadennoù skramm enrollet a ziamzero a-benn nebeut. Adalek miz Mezheven ne ginnigimp ket ar c'hadaviñ enlinenn ken. Fellout a ra deoc'h mirout ho tapadennoù? Pellgargit anezho war hoc'h urzhiataer. -shutdownPageTitle = Kemmañ a ra Screenshots -shutdownPageDescription = Adalek miz Mezheven ne vo ket ken a gadaviñ enlinenn evit Screenshot. Fellout a ra deoc'h mirout ho tapadennoù en ho skeudennaoueg? Pellgargit anezho unan dre unan pe a bakadoù. Ho trugarekaat a reomp evit ho implij, hag en em digareziñ a reomp mard oc'h lakaet diaes gant ar serradur-se. -shutdownPageContinue = Spi hon eus e kendalc'hot da arverañ Screenshots evit tapout, eilañ ha pellgargañ tapadennoù. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Petra nevez gant Firefox Screenshots? -onboardingPromoMessage = Bremañ e c'hallit kennaskañ da Screenshots gant ur gont Firefox hag ober traoù ouzhpenn: -onboardingPromoMessageListItem1 = Haezit ho skeudennaoueg war ho holl drevnadoù -onboardingPromoMessageListItem2 = Mirit an tapadennoù gwellañ deoc'h da viken -onboardingPromoDismissButton = Argas - .title = Argas -onboardingPromoSigninButton = Kennaskañ - .title = Kennaskañ - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Divizoù -footerLinkPrivacy = Evezhiadennoù a-fet buhez prevez -footerReportShot = Danevelliñ an dapadenn - .title = Danevelliñ an dapadenn-mañ evit un drougimplij, spam, pe kudennoù all -footerLinkFaqs = FAG -footerLinkDMCA = Danevellañ un torradur IP -footerLinkDiscourse = Reiñ evezhiadennoù -footerLinkRemoveAllData = Dilemel an holl roadennoù - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = O krouiñ { $title } -creatingPageTitleDefault = pajenn -creatingPageWaitMessage = Oc'h enrollañ ho tapadenn... - -## Home page - -homePageDescription = - .content = Tapadennoù skramm nadel savet e-barzh ar merdeer. Skeudennit, enrollit ha rannit tapadennoù-skramm e-pad m'emaoc'h o merdeiñ ar Web gant FIrefox. -homePageButtonMyShots = Mont d'am zapadennoù -homePageTeaser = Da zont a-benn nebeut... -homePageDownloadFirefoxTitle = FIrefox -homePageDownloadFirefoxSubTitle = Pellgargadur digoust -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Penaos ez a en-dro Firefox Screenshots -homePageGetStartedTitle = Kregiñ ganti -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Klikit war an arlun Tapadennoù-skramm war lañser gwezhioù ar bajenn er varrenn-chomlec'h evit diskouez lañser an tapadennoù-skramm e krec'h prenestr ho merdeer. -homePageCaptureRegion = Skeudenniñ ul lodenn -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klikit ha riklit evit diuzañ ar vaezienn a fell deoc'h skeudenniñ. Gallout a rit ivez klikañ hepken ha diuzet e vo ar vaezienn evidoc'h. Plijout a ra deoc'h ar pezh a welit? Dibabit "Enrollañ" evit haeziñ ho tapadenn-skramm enlinenn pe an arlun bit war-zu an traoñ evit e bellgargañ war hoc'h urzhiataer. -homePageCapturePage = Skeudenniñ ur bajenn -homePageCapturePageDescription = Arverit an afelloù e krec'h a-zehou evit skeudenniñ pajennoù a-bezh. An afell "Enrollañ ar pezh vez gwelet" a skeudenno ar vaezienn a c'haller gwelet hep dibunañ, ha "Enrollañ ar bajenn a-bezh" a skeudenno pep tra er bajenn. -homePageDownloadCopy = Pellgargañ pe eilañ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Mirit ho tapadennoù gwellañ. Screenshots a ginnig deoc'h pellgargañ ho tibab pe eilañ en ho kolver. -homePageLegalLink = Lezennel -homePagePrivacyLink = Buhez prevez -homePageTermsLink = Termenoù -homePageCookiesLink = Toupinoù - -## Leave Screenshots page - -leavePageRemoveAllData = Dilemel an holl roadennoù -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Dav eo deoc'h staliañ Firefox Screenshots pe kennaskañ d'ho kont Firefox evit dilemel ho kont -leavePageErrorGeneric = Degouezhet ez eus bet ur fazi -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Kement se a zilamo holl roadennoù Firefox Screenshots. -leavePageButtonProceed = Kenderc'hel -leavePageButtonCancel = Nullañ -leavePageDeleted = Dilamet eo bet holl ho tapadennoù-skramm! - -## Not Found page - -notFoundPageTitle = N'eo ket bet kavet ar bajenn -notFoundPageIntro = Chaous. -notFoundPageDescription = N'eo ket bet kavet ar bajenn. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Tapadenn-skramm: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Fazi en ur enrollañ an diamzeriñ -shotPageAlertErrorDeletingShot = Fazi en ur zilemel an dapadenn -shotPageAlertErrorUpdatingTitle = Fazi en ur enrollañ an titl -shotPageConfirmDelete = Sur oc'h e fell deoc'h dilemel an dapadenn-mañ? -shotPageShareButton = - .title = Rannañ -shotPageCopyButton = - .title = Eilañ ar skeudenn er golver -shotPageCopyActionLabel = Eilañ -shotPageCopied = Eilet -shotPageShareFacebook = - .title = Rannañ war Facebook -shotPageShareTwitter = - .title = Rannañ war dTwitter -shotPageSharePinterest = - .title = Rannañ war bPinterest -shotPageShareEmail = - .title = Rannañ an ere dre bostel -shotPageShareLink = Kaout un ere rannus evit an dapadenn-mañ: -shotPagePrivacyMessage = An holl re gant an ere a c'hell gwelet an dapadenn-mañ. -shotPageCopyImageText = - .label = Eilañ testenn ar skeudenn -shotPageConfirmDeletion = Sur oc'h e fell deoc'h dilemel an dapadenn-mañ? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ma ne rit netra e vo dilamet an dapadenn-mañ a-benn . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = atoriñ betek { $date } -shotPageExpiredMessage = Diamzeret eo an dapadenn. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Sed amañ ar bajenn orin: -shotPageDeleteButton = - .title = Dilemel an dapadenn-mañ -shotPageDownloadShot = - .title = Pellgargañ -shotPageEditButton = - .title = Embann ar skeudenn-mañ -shotPagefavoriteButton = - .title = Pennrollañ an dapadenn-mañ -shotPageBackToHomeButton = - .title = Degemer -shotPageAllShotsButton = - .title = An holl dapadennoù -shotPageScreenshotsDescriptionServerless = Tapadennoù-skramm en un doare eeun. Skeudennit ha pellgargit tapadennoù-skramm hep kuitaat Firefox. -shotPageDMCAMessage = An dapadenn-mañ n'eo ket hegerz ket abalamour m'eo bet danevellet gant un trede evit abegoù perc'henniezh kefredel. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Skrivit ur postel da: { $dmca } evit goulenn titouroù ouzhpenn. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ma zo meur a glemm war ho tapadennoù e c'hallomp dizorniañ ho kwir da haeziñ Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Enkorfit URL an tapadenn-mañ en ho postel: { $url } -shotPageKeepFor = E-pad pegen amzer eo ret derc'hel an tapadenn enlinenn? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Diuzañ an amzer -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Da viken ∞ -shotPageKeepTenMinutes = 10 munut -shotPageKeepOneHour = 1 eur -shotPageKeepOneDay = 1 devezh -shotPageKeepOneWeek = 1 sizhun -shotPageKeepTwoWeeks = 2 sizhun -shotPageKeepOneMonth = 1 miz -shotPageSaveExpiration = enrollañ -shotPageCancelExpiration = nullañ -shotPageDoesNotExpire = na ziamzer ket -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = diamzer a-benn -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = diamzeret abaoe -timeDiffJustNow = diouzhtu -timeDiffMinutesAgo = - { $number -> - *[one] 1 vunutenn 'zo - } -timeDiffHoursAgo = - { $number -> - [one] 1 vunutenn 'zo - [two] { $number } vunutenn 'zo - [few] { $number } munutenn 'zo - [many] { $number } a vunutennoù 'zo - *[other] { $number } munutenn 'zo - } -timeDiffDaysAgo = - { $number -> - [one] dec'h - [two] { $number } zevezh 'zo - [few] { $number } devezh 'zo - [many] { $number } a zevezhioù 'zo - *[other] { $number } devezh 'zo - } -timeDiffFutureSeconds = a-benn un nebeud eilennoù -timeDiffFutureMinutes = - { $number -> - [one] a-benn 1 vunutenn - [two] a-benn { $number } vunutenn - [few] a-benn { $number } munutenn - [many] a-benn { $number } a vunutennoù - *[other] a-benn { $number } munutenn - } -timeDiffFutureHours = - { $number -> - [one] a-benn 1 eur - [two] a-benn { $number } eur - [few] a-benn { $number } eur - [many] a-benn { $number } a eurioù - *[other] a-benn { $number } eur - } -timeDiffFutureDays = - { $number -> - [one] warc'hoazh - [two] a-benn { $number } zevezh - [few] a-benn { $number } devezh - [many] a-benn { $number } a zevezhioù - *[other] a-benn { $number } devezh - } -errorThirdPartyCookiesEnabled = M'ho peus kemeret an dapadenn-mañ ha n'hallit ket he dilemel ho peus ezhomm da weredekaat toupinoù an tredeoù e gwellvezioù ho merdeer. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Kemerit notennoù! -promoMessage = Gant an ostilhoù embann nevez e c'hallit didroc'hañ, usskediñ hag ouzhpennañ testennoù d'ho tapadennoù. -promoLink = Klaskit ober ganto -promoCloseButton = - .title = Serriñ ar rebuzadur - -## Annotations - -annotationPenButton = - .title = Kreion -annotationHighlighterButton = - .title = Usskeder -annotationUndoButton = - .title = Dizober -annotationRedoButton = - .title = Adober -annotationTextButton = - .title = Ouzhpennañ testennoù -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Skarzhañ -annotationCropButton = - .title = Troc'hañ -annotationSaveEditButton = Enrollañ - .title = Enrollañ an embann -annotationCancelEditButton = Nullañ - .title = Nullañ an embann -annotationCropConfirmButton = Kadarnat - .title = Kadarnat an diuzadenn -annotationCropCancelButton = Nullañ - .title = Nullañ an diuzadenn -annotationColorWhite = - .title = Gwenn -annotationColorBlack = - .title = Du -annotationColorRed = - .title = Ruz -annotationColorGreen = - .title = Gwer -annotationColorBlue = - .title = Glas -annotationColorYellow = - .title = Melen -annotationColorPurple = - .title = Mouk -annotationColorSeaGreen = - .title = Glas mor -annotationColorGrey = - .title = Loued -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Ment an testennoù -# Values shown in text size selection dropdown -textSizeSmall = Bihan -textSizeMedium = Etre -textSizeLarge = Ledan -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Kadarnaat - .title = Kadarnaat -textToolCancelButton = Nullañ - .title = Nullañ -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Demat - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Degouezhet ez eus bet ur fazi -copyImageErrorMessage = N'haller ket eilañ ho tapadenn er golver - -## Settings Page - -settingsDisconnectButton = Digennaskañ - .title = Digennaskañ -settingsGuestAccountMessage = Kont kouviad -settingsSignInButton = Kennaskañ - .title = Kennaskañ -SettingsPageHeader = Arventennoù Firefox Screenshots -settingsFirefoxAccountSubHeader = Kont Firefox -settingsClosePreferences = - .title = Serriñ ar gwellvezioù -settingsFxaDisconnectAlertMessage = Ha sur oc'h e fell deoc'h digennaskañ an trevnad-mañ deus ho kont Firefox? -settingsFxaDisconnectDescription = Ma tigennaskit ho po ezhomm adkennaskañ evit haeziñ ho tapadennoù-skramm en-dro. -settingsFxaConnectDescription = Gallout a rit kennaskañ evit haeziñ ho tapadennoù-skramm war ho holl drevnadoù. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Fazi en ur zilemel an dapadenn: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Ma zapadennoù: klask war-lec'h { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Fazi en ur skrammañ ar bajenn: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Klask ma zapadennoù -shotIndexPageNoShotsMessage = Tapadenn ebet enrollet -shotIndexPageNoShotsInvitation = Kit 'ta da skeudenniñ un dra bennak -shotIndexPageLookingForShots = O klask ho tapadennoù... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = N'haller ket kavout tapadennoù a glot gant hoc'h enklask. -shotIndexPageMyShotsButton = - .title = Ma zapadennoù -shotIndexPageClearSearchButton = - .title = Skarzhañ ar c'hlask -shotIndexPageConfirmShotDelete = Dilemel an dapadenn-mañ? -shotIndexPagePreviousPage = - .title = Pajenn gent -shotIndexPageNextPage = - .title = Pajenn da-heul -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = N'emañ ket an dapadenn er pennrolloù ha diamzeriñ a raio -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Er pennrolloù emañ an dapadenn-mañ ha ne ziamzero ket -shotIndexSyncedShot = - .title = Tapet eo bet skeudenn war un trevnad all -shotIndexAlertErrorFavoriteShot = Fazi en ur hizivaat statud an dapadenn er pennrolloù - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Sur oc'h e fell deoc'h dilemel an dapadenn-mañ? -shotDeleteCancel = Nullañ - .title = Nullañ -shotDeleteConfirm = Dilemel - .title = Dilemel - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Evit ezporzhiañ : arverit Restr > Enrollañ ar bajenn evel... ha kavout a reot ho tapadennoù-skramm en teuliad { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Stadegoù Firefox Screenshots -metricsPageTotalsQueryTitle = Sammadoù -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Ur sell hollek eus Screenshots -metricsPageTotalsQueryDevices = Sammad an trevnadoù enrollet -metricsPageTotalsQueryActiveShots = Tapadennoù gweredekaet -metricsPageTotalsQueryExpiredShots = Diamzeret (a c'hall bezañ assavet) -metricsPageTotalsQueryExpiredDeletedShots = Diamzeret (ha dilamet) -metricsPageShotsQueryTitle = Tapadenn dre zevezh -metricsPageShotsQueryDescription = Niver a dapadenn krouet bemdez (e-pad an 30 devezh diwezhañ) -metricsPageShotsQueryCount = Niver a dapadenn -metricsPageShotsQueryDay = Devezh -metricsPageUsersQueryTitle = Arveriad dre zevezh -metricsPageUsersQueryDescription = Niver a arveriad krouet ur dapadenn ganto d'an nebeutañ, dre zevezh (an 30 devezh diwezhañ) -metricsPageUsersQueryCount = Niver a arveriaded -metricsPageUsersQueryDay = Devezh -metricsPageUserShotsQueryTitle = Niver a dapadenn dre arveriad -metricsPageUserShotsQueryDescription = An niver a arveriaded gant N tapadenn ganto en holl -metricsPageUserShotsQueryCount = Niver a arveriaded -metricsPageUserShotsQueryShots = Niver brasjedet a dapadennoù gweredekaet -metricsPageRetentionQueryTitle = Miradurioù dre sizhun -metricsPageRetentionQueryDescription = Niver a zevezhioù etre tapadenn gentañ un arveriad betek e dapadenn ziwezhañ, strollet dre ar sizhunvezh deraouiñ -metricsPageRetentionQueryUsers = Niver a arveriaded -metricsPageRetentionQueryDays = Devezhioù etre tapadenn gentañ an arveriad betek e hini ziwezhañ -metricsPageRetentionQueryFirstWeek = Sizhunvezh tapadenn gentañ an arveriad -metricsPageTotalRetentionQueryTitle = Amdroadur klok -metricsPageTotalRetentionQueryDescription = Padelezh lec'h m'eo bet krouet tapadennoù gant arveriaded, strollet dre sizhun -metricsPageTotalRetentionQueryUsers = Niver a arveriaded -metricsPageTotalRetentionQueryDays = Niver a zevezhioù lec'h m'en deus an arveriad krouet tapadennoù -metricsPageVersionQueryTitle = Handelv an askouezh -metricsPageVersionQueryDescription = Handelv an askouezh implijet e-pad ar c'hennask, e-pad ar 14 devezh diwezhañ -metricsPageVersionQueryUsers = Niver a arveriaded o kennaskañ -metricsPageVersionQueryVersion = Handelv an askouezh -metricsPageVersionQueryLastSeen = Devezh -metricsPageHeader = Stadegoù -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Krouet d'ar/al: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (amzer implij ar stlennvon: { $time }ms) diff --git a/locales/bs/server.ftl b/locales/bs/server.ftl deleted file mode 100644 index 1f528566da..0000000000 --- a/locales/bs/server.ftl +++ /dev/null @@ -1,355 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Moji snimci -gHomeLink = Početna -gNoShots = - .alt = Snimci nisu pronađeni -gScreenshotsDescription = Snimite zaslon jednostavno. Snimite, sačuvajte i dijelite snimke zaslona bez da napustite Firefox. - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Uslovi -footerLinkPrivacy = Napomena o privatnosti -footerLinkFaqs = ČPP -footerLinkDMCA = Prijavite kršenje vlasničkih prava -footerLinkDiscourse = Pošaljite nam povratnu informaciju -footerLinkRemoveAllData = Uklonite sve podatke - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Pravim snimak stranice { $title } -creatingPageTitleDefault = stranica -creatingPageWaitMessage = Spremanje vaše snimke… - -## Home page - -homePageDescription = - .content = Intuitivni snimci zaslona ugrađeni direktno u vaš pretraživač. Snimite, spremite i dijelite snimke zaslona dok pretražujete web koristeći Firefox. -homePageButtonMyShots = Idi na moje snimke -homePageTeaser = Dolazi uskoro… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Besplatno preuzimanje -homePageGetStarted = Započnite -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Kako Firefox Screenshots radi -homePageGetStartedTitle = Započnite -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescription = Pronađite novu ikonu za snimke zaslona na vašoj alatnoj traci. Odaberite je i meni za snimke zaslona će se pojaviti na vrhu prozora pretraživača. -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Odaberite ikonu snimke ekrana iz menija radnji stranice u adresnoj traci i meni snimke ekrana će se pojaviti povrh prozora vašeg pretraživača. -homePageCaptureRegion = Uhvatite dio stranice -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Kliknite i vucite kako biste odabrali područje koje želite snimiti. Ili samo pređite mišem i kliknite — snimke zaslona će odabrati područje za vas. Sviđa vam se šta vidite? Odaberite Sačuvaj kako biste pristupili svojoj snimci na internetu ili dugme sa strelicom prema dole kako biste je preuzeli na svoj računar. -homePageCapturePage = Snimi stranicu -homePageCapturePageDescription = Koristite dugme gore desno kako biste snimili cijelu stranicu. Dugme Sačuvaj vidljivo će snimiti područje koje možete vidjeti bez pomicanja stranice, a Sačuvaj cijelu stranicu će snimiti sve na stranici. -homePageSaveShare = Sačuvaj i dijeli -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageSaveShareDescription = Kada napravite snimku, Firefox je šalje u vašu biblioteku snimki i kopira link u vaš međuspremnik. Automatski čuvamo vašu snimku dvije sedmice, ali je možete izbrisati bilo kada ili izmijeniti vrijeme čuvanja kako biste čuvali snimke duže u svojoj biblioteci. -homePageLegalLink = Pravne informacije -homePagePrivacyLink = Privatnost -homePageTermsLink = Uslovi -homePageCookiesLink = Kolačići - -## Leave Screenshots page - -leavePageRemoveAllData = Uklonite sve podatke -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAddonRequired = Morate imati Firefox Screenshot instaliran kako biste izbrisali svoj račun -leavePageErrorGeneric = Došlo je do greške -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Trajno ćete izbrisati sve Firefox Screenshot podatke. -leavePageButtonProceed = Nastavi -leavePageButtonCancel = Otkaži -leavePageDeleted = Sve vaše slike su izbrisane! - -## Not Found page - -notFoundPageTitle = Stranica nije pronađena -notFoundPageIntro = Ups. -notFoundPageDescription = Stranica nije pronađena. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Snimka: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Greška pri spremanju vremena isticanja -shotPageAlertErrorDeletingShot = Greška pri brisanju slike -shotPageAlertErrorUpdatingTitle = Greška pri spremanju naslova -shotPageConfirmDelete = Jeste li sigurni da želite trajno izbrisati ovu sliku? -shotPageShareButton = - .title = Dijeli -shotPageCopy = Kopiraj -shotPageCopied = Kopirano -shotPageShareFacebook = - .title = Podijeli na Facebooku -shotPageShareTwitter = - .title = Podijeli na Twitteru -shotPageSharePinterest = - .title = Podijeli na Pintrestu -shotPageShareEmail = - .title = Podijeli link putem e-pošte -shotPageShareLink = Dohvati link za dijeljenje za ovu sliku: -shotPagePrivacyMessage = Svi koji posjete ovaj link će moći vidjeti sliku. -shotPageCopyImageText = - .label = Kopiraj tekst slike -shotPageConfirmDeletion = Jeste li sigurni da želite trajno izbrisati ovu sliku? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ukoliko ništa ne učinite ova slika će biti trajno izbrisana . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = vrati do { $date } -shotPageExpiredMessage = Ovaj snimak je istekao. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Ovdje je stranica na kojoj je originalno uslikan: -shotPageDeleteButton = - .title = Izbriši ovaj snimak -shotPageAbuseButton = - .title = Prijavi ovaj snimak za zloupotrebu, spam i druge probleme -shotPageDownloadShot = - .title = Preuzimanje -shotPageEditButton = - .title = Uredi ovu sliku -shotPageDownload = Preuzimanje -shotPageScreenshotsDescription = Snimite zaslon jednostavno. Snimite, sačuvajte i dijelite snimke zaslona bez da napustite Firefox. -shotPageUpsellFirefox = Preuzmite Firefox sada -shotPageDMCAMessage = Ovaj snimak više nije dostupan zbog zahtjeva za intelektualnim vlasništvom treće strane. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Pošaljite e-poštu na { $dmca } kako biste zatražili više informacija. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ukoliko se pojavi više zahtjeva za kršenje intelektualnog vlasništva za vaše snimke, možemo vam ukinuti pristup usluzi Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Uključite URL na ovaj snimak u vašoj poruci e-pošte: { $url } -shotPageKeepFor = Koliko dugo želite čuvati ovaj snimak? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Odaberite vrijeme -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Beskonačno ∞ -shotPageKeepTenMinutes = 10 minuta -shotPageKeepOneHour = 1 sat -shotPageKeepOneDay = 1 dan -shotPageKeepOneWeek = 1 sedmicu -shotPageKeepTwoWeeks = 2 sedmice -shotPageKeepOneMonth = 1 mjesec -shotPageSaveExpiration = sačuvaj -shotPageCancelExpiration = otkaži -shotPageDoesNotExpire = ne ističe -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = ističe -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = isteklo -timeDiffJustNow = upravo sada -timeDiffMinutesAgo = - { $number -> - [one] prije 1 minutu - [few] prije { $number } minute - *[other] prije { $number } minuta - } -timeDiffHoursAgo = - { $number -> - [one] prije 1 sat - [few] prije { $number } sata - *[other] prije { $number } sati - } -timeDiffDaysAgo = - { $number -> - [one] prije 1 dan - *[few] prije { $number } dana - } -timeDiffFutureSeconds = za nekolio sekundi -timeDiffFutureMinutes = - { $number -> - [one] za 1 minutu - [few] za { $number } minute - *[other] za { $number } minuta - } -timeDiffFutureHours = - { $number -> - [one] za 1 sat - [few] za { $number } sata - *[other] za { $number } sati - } -timeDiffFutureDays = - { $number -> - [one] sutra - [few] za { $number } dana - *[other] za { $number } dana - } -errorThirdPartyCookiesEnabled = Ako ste napravili snimak ekrana i ne možete ga izbrisati, možda trebate privremeno omogućiti kolačiće trećih strana u postavkama browsera. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Zabilježite! -promoMessage = Ažurirani alati za uređivanje vam omogućavaju sjećenje, osvjetljavanje i čak dodavanje teksta na snimak. -promoLink = Isprobajte ih -promoCloseButton = - .title = Zatvori obavještenje - -## Annotations - -annotationPenButton = - .title = Olovka -annotationHighlighterButton = - .title = Marker -annotationUndoButton = - .title = Poništi -annotationRedoButton = - .title = Uradi ponovo -annotationTextButton = - .title = Dodaj tekst -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Očisti -annotationCropButton = - .title = Izreži -annotationSaveEditButton = Sačuvaj - .title = Sačuvaj izmjene -annotationCancelEditButton = Otkaži - .title = Odbaci izmjene -annotationCropConfirmButton = Potvrdi - .title = Potvrdi izbor -annotationCropCancelButton = Otkaži - .title = Otkaži izbor -annotationColorWhite = - .title = Bijela -annotationColorBlack = - .title = Crna -annotationColorRed = - .title = Crvena -annotationColorGreen = - .title = Zelena -annotationColorBlue = - .title = Plava -annotationColorYellow = - .title = Žuta -annotationColorPurple = - .title = Ljubičasta -annotationColorSeaGreen = - .title = Plavo-zelena -annotationColorGrey = - .title = Siva -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Veličina teksta -# Values shown in text size selection dropdown -textSizeSmall = Mala -textSizeMedium = Srednja -textSizeLarge = Velika -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Potvrdi - .title = Potvrdi -textToolCancelButton = Otkaži - .title = Otkaži -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Zdravo - -## Settings Page - -settingsDisconnectButton = Prekini vezu - .title = Prekini vezu -settingsGuestAccountMessage = Račun za gosta -settingsSignInInvite = Prijavite se za sinhronizaciju kroz uređaje -settingsSignInButton = Prijavi se - .title = Prijavi se -SettingsPageHeader = Firefox Screenshots postavke -settingsDescription = Možete se prijaviti sa Firefox računima za sinhronizaciju svih vaših snimaka na svim uređajima i pristupiti im privatno. -settingsPageSubHeader = Sync i računi -settingsClosePreferences = - .title = Zatvori postavke - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Greška pri brisanju snimka: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Moji snimci: traži { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Greška pri crtanju stranice: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Pretraži moje snimke -shotIndexPageSearchButton = - .title = Traži -shotIndexPageNoShotsMessage = Nema sačuvanih snimki. -shotIndexPageNoShotsInvitation = Samo naprijed, napravite nekoliko. -shotIndexPageLookingForShots = Traženje vaših snimki… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Ne možemo pronaći ni jedan snimak koji odgovara vašem upitu. -shotIndexPageClearSearchButton = - .title = Očisti pretragu -shotIndexPageConfirmShotDelete = Izbrisati ovaj snimak? -shotIndexPagePreviousPage = - .title = Prethodna stranica -shotIndexPageNextPage = - .title = Sljedeća stranica -# This symbol is used in the lower right corner of the card for a shot on the -# My Shots page to indicate that the shot does not expire. It should be a -# single character (or simply nothing if no such symbol is available for a -# language/culture). -shotIndexNoExpirationSymbol = ∞ - .title = Ovaj snimak ne ističe - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Da li ste sigurni da želite izbrisati ovu snimku? -shotDeleteCancel = Otkaži - .title = Otkaži -shotDeleteConfirm = Izbriši - .title = Izbriši - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshot metrika -metricsPageTotalsQueryTitle = Ukupno -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Pregled snimki zaslona -metricsPageTotalsQueryDevices = Ukupno registrovanih uređaja -metricsPageTotalsQueryActiveShots = Aktivnih snimaka -metricsPageTotalsQueryExpiredShots = Isteklo (ali se može vratiti) -metricsPageTotalsQueryExpiredDeletedShots = Isteklo (i izbrisano) -metricsPageShotsQueryTitle = Snimaka po danu -metricsPageShotsQueryDescription = Broj napravljenih snimaka svaki dan (za zadnjih 30 dana) -metricsPageShotsQueryCount = Broj snimaka -metricsPageShotsQueryDay = Dan -metricsPageUsersQueryTitle = Korisnika po danu -metricsPageUsersQueryDescription = Broj korisnika koji je napravio barem jedan snimak, po danu (zadnjih 30 dana) -metricsPageUsersQueryCount = Broj korisnika -metricsPageUsersQueryDay = Dan -metricsPageUserShotsQueryTitle = Broj snimaka po korisniku -metricsPageUserShotsQueryDescription = Broj korisnika koji imaju određeni broj snimaka -metricsPageUserShotsQueryCount = Broj korisnika -metricsPageUserShotsQueryShots = Približan broj aktivnih (koje nisu istekle) snimaka -metricsPageRetentionQueryTitle = Zadržavanje po sedmici -metricsPageRetentionQueryDescription = Broj dana od korisnikovog prvog snimka do najnovijeg snimka, grupisano po početnoj sedmici -metricsPageRetentionQueryUsers = Broj korisnika -metricsPageRetentionQueryDays = Dana od korisnikovog prvog do zadnjeg snimka -metricsPageRetentionQueryFirstWeek = Sedmica u kojoj je korisnik napravio prvi snimak -metricsPageTotalRetentionQueryTitle = Ukupno zadržavanje -metricsPageTotalRetentionQueryDescription = Dužina vremena u kojem korisnici stvaraju snimke, grupisano po sedmici -metricsPageTotalRetentionQueryUsers = Broj korisnika -metricsPageTotalRetentionQueryDays = Dani u kojima je korisnik stvarao snimke -metricsPageVersionQueryTitle = Verzija u obliku dodatka -metricsPageVersionQueryDescription = Verzija dodatka korištena prilikom prijave u zadnjih 14 dana -metricsPageVersionQueryUsers = Broj korisnika koji su se prijavili -metricsPageVersionQueryVersion = Verzija u obliku dodatka -metricsPageVersionQueryLastSeen = Dan -metricsPageHeader = Metrika -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Stvoreno: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (vrijeme baze podataka: { $time }ms) diff --git a/locales/ca/server.ftl b/locales/ca/server.ftl deleted file mode 100644 index 702fc507ad..0000000000 --- a/locales/ca/server.ftl +++ /dev/null @@ -1,388 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Les meves captures -gHomeLink = Inici -gNoShots = - .alt = No s'ha trobat cap captura -gScreenshotsDescriptionServerless = Captures de pantalla sense complicacions. Feu captures de pantalla i baixeu-les sense sortir del Firefox. - -## Header - -buttonSettings = - .title = Paràmetres -buttonSignIn = - .title = Inicia la sessió -screenshotsLogo = - .title = Pàgina d'inici del Firefox Screenshots -bannerSignIn = Registreu-vos o inicieu la sessió per accedir a les vostres captures en tots els dispositius i conservar les vostres preferides per sempre. -bannerUpsell = { gScreenshotsDescription } Baixeu el Firefox ara -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Novetats del Firefox Screenshots -onboardingPromoMessage = Ara, si inicieu la sessió al Firefox Screenshots amb un compte del Firefox, podreu: -onboardingPromoMessageListItem1 = Accedir a la vostra biblioteca des de tots els vostres dispositius -onboardingPromoMessageListItem2 = Desar per sempre les vostres captures preferides -onboardingPromoDismissButton = Tanca - .title = Tanca -onboardingPromoSigninButton = Inicia la sessió - .title = Inicia la sessió - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Condicions d'ús -footerLinkPrivacy = Avís de privadesa -footerReportShot = Denuncia la captura - .title = Denuncieu aquesta captura per abús, brossa o altres problemes -footerLinkFaqs = PMF -footerLinkDMCA = Denuncieu una infracció de propietat intel·lectual -footerLinkDiscourse = Doneu la vostra opinió -footerLinkRemoveAllData = Elimina totes les dades - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = S'està creant { $title } -creatingPageTitleDefault = pàgina -creatingPageWaitMessage = S'està desant la captura… - -## Home page - -homePageDescription = - .content = Captures de pantalla intuïtives des del navegador mateix. Captureu, deseu i compartiu imatges mentre navegueu amb el Firefox. -homePageButtonMyShots = Vés a les meves captures -homePageTeaser = Properament… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Baixada gratuïta -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Com funciona el Firefox Screenshots -homePageGetStartedTitle = Primers passos -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Seleccioneu la icona de l'Screenshots del menú d'accions de la pàgina a la barra d'adreces i apareixerà el menú de l'Screenshots al capdamunt de la finestra del navegador. -homePageCaptureRegion = Captureu una àrea -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Feu clic i arrossegueu per seleccionar l'àrea que voleu capturar. O bé, passeu-hi el ratolí per sobre i feu clic: el Firefox Screenshots seleccionarà l'àrea automàticament. Us agrada? Trieu «Desa» per accedir a la captura de pantalla en línia o premeu el botó de fletxa cap avall per baixar-la a l'ordinador. -homePageCapturePage = Captureu una pàgina -homePageCapturePageDescription = Utilitzeu els botons de la part superior dreta per capturar pàgines senceres. El botó «Captura la part visible» capturarà l'àrea que es visualitza sense desplaçar-se, i el botó «Captura tota la pàgina» capturarà tot el contingut de la pàgina. -homePageLegalLink = Avís legal -homePagePrivacyLink = Privadesa -homePageTermsLink = Condicions d'ús -homePageCookiesLink = Galetes - -## Leave Screenshots page - -leavePageRemoveAllData = Elimina totes les dades -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Heu de tenir el Firefox Screenshots instal·lat o haver iniciat la sessió al compte del Firefox per suprimir el vostre compte -leavePageErrorGeneric = S'ha produït un error -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Aquesta operació esborrarà totes les vostres dades del Firefox Screenshots. -leavePageButtonProceed = Continua -leavePageButtonCancel = Cancel·la -leavePageDeleted = S'han esborrat totes les captures de pantalla vostres. - -## Not Found page - -notFoundPageTitle = No s'ha trobat la pàgina -notFoundPageIntro = Ups. -notFoundPageDescription = No s'ha trobat la pàgina. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Captura de pantalla: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = S'ha produït un error en desar la caducitat -shotPageAlertErrorDeletingShot = S'ha produït un error en suprimir la captura -shotPageAlertErrorUpdatingTitle = S'ha produït un error en desar el títol -shotPageConfirmDelete = Segur que voleu suprimir aquesta captura permanentment? -shotPageShareButton = - .title = Comparteix -shotPageCopyButton = - .title = Copia la imatge al porta-retalls -shotPageCopyActionLabel = Copia -shotPageCopied = S'ha copiat -shotPageShareFacebook = - .title = Comparteix al Facebook -shotPageShareTwitter = - .title = Comparteix al Twitter -shotPageSharePinterest = - .title = Comparteix al Pinterest -shotPageShareEmail = - .title = Comparteix l'enllaç per correu electrònic -shotPageShareLink = Obteniu un enllaç a aquesta captura: -shotPagePrivacyMessage = Qualsevol persona amb l'enllaç pot veure aquesta captura. -shotPageCopyImageText = - .label = Copia el text de la imatge -shotPageConfirmDeletion = Segur que voleu suprimir aquesta captura permanentment? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Si no feu res, aquesta captura se suprimirà permanentment . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaura fins al { $date } -shotPageExpiredMessage = Aquesta captura ha caducat. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Aquesta és la pàgina des d'on es va fer originalment la captura: -shotPageDeleteButton = - .title = Suprimeix aquesta captura -shotPageDownloadShot = - .title = Baixa -shotPageEditButton = - .title = Edita aquesta imatge -shotPagefavoriteButton = - .title = Marca la captura com a favorita -shotPageBackToHomeButton = - .title = Pàgina d'inici -shotPageAllShotsButton = - .title = Totes les captures -shotPageScreenshotsDescriptionServerless = Captures de pantalla sense complicacions. Feu captures de pantalla i baixeu-les sense sortir del Firefox. -shotPageDMCAMessage = Aquesta captura ja no està disponible a causa d'una reclamació de propietat intel·lectual d'un tercer. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Envieu un correu electrònic a { $dmca } per sol·licitar més informació. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Si rebem diverses reclamacions per les vostres captures, se us podria denegar l'accés al Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Incloeu l'URL d'aquesta captura en el missatge de correu electrònic: { $url } -shotPageKeepFor = Quant temps voleu conservar aquesta captura? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Seleccioneu el temps -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinidament ∞ -shotPageKeepTenMinutes = 10 minuts -shotPageKeepOneHour = 1 hora -shotPageKeepOneDay = 1 dia -shotPageKeepOneWeek = 1 setmana -shotPageKeepTwoWeeks = 2 setmanes -shotPageKeepOneMonth = 1 mes -shotPageSaveExpiration = desa -shotPageCancelExpiration = cancel·la -shotPageDoesNotExpire = no caduca -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = caduca -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = ha caducat -timeDiffJustNow = ara mateix -timeDiffMinutesAgo = - { $number -> - [one] fa 1 minut - *[other] fa { $number } minuts - } -timeDiffHoursAgo = - { $number -> - [one] fa 1 hora - *[other] fa { $number } hores - } -timeDiffDaysAgo = - { $number -> - [one] ahir - *[other] fa { $number } dies - } -timeDiffFutureSeconds = d'aquí pocs segons -timeDiffFutureMinutes = - { $number -> - [one] d'aquí 1 minut - *[other] d'aquí { $number } minuts - } -timeDiffFutureHours = - { $number -> - [one] d'aquí 1 hora - *[other] d'aquí { $number } hores - } -timeDiffFutureDays = - { $number -> - [one] demà - *[other] d'aquí { $number } dies - } -errorThirdPartyCookiesEnabled = Si heu fet aquesta captura i no la podeu suprimir, és possible que hàgiu d'activar temporalment les galetes de tercers a les preferències del navegador. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Preneu nota! -promoMessage = Les eines d'edició actualitzades us permeten retallar la captura, ressaltar-la i afegir-hi text. -promoLink = Proveu-ho -promoCloseButton = - .title = Tanca la notificació - -## Annotations - -annotationPenButton = - .title = Llapis -annotationHighlighterButton = - .title = Marcador -annotationUndoButton = - .title = Desfés -annotationRedoButton = - .title = Refés -annotationTextButton = - .title = Afegeix text -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Esborra -annotationCropButton = - .title = Retalla -annotationSaveEditButton = Desa - .title = Desa l'edició -annotationCancelEditButton = Cancel·la - .title = Cancel·la l'edició -annotationCropConfirmButton = Confirma - .title = Confirma la selecció -annotationCropCancelButton = Cancel·la - .title = Cancel·la la selecció -annotationColorWhite = - .title = Blanc -annotationColorBlack = - .title = Negre -annotationColorRed = - .title = Vermell -annotationColorGreen = - .title = Verd -annotationColorBlue = - .title = Blau -annotationColorYellow = - .title = Groc -annotationColorPurple = - .title = Porpra -annotationColorSeaGreen = - .title = Verd oceà -annotationColorGrey = - .title = Gris -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Mida del text -# Values shown in text size selection dropdown -textSizeSmall = Petita -textSizeMedium = Mitjana -textSizeLarge = Grossa -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirma - .title = Confirma -textToolCancelButton = Cancel·la - .title = Cancel·la -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hola - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Hi ha hagut un problema -copyImageErrorMessage = No s'ha pogut copiar la captura al porta-retalls. - -## Settings Page - -settingsDisconnectButton = Desconnecta - .title = Desconnecta -settingsGuestAccountMessage = Compte de convidat -settingsSignInButton = Inicia la sessió - .title = Inicia la sessió -SettingsPageHeader = Paràmetres del Firefox Screenshots -settingsFirefoxAccountSubHeader = Compte del Firefox -settingsClosePreferences = - .title = Tanca les preferències -settingsFxaDisconnectAlertMessage = Esteu segur que voleu desconnectar aquest dispositiu del vostre compte del Firefox? -settingsFxaDisconnectDescription = Si tanqueu la sessió, haureu de tornar a iniciar-la per accedir a les vostres captures de pantalla. -settingsFxaConnectDescription = Podeu iniciar la sessió per accedir a les vostres captures de pantalla en tots els dispositius. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = S'ha produït un error en suprimir la captura: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Les meves captures: s'està cercant { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = S'ha produït un error en generar la pàgina: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Cerca en les meves captures -shotIndexPageNoShotsMessage = No hi ha cap captura desada. -shotIndexPageNoShotsInvitation = Endavant, feu-ne algunes. -shotIndexPageLookingForShots = S'estan cercant les vostres captures… -shotIndexPageNoSearchResultsIntro = Mmm -shotIndexPageNoSearchResults = No s'ha trobat cap captura que coincideixi amb la cerca. -shotIndexPageMyShotsButton = - .title = Les meves captures -shotIndexPageClearSearchButton = - .title = Esborra la cerca -shotIndexPageConfirmShotDelete = Voleu suprimir aquesta captura? -shotIndexPagePreviousPage = - .title = Pàgina anterior -shotIndexPageNextPage = - .title = Pàgina següent -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Aquesta no és una captura preferida i caducarà -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Aquesta és una captura favorita i no caduca -shotIndexSyncedShot = - .title = Captura feta en un altre dispositiu -shotIndexAlertErrorFavoriteShot = S'ha produït un error en actualitzar l'estat de la captura - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Segur que voleu suprimir aquesta captura? -shotDeleteCancel = Cancel·la - .title = Cancel·la -shotDeleteConfirm = Suprimeix - .title = Suprimeix - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Mètriques del Firefox Screenshots -metricsPageTotalsQueryTitle = Totals -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Resum del Firefox Screenshots -metricsPageTotalsQueryDevices = Dispositius registrats totals -metricsPageTotalsQueryActiveShots = Captures actives -metricsPageTotalsQueryExpiredShots = Caducades (però recuperables) -metricsPageTotalsQueryExpiredDeletedShots = Caducades (i suprimides) -metricsPageShotsQueryTitle = Captures per dia -metricsPageShotsQueryDescription = Nombre de captures creades cada dia (en els darrers 30 dies) -metricsPageShotsQueryCount = Nombre de captures -metricsPageShotsQueryDay = Dia -metricsPageUsersQueryTitle = Usuaris per dia -metricsPageUsersQueryDescription = Nombre d'usuaris que han creat com a mínim una captura, per dia (darrers 30 dies) -metricsPageUsersQueryCount = Nombre d'usuaris -metricsPageUsersQueryDay = Dia -metricsPageUserShotsQueryTitle = Nombre de captures per usuari -metricsPageUserShotsQueryDescription = El nombre d'usuaris que tenen aproximadament N captures en total -metricsPageUserShotsQueryCount = Nombre d'usuaris -metricsPageUserShotsQueryShots = Nombre aproximat de captures actives (no caducades) -metricsPageRetentionQueryTitle = Retenció per setmana -metricsPageRetentionQueryDescription = Nombre de dies des de la primera captura d'un usuari fins a la captura més recent, agrupats per setmana d'inici -metricsPageRetentionQueryUsers = Nombre d'usuaris -metricsPageRetentionQueryDays = Dies transcorreguts entre la primera i la darrera captura de l'usuari -metricsPageRetentionQueryFirstWeek = Setmana en què l'usuari va crear la primera captura -metricsPageTotalRetentionQueryTitle = Retenció total -metricsPageTotalRetentionQueryDescription = Període de temps durant el qual els usuaris han estat fent captures, agrupat per setmana -metricsPageTotalRetentionQueryUsers = Nombre d'usuaris -metricsPageTotalRetentionQueryDays = Dies que l'usuari ha estat fent captures -metricsPageVersionQueryTitle = Versió del complement -metricsPageVersionQueryDescription = La versió del complement que s'ha utilitzat en iniciar la sessió, en els darrers 14 dies -metricsPageVersionQueryUsers = Nombre d'usuaris que inicien la sessió -metricsPageVersionQueryVersion = Versió del complement -metricsPageVersionQueryLastSeen = Dia -metricsPageHeader = Mètriques -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Data de generació: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (temps de base de dades: { $time } ms) diff --git a/locales/cak/server.ftl b/locales/cak/server.ftl deleted file mode 100644 index e8779215fa..0000000000 --- a/locales/cak/server.ftl +++ /dev/null @@ -1,350 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Taq Nuwachib'al -gHomeLink = Tikirib'äl -gNoShots = - .alt = Majun wachib'äl xilitäj - -## Header - -buttonSettings = - .title = Taq nuk'ulem -buttonSignIn = - .title = Titikirisäx molojri'ïl -onboardingPromoSigninButton = Titikirisäx molojri'ïl - .title = Titikirisäx molojri'ïl - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Taq ojqanem -footerLinkPrivacy = Rutzijol Ichinanem -footerLinkFaqs = Junelïk taq k'utunïk -footerLinkDMCA = Rutzijol IP K'ayewal -footerLinkDiscourse = Titaq Na'oj -footerLinkRemoveAllData = Ke'elesäx Konojel ri taq Tzij - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Tajin nitz'uk { $title } -creatingPageTitleDefault = ruxaq -creatingPageWaitMessage = Tajin niyak ri awachib'al... - -## Home page - -homePageDescription = - .content = Na'onel chapoj wachib'äl chaqon pa ri okik'amaya'l. Nachap, nayak chuqa' nakomonij ri chapoj ruwäch toq tajin atokinäq pa Ajk'amaya'l tajin nawokisaj Firefox. -homePageButtonMyShots = Jät pa ri taq nuwachib'al -homePageTeaser = Ninaqajan yan pe... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Sipan Ruqasaxik -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Achike rub'eyal nisamäj Firefox Chapoj Wachib'äl -homePageGetStartedTitle = Titikirisäx -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Ticha' ruwachaj Chapoj Wachib'äl pa ri ruxaq ruk'utsamaj b'anoj pa rukajtz'ik ochochib'äl, ri ruk'utsamaj Chapoj Wachib'äl xtib'ewachin pe ajsik rutzuwäch okik'amaya'l. -homePageCaptureRegion = Tachapa' jun Ruwa -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Tapitz'a' chuqa' taqirirej richin nacha' ri k'ojlib'äl nawajo' nachäp. O xa xe taya' ri retal ch'oy pa ruwi' — ja ri Chapoj Wachib'äl xticha'o ri k'ojlib'äl chawäch. ¿La jeb'ël ri natz'ët? Tacha' Tiyak richin yatok pa chapoj awachib'al pa k'amab'ey o ri xulan ch'ab' richin nayäk qa pan akematz'ib'. -homePageCapturePage = Tichap ruwachib'al jun Ruxaq -homePageCapturePageDescription = Ke'okisäx ri ajsik ajkiq'a' taq pitz'b'äl richin ye'achäp chijun ruxaq. Ri Tiyak Wachel pitz'b'äl xtuchäp ri k'ojlem; man k'atzinel ta yatel richin natz'ët, chuqa' ri Tiyak Tz'aqät Ruxaq ronojel xtuchäq pa ri ruxaq. -homePageLegalLink = Taqanel -homePagePrivacyLink = Ichinanem -homePageTermsLink = Taq Ojqanem -homePageCookiesLink = Taq Kaxlanwey - -## Leave Screenshots page - -leavePageRemoveAllData = Ke'elesäx el Konojel ri Taq Tzij -leavePageErrorGeneric = Xk'ulwachitäj jun sachoj -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Re re' xkeruyüj el konojel taq rutzij Firefox Chapoj Awachib'al. -leavePageButtonProceed = Tib'anatäj -leavePageButtonCancel = Tiq'at -leavePageDeleted = ¡Xeyuj konojel ri taq chapoj awachib'al! - -## Not Found page - -notFoundPageTitle = Man Xilitäj ta ri Ruxaq -notFoundPageIntro = Uy. -notFoundPageDescription = Man xilitäj ta ruxaq - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Chapoj Wachib'äl: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Xsach toq nuyäk ruq'ijul -shotPageAlertErrorDeletingShot = Xsach toq nuyüj wachib'äl -shotPageAlertErrorUpdatingTitle = Xsach toq nuyäk b'i'aj -shotPageConfirmDelete = ¿La kan nawajo' nayüj el jumul re chapoj re? -shotPageShareButton = - .title = Tikomonïx -shotPageCopyButton = - .title = Tiwachib'ëx wachib'äl pa molwuj -shotPageCopyActionLabel = Tiwachib'ëx -shotPageCopied = Xwachib'ëx -shotPageShareFacebook = - .title = Tikomonïx pa Facebook -shotPageShareTwitter = - .title = Tikomonïx pa Twitter -shotPageSharePinterest = - .title = Tikomonïx pa Pinterest -shotPageShareEmail = - .title = Tikomonïx ximonel pa taqoya'l -shotPageShareLink = Tik'ul jun komonel ruximonel re wachib'äl re': -shotPagePrivacyMessage = Rik'in re ximonel re' xab'achike nitikïr nitz'eto re wachib'äl re'. -shotPageCopyImageText = - .label = Tiwachib'ëx rutzij wachib'äl -shotPageConfirmDeletion = ¿La kan nawajo' nayüj el re wachib'äl re'? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = We majun nab'än, xtiyujtäj el re chapoj re' . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = tichojmirisäx k'a { $date } -shotPageExpiredMessage = Xk'is ruq'ijul re wachib'äl re'. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Pa re ruxaq re' Xtikirisäx pe runuk'ik: -shotPageDeleteButton = - .title = Tiyuj re wachib'äl re' -shotPageDownloadShot = - .title = Tiqasäx -shotPageEditButton = - .title = Tinuk' re wachib'äl re' -shotPageBackToHomeButton = - .title = Tikirib'äl ruxaq -shotPageDMCAMessage = Man wachel ta chik re wachib'äl re' ruma juley winaqi' nikich'ojij jun na'owinäq ichinem. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Tataqa' { $dmca } richin nak'utuj juley rutzijol. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = We jutaqil yech'ojin chi kij ri taq Awachib'al, yojtikïr niqaq'ät awokem pa Firefox Chapoj Wachib'äl. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Tatz'aqatisaj ri URL richin re wachib'äl re' pan ataqoya'l: { $url } -shotPageKeepFor = ¿Janipe q'ij nik'oje' re wachib'äl re'? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Ticha' q'ijul -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Mek'isel ∞ -shotPageKeepTenMinutes = 10 Ch'utiramaj -shotPageKeepOneHour = 1 Ramaj -shotPageKeepOneDay = 1 Q'ij -shotPageKeepOneWeek = 1 Wuqq'ij -shotPageKeepTwoWeeks = 2 Wuqq'ij -shotPageKeepOneMonth = 1 Ik' -shotPageSaveExpiration = tiyak -shotPageCancelExpiration = tiq'at -shotPageDoesNotExpire = man k'ixel ta -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = k'isel -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = xk'is -timeDiffJustNow = wakami -timeDiffMinutesAgo = - { $number -> - [one] k'o kan 1 ch'utiramaj - *[other] { $number } kan ch'utiramaj - } -timeDiffHoursAgo = - { $number -> - [one] k'o kan 1 ramaj - *[other] { $number } kan ramaj - } -timeDiffDaysAgo = - { $number -> - [one] iwir - *[other] { $number } kan taq q'ij - } -timeDiffFutureSeconds = pa jujun nich'ramaj -timeDiffFutureMinutes = - { $number -> - [one] pa 1 ch'utiramaj - *[other] pa { $number } taq ramaj - } -timeDiffFutureHours = - { $number -> - [one] pa 1 ramaj - *[other] pa { $number } taq ramaj - } -timeDiffFutureDays = - { $number -> - [one] chwa'q - *[other] pa { $number } taq q'ij - } -errorThirdPartyCookiesEnabled = We xawelesaj re chapoj re' chuqa' man yatikïr ta nayüj el, rik'in jub'a' k'o chi ye'achüp jub'a' ri taq kikaxlanwey aj rox winäq pa ri rajowab'al okik'amaya'l. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = ¡Tatz'ib'aj Ch'utitzijol! -promoMessage = Ri taq rusamajib'al k'exon taq nuk'uj nuya' q'ij chawe yaqupin, naya' ruq'ij chuqa' natz'aqatisaj rucholajem tzij pa ri chapoj awäch. -promoLink = Ke'atojtob'ej -promoCloseButton = - .title = Titz'apïx rutzijol - -## Annotations - -annotationPenButton = - .title = Tz'ib'ab'äl -annotationHighlighterButton = - .title = Tz'etöy -annotationUndoButton = - .title = Titzolïx -annotationRedoButton = - .title = Tikamulüx -annotationTextButton = - .title = Titz'aqatisäx rucholajem tzij -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Tijosq'ïx -annotationCropButton = - .title = Tiqupïx -annotationSaveEditButton = Tiyak - .title = Tiyak nuk'uj -annotationCancelEditButton = Tiq'at - .title = Tiq'at nuk'uj -annotationCropConfirmButton = Tijikib'äx - .title = Tijikib'äx cha'oj -annotationCropCancelButton = Tiq'at - .title = Tiq'at cha'oj -annotationColorWhite = - .title = Säq -annotationColorBlack = - .title = Q'ëq -annotationColorRed = - .title = Käq -annotationColorGreen = - .title = Räx -annotationColorBlue = - .title = Xar -annotationColorYellow = - .title = Q'än -annotationColorPurple = - .title = Purpura' -annotationColorSeaGreen = - .title = Ruraxal Palow -annotationColorGrey = - .title = Chaj -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Runimilem rucholajem tzij -# Values shown in text size selection dropdown -textSizeSmall = Ko'öl -textSizeMedium = Loman -textSizeLarge = Nïm -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Tijikib'äx - .title = Tijikib'äx -textToolCancelButton = Tiq'at - .title = Tiq'at -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Achike ab'anon - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = K'o itzel xub'än - -## Settings Page - -settingsDisconnectButton = Tichup - .title = Tichup -settingsGuestAccountMessage = Rub'i' Rutaqoya'l Peyon -settingsSignInButton = Titikirisäx molojri'ïl - .title = Titikirisäx molojri'ïl -SettingsPageHeader = Taq Runuk'ulem Firefox Screenshots -settingsFirefoxAccountSubHeader = Rub'i' Rutaqoya'l Firefox -settingsClosePreferences = - .title = Ketz'apïx taq ajowanïk - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Xsach toq nuyüj ri wachib'äl: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Taq nuwachib'al: Tikanöx { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Ruxaq richin kitz'etik taq sachoj: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Kekanöx taq nuwachib'al -shotIndexPageNoShotsMessage = Majun wachib'äl eyakon. -shotIndexPageNoShotsInvitation = Tatz'aqa' chi re, ke'anuk'u' jujun. -shotIndexPageLookingForShots = Tajin yekanöx ri taq awachib'al... -shotIndexPageNoSearchResultsIntro = Aaa -shotIndexPageNoSearchResults = Man yeqïl ta taq wachib'äl, achi'el ri nakanoj. -shotIndexPageMyShotsButton = - .title = Taq Nuwachib'al -shotIndexPageClearSearchButton = - .title = Tijosq'ïx kanoxïk -shotIndexPageConfirmShotDelete = ¿La niyuj re wachib'äl re'? -shotIndexPagePreviousPage = - .title = Chuwäch ruxaq -shotIndexPageNextPage = - .title = Jun chik ruxaq - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = ¿La kan nawajo' chi niyuj el re chapoj re'? -shotDeleteCancel = Tiq'at - .title = Tiq'at -shotDeleteConfirm = Tiyuj - .title = Tiyuj - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Chapoj Wachib'äl Tz'etnuk'ulem -metricsPageTotalsQueryTitle = Ronojel -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Ronojel kitz'etoj taq Chapoj Wachib'äl -metricsPageTotalsQueryDevices = Ronojel ri taq okisaxel etz'ib'an -metricsPageTotalsQueryActiveShots = Tzijïl taq wachib'äl -metricsPageTotalsQueryExpiredShots = Xk'is (po kolel) -metricsPageTotalsQueryExpiredDeletedShots = Xk'is (chuqa' xyuj) -metricsPageShotsQueryTitle = Taq wachib'äl chi Q'ij -metricsPageShotsQueryDescription = Kajlab'al taq wachib'äl xenuk' q'ij q'ij (ri 30 ruk'isib'äl taq q'ij) -metricsPageShotsQueryCount = Kajilab'al taq wachib'äl -metricsPageShotsQueryDay = Q'ij -metricsPageUsersQueryTitle = Winaqi' chi q'ij -metricsPageUsersQueryDescription = Kajilab'al winaqi' xkinük' jun wachib'äl pa jun q'ij (ruk'isib'äl 30 taq q'ij) -metricsPageUsersQueryCount = Kajilab'al winaqi' -metricsPageUsersQueryDay = Q'ij -metricsPageUserShotsQueryTitle = Kajilab'al taq Wachib'äl chi Winäq -metricsPageUserShotsQueryDescription = Ri Kajilab'al winaqi' k'o N ronojel taq kiwachib'al -metricsPageUserShotsQueryCount = Kajilab'al winaqi' -metricsPageUserShotsQueryShots = Retal Kajilab'al tzijïl (mek'isel) taq wachib'äl -metricsPageRetentionQueryTitle = Chaponïk chi Wuqq'ij -metricsPageRetentionQueryDescription = Kajilab'al q'ij achi'el ri nab'ey ruwachib'al k'a ri k'ak'a' ruwachib'al, etzob'ajin chi kitikirisaxik wuqq'ij -metricsPageRetentionQueryUsers = Kajilab'al winaqi' -metricsPageRetentionQueryDays = Taq q'ij rik'in ri nab'ey chuqa' k'ak'a' ruwachib'al winäq -metricsPageRetentionQueryFirstWeek = Wuqq'ij toq ri winäq nab'ey mul xutz'ük jun wachib'äl -metricsPageTotalRetentionQueryTitle = Ronojel Echapon -metricsPageTotalRetentionQueryDescription = Jampe' yan chi ekitz'ukun taq wachib'äl ri winaqi', tzob'ajin chi wuqq'ij -metricsPageTotalRetentionQueryUsers = Kajilab'al winaqi' -metricsPageTotalRetentionQueryDays = Taq q'ij ruchapon kitz'ukik taq wachib'äl ri winäq -metricsPageVersionQueryTitle = Ruwäch Tz'aqat -metricsPageVersionQueryDescription = Ri ruwäch tz'aqat okisan pa molojri'ïl, pa ri 14 ruk'isib'äl taq q'ij -metricsPageVersionQueryUsers = Janipe' winaqi' e'okinäq -metricsPageVersionQueryVersion = Ruwäch tz'aqat -metricsPageVersionQueryLastSeen = Q'ij -metricsPageHeader = Taq Tz'etnuk'ulem -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Tz'ukun pa: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (cholxe'eltzij q'ijul: { $time }ms) diff --git a/locales/crh/server.ftl b/locales/crh/server.ftl deleted file mode 100644 index 434563d0b0..0000000000 --- a/locales/crh/server.ftl +++ /dev/null @@ -1,52 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Körüntilerim -gHomeLink = Ev - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Şartlar - -## Creating page - - -## Home page - -homePageDownloadFirefoxTitle = Firefox -homePagePrivacyLink = Hususiyat -homePageTermsLink = Şartlar - -## Leave Screenshots page - -leavePageButtonProceed = Devam Et -leavePageButtonCancel = Vazgeç - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - -metricsPageVersionQueryTitle = Eklenti Sürümi -metricsPageVersionQueryVersion = Eklenti sürümi diff --git a/locales/cs/server.ftl b/locales/cs/server.ftl deleted file mode 100644 index 18fd6dba31..0000000000 --- a/locales/cs/server.ftl +++ /dev/null @@ -1,403 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mé snímky -gHomeLink = Domů -gNoShots = - .alt = Žádné snímky nenalezeny -gScreenshotsDescriptionServerless = Snímky stránek jdou i jednoduše. Zachyťte a stahuje obsah stránek přímo ve Firefoxu. - -## Header - -buttonSettings = - .title = Nastavení -buttonSignIn = - .title = Přihlásit se -screenshotsLogo = - .title = Domovská stránka -bannerSignIn = Pro přístup ke snímkům z jiných zařízení nebo jejich ukládání se prosím přihlaste nebo zaregistrujte. -bannerUpsell = { gScreenshotsDescription } Získat Firefox -shutdownWarning = Uloženým snímkům brzy vyprší platnost. Od července už služba Screenshots nebude nabízet možnost nahrávat snímky na internet. Své dosud nahrané snímky si můžete stáhnout na svůj počítač. -shutdownPageTitle = Screenshots čeká změna -shutdownPageDescription = Od června nebude služba Screenshots nadále nabízet online úložiště pro sdílení. Pokud chcete zachovat snímky nahrané ve vaší knihovně, stáhněte si je jednotlivě nebo jako kompletní zálohu. Děkujeme za používání této funkce a omlouváme se za případné nepříjemnosti. -shutdownPageContinue = Doufáme, že si i nadále budete užívat pořizování snímků jako doposud. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Co je nového ve Firefox Screenshots? -onboardingPromoMessage = Po přihlášení účtem Firefoxu: -onboardingPromoMessageListItem1 = Získáte přístup ke své knihovně ze všech zařízení -onboardingPromoMessageListItem2 = Můžete ukládat své oblíbené snímky navždy -onboardingPromoDismissButton = Zavřít - .title = Zavřít -onboardingPromoSigninButton = Přihlásit se - .title = Přihlásit se - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Podmínky -footerLinkPrivacy = Zásady ochrany osobních údajů -footerReportShot = Nahlásit snímek - .title = Nahlásit tento snímek jako spam, nebo jiný problém -footerLinkFaqs = Časté dotazy -footerLinkDMCA = Nahlásit zneužití IP adresy -footerLinkDiscourse = Váš názor -footerLinkRemoveAllData = Odstranit všechna data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Vytváření snímku { $title } -creatingPageTitleDefault = stránky -creatingPageWaitMessage = Ukládání vašeho snímku… - -## Home page - -homePageDescription = - .content = Intuitivní snímky stránek přímo v prohlížeči. Zachyťte, ukládejte a sdílejte snímky s Firefoxem během prohlížení. -homePageButtonMyShots = Přejít na mé snímky -homePageTeaser = Již brzy… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Stáhnout zdarma -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Jak služba Firefox Screenshots funguje -homePageGetStartedTitle = Jak začít -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = V adresním řádku v nabídce akcí stránky klepněte na pořízení snímku, a v horní částí okna prohlížeče se objeví nabídka služby Screenshots. -homePageCaptureRegion = Vytvořte snímek oblasti -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Stiskem tlačítka myši a tahem vyberete oblast stránky. A nebo jen najeďte myší — doplněk Screenshots pro vás oblast vybere sám. Líbí se vám to? Klikněte na tlačítko Uložit pro nahrání snímku na internet, nebo na šipku pro jeho stažené do počítače. -homePageCapturePage = Vytvořte snímek celé stránky -homePageCapturePageDescription = Použijte tlačítka v pravém horním rohu pro zachycení celé stránky. Tlačítko Uložit viditelnou oblast vybere část stránky, která se vejde na obrazovku a právě ji vidíte, kdežto Uložit celou stránku zachytí i to, co se na obrazovku nevešlo. -homePageDownloadCopy = Stáhnout nebo zkopírovat -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Funkce screenshots umožňuje zachycení a stažení nebo zkopírování výběru webové stránky rovnou do schránky. -homePageLegalLink = Právní informace -homePagePrivacyLink = Soukromí -homePageTermsLink = Podmínky -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Odstranit všechna data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Chcete-li smazat svůj účet, musíte mít nainstalovaný Firefox Screenshots nebo se přihlásit k účtu Firefoxu. -leavePageErrorGeneric = Nastala chyba -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Toto navždy smaže ze služby Firefox Screenshots všechna vaše data. -leavePageButtonProceed = Pokračovat -leavePageButtonCancel = Zrušit -leavePageDeleted = Všechny vaše snímky byly smazány! - -## Not Found page - -notFoundPageTitle = Stránka nebyla nalezena -notFoundPageIntro = Jejda. -notFoundPageDescription = Stránka nebyla nalezena. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Snímek: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Při ukládání platnosti snímku nastala chyba -shotPageAlertErrorDeletingShot = Při mazání snímku nastala chyba -shotPageAlertErrorUpdatingTitle = Při ukládání názvu nastala chyba -shotPageConfirmDelete = Opravdu chcete tento snímek navždy smazat? -shotPageShareButton = - .title = Sdílet -shotPageCopyButton = - .title = Zkopírovat do schránky -shotPageCopyActionLabel = Kopírovat -shotPageCopied = Zkopírováno -shotPageShareFacebook = - .title = Sdílet na Facebooku -shotPageShareTwitter = - .title = Sdílet na Twitteru -shotPageSharePinterest = - .title = Sdílet na Pinterest -shotPageShareEmail = - .title = Sdílet odkaz e-mailem -shotPageShareLink = Získat odkaz pro sdílení tohoto snímku: -shotPagePrivacyMessage = Na tento snímek se může podívat každý, kdo bude mít odkaz. -shotPageCopyImageText = - .label = Kopírovat text z obrázku -shotPageConfirmDeletion = Opravdu chcete tento snímek navždy smazat? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Pokud nic neuděláte, tento snímek bude navždy smazán . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = obnovit do { $date } -shotPageExpiredMessage = Platnost tohoto snímku vypršela. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Zde je stránka, kde byl snímek pořízen: -shotPageDeleteButton = - .title = Smazat tento snímek -shotPageDownloadShot = - .title = Stáhnout -shotPageEditButton = - .title = Upravit tento obrázek -shotPagefavoriteButton = - .title = Označit snímek jako oblíbený -shotPageBackToHomeButton = - .title = Domovská stránka -shotPageAllShotsButton = - .title = Všechny snímky -shotPageScreenshotsDescriptionServerless = Snímky stránek jdou i jednoduše. Zachyťte a stahuje obsah stránek přímo ve Firefoxu. -shotPageDMCAMessage = Tento snímek již není dostupný z důvodu uplatnění nároku na duševní vlastnictví třetí strany. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Další informace si můžete vyžádat e-mailem na { $dmca }. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Pokud budou na více vašich snímku uplatňovány nároky na duševní vlastnictví, může dojít k zablokování vašeho přístupu ke službě Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Uveďte prosím v e-mailu URL adresu tohoto snímku: { $url } -shotPageKeepFor = Jak dlouho má být tento snímek uložen? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Vyberte čas -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Navždy ∞ -shotPageKeepTenMinutes = 10 minut -shotPageKeepOneHour = 1 hodinu -shotPageKeepOneDay = 1 den -shotPageKeepOneWeek = 1 týden -shotPageKeepTwoWeeks = 2 týdny -shotPageKeepOneMonth = 1 měsíc -shotPageSaveExpiration = uložit -shotPageCancelExpiration = zrušit -shotPageDoesNotExpire = bez omezené platnosti -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = vyprší -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = vypršel -timeDiffJustNow = právě teď -timeDiffMinutesAgo = - { $number -> - [one] před minutou - [few] před { $number } minutami - *[other] před { $number } minutami - } -timeDiffHoursAgo = - { $number -> - [one] před hodinou - [few] před { $number } hodinami - *[other] před { $number } hodinami - } -timeDiffDaysAgo = - { $number -> - [one] včera - [few] před { $number } dny - *[other] před { $number } dny - } -timeDiffFutureSeconds = za několik vteřin -timeDiffFutureMinutes = - { $number -> - [one] za minutu - [few] za { $number } minuty - *[other] za { $number } minut - } -timeDiffFutureHours = - { $number -> - [one] za hodinu - [few] za { $number } hodiny - *[other] za { $number } hodin - } -timeDiffFutureDays = - { $number -> - [one] zítra - [few] za { $number } dny - *[other] za { $number } dní - } -errorThirdPartyCookiesEnabled = Pokud jste pořídili tento snímek a nyní ho nemůžete smazat, dočasně v předvolbách svého prohlížeče povolte používání cookies třetích stran. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Napsat poznámku -promoMessage = Editační nástroje byly vylepšeny, takže s nimi můžete ořezávat snímky a zvýrazňovat nebo přidávat text. -promoLink = Vyzkoušet -promoCloseButton = - .title = Zavře oznámení - -## Annotations - -annotationPenButton = - .title = Pero -annotationHighlighterButton = - .title = Zvýrazňovač -annotationUndoButton = - .title = Vrátit zpět -annotationRedoButton = - .title = Znovu provést -annotationTextButton = - .title = Přidat text -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Smazat úpravy -annotationCropButton = - .title = Oříznout -annotationSaveEditButton = Uložit - .title = Uložit úpravy -annotationCancelEditButton = Zrušit - .title = Zrušit úpravy -annotationCropConfirmButton = Potvrdit - .title = Potvrdit výběr -annotationCropCancelButton = Zrušit - .title = Zrušit výběr -annotationColorWhite = - .title = Bílá -annotationColorBlack = - .title = Černá -annotationColorRed = - .title = Červená -annotationColorGreen = - .title = Zelená -annotationColorBlue = - .title = Modrá -annotationColorYellow = - .title = Žlutá -annotationColorPurple = - .title = Fialová -annotationColorSeaGreen = - .title = Mořská zeleň -annotationColorGrey = - .title = Šedá -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Velikost textu -# Values shown in text size selection dropdown -textSizeSmall = Malý -textSizeMedium = Střední -textSizeLarge = Velký -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Potvrdit - .title = Potvrdit -textToolCancelButton = Zrušit - .title = Zrušit -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Ahoj - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Nastala chyba -copyImageErrorMessage = Snímek se nepodařilo do schránky zkopírovat. - -## Settings Page - -settingsDisconnectButton = Odpojit - .title = Odpojit -settingsGuestAccountMessage = Účet pro hosta -settingsSignInButton = Přihlásit - .title = Přihlášení -SettingsPageHeader = Nastavení Firefox Screenshots -settingsFirefoxAccountSubHeader = Účet Firefoxu -settingsClosePreferences = - .title = Zavřít předvolby -settingsFxaDisconnectAlertMessage = Opravdu chcete toto zařízení odpojit od svého účtu Firefoxu? -settingsFxaDisconnectDescription = Pokud se nyní odhlásíte, pro opětovný přístup k vašim snímkům obrazovky bude nutné se znovu přihlásit. -settingsFxaConnectDescription = Pro přístup k vašim snímkům z kteréhokoliv zařízení se stačí přihlásit. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Při mazání snímku nastala chyba: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mé snímky: hledání { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Při zobrazování stránky nastala chyba: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Prohledat mé snímky -shotIndexPageNoShotsMessage = Žádné uložené snímky. -shotIndexPageNoShotsInvitation = Pojďme nějaké vytvořit. -shotIndexPageLookingForShots = Hledáme vaše snímky… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Nemůžeme najít žádné snímky, které by odpovídaly vašemu hledání. -shotIndexPageMyShotsButton = - .title = Mé snímky -shotIndexPageClearSearchButton = - .title = Zrušit hledání -shotIndexPageConfirmShotDelete = Smazat tento snímek? -shotIndexPagePreviousPage = - .title = Předchozí stránka -shotIndexPageNextPage = - .title = Další stránka -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Tento snímek není označený jako oblíbený a jeho platnost vyprší -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Tento snímek byl označen jako oblíbený a jeho platnost nevyprší -shotIndexSyncedShot = - .title = Snímek pořízený na jiném zařízení -shotIndexAlertErrorFavoriteShot = Při aktualizaci stavu oblíbeného snímku došlo k chybě - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Opravdu chcete tento snímek smazat? -shotDeleteCancel = Zrušit - .title = Zrušit -shotDeleteConfirm = Smazat - .title = Smazat - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Pro exportování klepněte na Soubor > Uložit stránku jako… a poté najdete své snímky ve složce { $folder }. - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metriky Firefox Screenshots -metricsPageTotalsQueryTitle = Celkem -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Přehled služby Screenshots -metricsPageTotalsQueryDevices = Celkový počet registrovaných zařízení -metricsPageTotalsQueryActiveShots = Aktivní snímky -metricsPageTotalsQueryExpiredShots = Vypršel (ale ještě lze obnovit) -metricsPageTotalsQueryExpiredDeletedShots = Vypršel (a byl smazán) -metricsPageShotsQueryTitle = Snímky podle dnů -metricsPageShotsQueryDescription = Počet snímků vytvořených každý den (za období 30 dnů) -metricsPageShotsQueryCount = Počet snímků -metricsPageShotsQueryDay = Den -metricsPageUsersQueryTitle = Uživatelé podle dnů -metricsPageUsersQueryDescription = Počet uživatelů, kteří vytvořili alespoň jeden snímek, podle dnů (za období 30 dnů) -metricsPageUsersQueryCount = Počet uživatelů -metricsPageUsersQueryDay = Den -metricsPageUserShotsQueryTitle = Počet snímků jednotlivých uživatelů -metricsPageUserShotsQueryDescription = Počet uživatelů, kteří mají celkem okolo N snímků -metricsPageUserShotsQueryCount = Počet uživatelů -metricsPageUserShotsQueryShots = Přibližný počet aktivních (platných) snímků -metricsPageRetentionQueryTitle = Míra stálého používání podle týdnů -metricsPageRetentionQueryDescription = Počet dnů od uživatelova prvního snímku po poslední snímek, seskupeno podle počátečního týdne -metricsPageRetentionQueryUsers = Počet uživatelů -metricsPageRetentionQueryDays = Počet dnů od uživatelova prvního snímku po poslední -metricsPageRetentionQueryFirstWeek = Týden, kdy uživatel vytvořil první snímek -metricsPageTotalRetentionQueryTitle = Celková míra stálého používání -metricsPageTotalRetentionQueryDescription = Doba po kterou uživatelů vytvářeli snímky, seskupeno podle týdne -metricsPageTotalRetentionQueryUsers = Počet uživatelů -metricsPageTotalRetentionQueryDays = Počet dnů, kdy uživatel vytvářel snímky -metricsPageVersionQueryTitle = Verze doplňku -metricsPageVersionQueryDescription = Verze doplňku používaná při přihlášení v posledních 14 dnech -metricsPageVersionQueryUsers = Počet přihlášení uživatelů -metricsPageVersionQueryVersion = Verze doplňku -metricsPageVersionQueryLastSeen = Den -metricsPageHeader = Metriky -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Vygenerováno: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (čas databáze: { $time } ms) diff --git a/locales/cy/server.ftl b/locales/cy/server.ftl deleted file mode 100644 index 8286d48dec..0000000000 --- a/locales/cy/server.ftl +++ /dev/null @@ -1,421 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Fy Lluniau -gHomeLink = Cartrefi -gNoShots = - .alt = Heb ganfod lluniau -gScreenshotsDescriptionServerless = Lluniau sgrin syml. Cipio a llwytho i lawr lluniau sgrin heb adael Firefox. - -## Header - -buttonSettings = - .title = Gosodiadau -buttonSignIn = - .title = Mewngofnodi -screenshotsLogo = - .title = Cartref Screenshots -bannerSignIn = Mewngofnodwch neu ymunwch i gael mynediad at eich lluniau ar draws dyfeisiau a chadw eich ffefrynnau am byth. -bannerUpsell = { gScreenshotsDescription } Defnyddiwch Firefox -shutdownWarning = Mae lluniau sgrin wedi'u cadw yn dod i ben cyn bo hir. O fis Mehefin, fydd Screenshots ddim yn cynnig cadw ar-lein bellach. Eisiau cadw lluniau o'ch llyfrgell? Llwythwch nhw i lawr i'ch cyfrifiadur. -shutdownPageTitle = Mae Screenshots yn newid -shutdownPageDescription = O fis Mehefin, ni fydd Screenshots yn cynnig storio ar-lein. Eisiau cadw'ch lluniau o'ch llyfrgell. Llwythwch y lluniau i lawr yn unigol neu fel swp. Diolch am ddefnyddio'r nodwedd hon ac rydym yn ymddiheuro am unrhyw anghyfleuster. -shutdownPageContinue = Rydym yn gobeithio y byddwch yn parhau i ddefnyddio Screenshots i gipio, copïo a llwytho lluniau i lawr. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Beth sy'n newydd gyda Firefox Screenshots? -onboardingPromoMessage = Nawr, mewngofnodwch i Screenshots gyda Chyfrif Firefox a gwneud mwy: -onboardingPromoMessageListItem1 = Cael mynediad i'ch llyfrgell ar eich holl ddyfeisiau -onboardingPromoMessageListItem2 = Cadwch eich hoff luniau am byth -onboardingPromoDismissButton = Cau - .title = Cau -onboardingPromoSigninButton = Mewngofnodi - .title = Mewngofnodi - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Amodau -footerLinkPrivacy = Hysbysiad Preifatrwydd -footerReportShot = Adrodd am Lun - .title = Adrodd y llun oherwydd camdriniaeth, sbam neu broblem arall -footerLinkFaqs = Cwestiynau Cyffredin -footerLinkDMCA = Adrodd ar Torri'r IP -footerLinkDiscourse = Rhoi Adborth -footerLinkRemoveAllData = Tynnu'r Holl Ddata - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creu { $title } -creatingPageTitleDefault = tudalen -creatingPageWaitMessage = Cadw eich llun… - -## Home page - -homePageDescription = - .content = Lluniau sgrin hawdd y syth o ganol y porwr. Cipio, cadw a rhannu lluniau sgrin wrth i chi bori'r We gyda Firefox. -homePageButtonMyShots = Mynd i Fy Lluniau -homePageTeaser = Yn dod cyn bo hir... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Ar Gael am Ddim -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Sut mae Firefox Screenshots yn gweithio -homePageGetStartedTitle = Cychwyn Arni -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Dewiswch eicon Screenshots o'r ddewislen gweithredoedd tudalen tyn y bar cyfeiriad a bydd dewislen Screenshots yn ymddangos ar frig ffenestr eich porwr. -homePageCaptureRegion = Cipio Ardal -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Cliciwch a llusgo i ddewis ardal i'w gipio. Neu hofran a chlicio - bydd Screenshots yn dewis yr ardal i chi. Hoffi beth welwch chi? Dewiswch Cadw i gael mynediad i'ch llun ar-lein neu'r saeth i lawr i'w lwytho i lawr i'ch cyfrifiadur. -homePageCapturePage = Cipio Tudalen -homePageCapturePageDescription = Defnyddiwch y botymau ar y brig de i gipio tudalennau cyfan. Bydd y botwm Cadw'r Gweledol y cipio'r ardal rydych y gallu ei weld heb sgrolio ac mae Cadw'r Dudalen Gyfan yn cipio popeth sydd ar y dudalen. -homePageDownloadCopy = Llwytho i Lawr neu Gopïo -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Cymrwch y llun gorau. Mae Screenshots yn gadael i chi lwytho i lawr eich dewis neu ei gopïo i'ch clipfwrdd. -homePageLegalLink = Cyfreithiol -homePagePrivacyLink = Preifatrwydd -homePageTermsLink = Amodau -homePageCookiesLink = Cwcis - -## Leave Screenshots page - -leavePageRemoveAllData = Tynnu'r Holl Ddata -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Er mwyn dileu eich cyfrif rhaid eich bod â Firefox Screenshots wedi ei osod neu fod wedi mewngofnodi i'ch Cyfrif Firefox. -leavePageErrorGeneric = Digwyddodd gwall -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Bydd hyn yn dileu'n barhaol eich holl data Firefox Screenshots. -leavePageButtonProceed = Parhau -leavePageButtonCancel = Diddymu -leavePageDeleted = Mae eich holl luniau wedi eu dileu! - -## Not Found page - -notFoundPageTitle = Heb Ganfod y Dudalen -notFoundPageIntro = Wps. -notFoundPageDescription = Heb ganfod y dudalen - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Llun Sgrin: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Gwall cofio'r cyfnod dod i ben -shotPageAlertErrorDeletingShot = Gwall dileu'r llun -shotPageAlertErrorUpdatingTitle = Gwall cadw teitl -shotPageConfirmDelete = Ydych chi'n siŵr eich bod eisiau dileu'r llun yn barhaol? -shotPageShareButton = - .title = Cadw -shotPageCopyButton = - .title = Copïo'r ddelwedd i'r clipfwrdd -shotPageCopyActionLabel = Copïo -shotPageCopied = Copiwyd -shotPageShareFacebook = - .title = Rhannu ar Facebook -shotPageShareTwitter = - .title = Rhannu ar Twitter -shotPageSharePinterest = - .title = Rhannu ar Pininterest -shotPageShareEmail = - .title = Rhannu dolen drwy e-bost -shotPageShareLink = Estyn dolen i'w rannu ar gyfer y llun: -shotPagePrivacyMessage = Mae unrhyw un sydd â'r ddolen yn gallu gweld y llun. -shotPageCopyImageText = - .label = Copïo testun y ddelwedd -shotPageConfirmDeletion = Ydych chi'n siŵr eich bod am ddileu'r llun yn barhaol? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Os wnewch chi ddim byd, bydd y llun yn cael ei ddileu'n barhaol . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = adfer tan { $date } -shotPageExpiredMessage = Mae'r llun wedi dod i ben. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Dyma'r dudalen lle gafodd ei greu'n wreiddiol: -shotPageDeleteButton = - .title = Dileu'r llun -shotPageDownloadShot = - .title = Llwytho i Lawr -shotPageEditButton = - .title = Golygu'r ddelwedd hon -shotPagefavoriteButton = - .title = Ffefrynnu'r llun yma -shotPageBackToHomeButton = - .title = Tudalen Cartref -shotPageAllShotsButton = - .title = Pob Llun -shotPageScreenshotsDescriptionServerless = Lluniau sgrin syml. Cipio a llwytho i lawr lluniau sgrin heb adael Firefox. -shotPageDMCAMessage = Nid yw'r llun ar gael bellach oherwydd cais eiddo deallusol trydydd parti. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = E-bostiwch { $dmca } i ofyn am rhagor o wybodaeth. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Os yw eich lluniau'n destun ceisiadau lluosog, mae'n bosibl i ni atal eich mynediad i Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Cofiwch gynnwys URL y llun un eich e-bost: { $url } -shotPageKeepFor = Pa mor hir dylwn ni gadw'r llun -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Dewis cyfnod -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Am byth ∞ -shotPageKeepTenMinutes = 10 Munud -shotPageKeepOneHour = Awr -shotPageKeepOneDay = Diwrnod -shotPageKeepOneWeek = Wythnos -shotPageKeepTwoWeeks = Pythefnos -shotPageKeepOneMonth = Mis -shotPageSaveExpiration = cadw -shotPageCancelExpiration = diddymu -shotPageDoesNotExpire = nid yw'n dod i ben -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = daw i ben -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = wedi dod i ben -timeDiffJustNow = nawr -timeDiffMinutesAgo = - { $number -> - [zero] { $number } munud yn ôl - [one] 1 munud yn ôl - [two] { $number } funud yn ôl - [few] { $number } munud yn ôl - [many] { $number } munud yn ôl - *[other] { $number } munud yn ôl - } -timeDiffHoursAgo = - { $number -> - [zero] { $number } awr yn ôl - [one] awr yn ôl - [two] { $number } awr yn ôl - [few] { $number } awr yn ôl - [many] { $number } awr yn ôl - *[other] { $number } awr yn ôl - } -timeDiffDaysAgo = - { $number -> - [zero] { $number } diwrnod yn ôl - [one] ddoe - [two] { $number } diwrnod yn ôl - [few] { $number } diwrnod yn ôl - [many] { $number } diwrnod yn ôl - *[other] { $number } diwrnod yn ôl - } -timeDiffFutureSeconds = ymhen ychydig eiliadau -timeDiffFutureMinutes = - { $number -> - [zero] ymhen { $number } munud - [one] ymhen munud - [two] ymhen { $number } funud - [few] ymhen { $number } munud - [many] ymhen { $number } munud - *[other] ymhen { $number } munud - } -timeDiffFutureHours = - { $number -> - [zero] ymhen { $number } awr - [one] ymhen awr - [two] ymhen { $number } awr - [few] ymhen { $number } awr - [many] ymhen { $number } awr - *[other] ymhen { $number } awr - } -timeDiffFutureDays = - { $number -> - [zero] ymhen { $number } diwrnod - [one] yfory - [two] ymhen { $number } ddiwrnod - [few] ymhen { $number } diwrnod - [many] ymhen { $number } diwrnod - *[other] ymhen { $number } diwrnod - } -errorThirdPartyCookiesEnabled = Os wnaethoch chi gymryd y llun hwn, ac yn methu ei dileu, efallai y bydd angen i chi alluogi, dros dro, cwcis trydydd parti o fewn dewisiadau eich porwr. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Edrychwch! -promoMessage = Mae'r offer golygu diweddaraf yn gadael i chi docio, amlygu ac ychwanegu testun i'ch llun. -promoLink = Rhowch gynnig arnyn nhw -promoCloseButton = - .title = Cau'r hysbysiad - -## Annotations - -annotationPenButton = - .title = Pin -annotationHighlighterButton = - .title = Amlygwr -annotationUndoButton = - .title = Dad-wneud -annotationRedoButton = - .title = Ailwneud -annotationTextButton = - .title = Ychwanegu testun -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Clir -annotationCropButton = - .title = Tocio -annotationSaveEditButton = Cadw - .title = Cadw'r golygu -annotationCancelEditButton = Diddymu - .title = Diddymu'r golygu -annotationCropConfirmButton = Cadarnhau - .title = Cadarnhau'r dewis -annotationCropCancelButton = Diddymu - .title = Diddymu'r dewis -annotationColorWhite = - .title = Gwyn -annotationColorBlack = - .title = Du -annotationColorRed = - .title = Coch -annotationColorGreen = - .title = Gwyrdd -annotationColorBlue = - .title = Glas -annotationColorYellow = - .title = Melyn -annotationColorPurple = - .title = Porffor -annotationColorSeaGreen = - .title = Gwyrdd y Môr -annotationColorGrey = - .title = Llwyd -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Maint testun -# Values shown in text size selection dropdown -textSizeSmall = Bach -textSizeMedium = Canolig -textSizeLarge = Mawr -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Cadarnhau - .title = Cadarnhau -textToolCancelButton = Diddymu - .title = Diddymu -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Helo - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Aeth rhywbeth o'i le -copyImageErrorMessage = Methu copïo eich llun i'r clipfwrdd - -## Settings Page - -settingsDisconnectButton = Datgysylltu - .title = Datgysylltu -settingsGuestAccountMessage = Cyfrif Gwestai -settingsSignInButton = Mewngofnodi - .title = Mewngofnodi -SettingsPageHeader = Gosodiadau Firefox Screenshots -settingsFirefoxAccountSubHeader = Cyfrif Firefox -settingsClosePreferences = - .title = Cau'r dewisiadau -settingsFxaDisconnectAlertMessage = Ydych chi'n siŵr eich bod am ddatgysylltu'r ddyfais hon oddi wrth eich Cyfrif Firefox? -settingsFxaDisconnectDescription = Os byddwch yn allgofnodi, bydd angen i chi fewngofnodi eto i adennill mynediad i'ch lluniau sgrin. -settingsFxaConnectDescription = Gallwch fewngofnodi i gael mynediad i'ch lluniau ar draws dyfeisiau. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Gwall wrth ddileu llun: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Fy Lluniau: chwilio am { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Gwall wrth gyflwyno'r dudalen: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Chwilio fy lluniau -shotIndexPageNoShotsMessage = Dim lluniau wedi eu cadw -shotIndexPageNoShotsInvitation = Croeso i chi greu lluniau. -shotIndexPageLookingForShots = Chwilio am eich lluniau... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Methu canfod lluniau sy'n cyd-fynd â'ch chwilio. -shotIndexPageMyShotsButton = - .title = Fy Lluniau -shotIndexPageClearSearchButton = - .title = Clirio'r chwilio -shotIndexPageConfirmShotDelete = Dileu'r llun? -shotIndexPagePreviousPage = - .title = Tudalen flaenorol -shotIndexPageNextPage = - .title = Tudalen nesaf -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Nid yw hwn yn hoff lun a bydd yn dod i ben -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Mae hwn yn llun ffefryn ac nid yw'n dod i ben -shotIndexSyncedShot = - .title = Llun wedi ei dynnu gan ddyfais arall -shotIndexAlertErrorFavoriteShot = Gwall wrth ddiweddaru statws hoff lun - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Ydych chi'n siŵr eich bod eisiau dileu'r llun yma? -shotDeleteCancel = Diddymu - .title = Diddymu -shotDeleteConfirm = Dileu - .title = Dileu - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = I allforio: defnyddiwch Ffeil> Cadw Tudalen Fel... a bydd eich lluniau sgrin yn y ffolder { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metrics Firefox Screenshot -metricsPageTotalsQueryTitle = Cyfanswm -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Trosolwg o'r Lluniau Sgrin -metricsPageTotalsQueryDevices = Cyfanswm y dyfeisiau wedi eu cofrestru -metricsPageTotalsQueryActiveShots = Lluniau gweithredol -metricsPageTotalsQueryExpiredShots = Wedi dod y ben (ond adferadwy) -metricsPageTotalsQueryExpiredDeletedShots = Wedi dod i ben (ac wedi eu dileu) -metricsPageShotsQueryTitle = Lluniau fesul Diwrnod -metricsPageShotsQueryDescription = Y nifer o luniau crëwyd bob diwrnod ( y 30 diwrnod diwethaf) -metricsPageShotsQueryCount = Nifer y lluniau -metricsPageShotsQueryDay = Diwrnod -metricsPageUsersQueryTitle = Defnyddwyr fesul Diwrnod -metricsPageUsersQueryDescription = Y nifer y defnyddwyr sydd wedi creu o leiaf un llun, fesul diwrnod (30 diwrnod diwethaf) -metricsPageUsersQueryCount = Y nifer y defnyddwyr -metricsPageUsersQueryDay = Diwrnod -metricsPageUserShotsQueryTitle = Y nifer y Lluniau fesul Defnyddiwr -metricsPageUserShotsQueryDescription = Y nifer y defnyddwyr sydd â cyfanswm o N llun -metricsPageUserShotsQueryCount = Y nifer o ddefnyddwyr -metricsPageUserShotsQueryShots = Y niferoedd yn fras o luniau (heb ddod i ben) gweithredol -metricsPageRetentionQueryTitle = Wedi eu cadw yn ôl Wythnos -metricsPageRetentionQueryDescription = Y nifer o ddyddiau o lun cyntaf y defnyddiwr i'r llun diweddaraf, wedi eu grwpio yn ôl wythnos yn cychwyn -metricsPageRetentionQueryUsers = Y nifer o ddefnyddwyr -metricsPageRetentionQueryDays = Diwrnodau o lun cyntaf y defnyddiwr i'r diweddaraf -metricsPageRetentionQueryFirstWeek = Yr wythnos creodd y defnyddiwr lun -metricsPageTotalRetentionQueryTitle = Y Cyfan wedi eu Cadw -metricsPageTotalRetentionQueryDescription = Hyd y cyfnod y mae'r defnyddwyr wedi bod yn creu lluniau, yn ôl wythnos -metricsPageTotalRetentionQueryUsers = Yn ôl nifer y defnyddwyr -metricsPageTotalRetentionQueryDays = Yn ôl y diwrnodau y mae'r defnyddiwr wedi bod yn creu lluniau -metricsPageVersionQueryTitle = Fersiwn yr Ychwanegyn -metricsPageVersionQueryDescription = Y fersiwn sydd wedi cael ei ddefnyddio yn ystod y mewngofnodiad, yn ystod yr 14 diwrnod diwethaf -metricsPageVersionQueryUsers = Y nifer o ddefnyddwyr sydd wedi eu mewngofnodi -metricsPageVersionQueryVersion = Fersiwn yr Ychwanegyn -metricsPageVersionQueryLastSeen = Diwrnod -metricsPageHeader = Metric -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Cynhyrchwyd: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (amser y gronfa ddata: { $time }ms) diff --git a/locales/da/server.ftl b/locales/da/server.ftl deleted file mode 100644 index 6d1adf5c48..0000000000 --- a/locales/da/server.ftl +++ /dev/null @@ -1,393 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mine skærmbilleder -gHomeLink = Start -gNoShots = - .alt = Ingen skærmbilleder fundet -gScreenshotsDescriptionServerless = Skærmbilleder på den nemme måde. Tag og hent skærmbilleder uden at forlade Firefox. - -## Header - -buttonSettings = - .title = Indstillinger -buttonSignIn = - .title = Log ind -screenshotsLogo = - .title = Startside for Screenshots -bannerSignIn = Log ind eller tilmeld dig for at få adgang til dine skærmbilleder på alle dine enheder, og gem dine favoritter for evigt. -bannerUpsell = { gScreenshotsDescription } Hent Firefox nu -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Nyheder i Firefox Screenshots -onboardingPromoMessage = Log ind på Screenshots med din Firefox-konto og gør mere: -onboardingPromoMessageListItem1 = Få adgang til dit arkiv på alle dine enheder -onboardingPromoMessageListItem2 = Gem dine favoritter for evigt -onboardingPromoDismissButton = Luk - .title = Luk -onboardingPromoSigninButton = Log ind - .title = Log ind - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Betingelser -footerLinkPrivacy = Privatlivspolitik -footerReportShot = Indberet skærmbillede - .title = Indberet dette skærmbillede for misbrug, spam eller andre problemer -footerLinkFaqs = Ofte stillede spørgsmål -footerLinkDMCA = Indberet overtrædelse af ophavsrettigheder -footerLinkDiscourse = Giv feedback -footerLinkRemoveAllData = Fjern alle data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Opretter { $title } -creatingPageTitleDefault = side -creatingPageWaitMessage = Gemmer dit skærmbillede... - -## Home page - -homePageDescription = - .content = Intuitive skærmbilleder direkte i din browser. Tag, gem og del skærmbilleder, mens du bruger nettet med Firefox. -homePageButtonMyShots = Gå til Mine skærmbilleder -homePageTeaser = Kommer snart… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Gratis download -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Sådan virker Firefox Screenshots -homePageGetStartedTitle = Kom i gang -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Klik på Screenshots-ikonet i menuen Sidehandlinger i adressefeltet for at få vist Screenshots-menuen øverst i browser-vinduet. -homePageCaptureRegion = Gem et område -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klik og træk for at vælge det område, du vil tage et skærmbillede af. Eller hold musen over et element på siden og klik. Vælg "Gem" for at kunne tilgå dit skærmbillede på nettet eller knappen med pil nedad for at hente billedet ned på din computer. -homePageCapturePage = Gem en side -homePageCapturePageDescription = Brug knapperne i højre øverste hjørne for at tage skærmbilleder af hele sider. Knappen "Gem synligt område" vil tage et skærmbillede af det område, du kan se uden at scrolle - mens "Gem hele siden" vil gemme et skærmbillede af alt på siden. -homePageDownloadCopy = Hent eller kopier -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Tag et godt skærmbillede. Med Screenshots kan du hente et skærmbillede af din markering eller kopiere det til din udklipsholder. -homePageLegalLink = Juridisk information -homePagePrivacyLink = Privatliv -homePageTermsLink = Betingelser -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Fjern alle data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = For at slette din konto skal du have Firefox Screenshots installeret eller være logget ind på din Firefox-konto. -leavePageErrorGeneric = Der opstod en fejl -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Dette vil slette alle dine Firefox Screenshots-data permanent. -leavePageButtonProceed = Fortsæt -leavePageButtonCancel = Annuller -leavePageDeleted = Alle dine skærmbilleder er blevet slettet! - -## Not Found page - -notFoundPageTitle = Siden blev ikke fundet -notFoundPageIntro = Hovsa. -notFoundPageDescription = Siden blev ikke fundet. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Skærmbillede: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Der opstod en fejl, da udløbsdatoen skulle gemmes -shotPageAlertErrorDeletingShot = Der opstod en fejl, da skærmbilledet skulle slettes -shotPageAlertErrorUpdatingTitle = Der opstod en fejl, da titlen skulle gemmes -shotPageConfirmDelete = Er du sikker på, at du vil slette dette skærmbillede permanent? -shotPageShareButton = - .title = Del -shotPageCopyButton = - .title = Kopier billede til udklipsholderen -shotPageCopyActionLabel = Kopier -shotPageCopied = Kopieret -shotPageShareFacebook = - .title = Del på Facebook -shotPageShareTwitter = - .title = Del på Twitter -shotPageSharePinterest = - .title = Del på Pinterest -shotPageShareEmail = - .title = Del link via mail -shotPageShareLink = Få et link til deling af dette skærmbillede: -shotPagePrivacyMessage = Enhver med linket kan se dette skærmbillede. -shotPageCopyImageText = - .label = Kopier billedtekst -shotPageConfirmDeletion = Er du sikker på, at du vil slette dette skærmbillede permanent? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Hvis du ikke gør noget, vil dette skærmbillede blive slettet permanent . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = gendan indtil { $date } -shotPageExpiredMessage = Dette skærmbillede er udløbet. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Her er siden, det oprindeligt blev oprettet fra: -shotPageDeleteButton = - .title = Slet dette skærmbillede -shotPageDownloadShot = - .title = Hent -shotPageEditButton = - .title = Rediger dette billede -shotPagefavoriteButton = - .title = Marker dette skærmbillede som favorit -shotPageBackToHomeButton = - .title = Startside -shotPageAllShotsButton = - .title = Alle skærmbilleder -shotPageScreenshotsDescriptionServerless = Skærmbilleder på den nemme måde. Tag og hent skærmbilleder uden at forlade Firefox. -shotPageDMCAMessage = Dette skærmbillede er ikke længere tilgængeligt, fordi tredjepart har gjort krav på den intellektuelle ejendomsret. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Send en mail til { $dmca } for at få yderligere oplysninger. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Hvis dine skærmbilleder er genstand for mange fordringer, kan vi tilbagekalde din adgang til Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Inkluder dette billedes URL i din mail: { $url } -shotPageKeepFor = Hvor længe skal dette skærmbillede beholdes? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Vælg tid -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Uendeligt ∞ -shotPageKeepTenMinutes = 10 minutter -shotPageKeepOneHour = 1 time -shotPageKeepOneDay = 1 dag -shotPageKeepOneWeek = 1 uge -shotPageKeepTwoWeeks = 2 uger -shotPageKeepOneMonth = 1 måned -shotPageSaveExpiration = gem -shotPageCancelExpiration = annuller -shotPageDoesNotExpire = udløber ikke -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = udløber -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = udløb -timeDiffJustNow = netop nu -timeDiffMinutesAgo = - { $number -> - [one] 1 minut siden - *[other] { $number } minutter siden - } -timeDiffHoursAgo = - { $number -> - [one] 1 time siden - *[other] { $number } timer siden - } -timeDiffDaysAgo = - { $number -> - [one] i går - *[other] { $number } dage siden - } -timeDiffFutureSeconds = om et par sekunder -timeDiffFutureMinutes = - { $number -> - [one] om 1 minut - *[other] om { $number } minutter - } -timeDiffFutureHours = - { $number -> - [one] om 1 time - *[other] om { $number } timer - } -timeDiffFutureDays = - { $number -> - [one] i morgen - *[other] om { $number } dage - } -errorThirdPartyCookiesEnabled = Hvis du tog dette skærmbillede og ikke kan slette det, kan det være nødvendigt at acceptere tredjeparts cookies midlertidigt i din browsers indstillinger. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Bemærk! -promoMessage = Nu kan du beskære, markere og tilføje tekst til dine skærmbilleder. -promoLink = Prøv selv -promoCloseButton = - .title = Luk denne besked - -## Annotations - -annotationPenButton = - .title = Pen -annotationHighlighterButton = - .title = Overstregningspen -annotationUndoButton = - .title = Fortryd -annotationRedoButton = - .title = Gendan -annotationTextButton = - .title = Tilføj tekst -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Ryd -annotationCropButton = - .title = Beskær -annotationSaveEditButton = Gem - .title = Gem redigering -annotationCancelEditButton = Fortryd - .title = Fortryd redigering -annotationCropConfirmButton = Bekræft - .title = Bekræft markering -annotationCropCancelButton = Fortryd - .title = Fortryd markering -annotationColorWhite = - .title = Hvid -annotationColorBlack = - .title = Sort -annotationColorRed = - .title = Rød -annotationColorGreen = - .title = Grøn -annotationColorBlue = - .title = Blå -annotationColorYellow = - .title = Gul -annotationColorPurple = - .title = Lilla -annotationColorSeaGreen = - .title = Havgrøn -annotationColorGrey = - .title = Grå -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tekststørrelse -# Values shown in text size selection dropdown -textSizeSmall = Lille -textSizeMedium = Mellem -textSizeLarge = Stor -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Bekræft - .title = Bekræft -textToolCancelButton = Fortryd - .title = Fortryd -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hallo - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Noget gik galt -copyImageErrorMessage = Kunne ikke kopiere dit skærmbillede til udklipsholderen. - -## Settings Page - -settingsDisconnectButton = Afbryd forbindelsen - .title = Afbryd forbindelsen -settingsGuestAccountMessage = Gæstekonto -settingsSignInButton = Log ind - .title = Log ind -SettingsPageHeader = Indstillinger for Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox-konto -settingsClosePreferences = - .title = Luk indstillinger -settingsFxaDisconnectAlertMessage = Er du sikker på, at du vil afbryde forbindelsen mellem denne enhed og din Firefox-konto? -settingsFxaDisconnectDescription = Hvis du logger ud, skal du logge ind igen for at få adgang til dine skærmbilleder. -settingsFxaConnectDescription = Du kan logge ind og få adgang til dine skærmbilleder på alle dine enheder. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Der opstod en fejl, da skærmbilledet skulle slettes: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mine skærmbilleder: søg efter { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Der opstod en fejl, da siden skulle skabes: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Søg i mine skærmbilleder -shotIndexPageNoShotsMessage = Ingen gemte skærmbilleder. -shotIndexPageNoShotsInvitation = Fortsæt, tag nogle. -shotIndexPageLookingForShots = Leder efter dine skærmbilleder... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Vi kan ikke finde nogle skærmbilleder, der matcher din søgning. -shotIndexPageMyShotsButton = - .title = Mine skærmbilleder -shotIndexPageClearSearchButton = - .title = Ryd søgning -shotIndexPageConfirmShotDelete = Slet dette skærmbillede? -shotIndexPagePreviousPage = - .title = Forrige side -shotIndexPageNextPage = - .title = Næste side -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Dette skærmbillede er ikke markeret som favorit og vil udløbe -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Dette skærmbillede er markeret som favorit og udløber ikke -shotIndexSyncedShot = - .title = Skærmbillede taget på en anden enhed -shotIndexAlertErrorFavoriteShot = Der opstod en fejl under opdatering af status på dit skærmbillede - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Er du sikker på, at du vil slette dette skærmbillede? -shotDeleteCancel = Fortryd - .title = Fortryd -shotDeleteConfirm = Slet - .title = Slet - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Sådan eksporterer du: Klik på menuen Filer > Gem side som…, og du kan så finde dine skærmbilleder i mappen { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Statistik for Firefox Screenshots -metricsPageTotalsQueryTitle = Totalt -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Et overblik over Screenshots -metricsPageTotalsQueryDevices = Antal registrerede enheder -metricsPageTotalsQueryActiveShots = Aktive skærmbilleder -metricsPageTotalsQueryExpiredShots = Udløbet (men kan genoprettes) -metricsPageTotalsQueryExpiredDeletedShots = Udløbet (og slettet) -metricsPageShotsQueryTitle = Skærmbilleder per dag -metricsPageShotsQueryDescription = Antal skærmbilleder taget hver dag (de seneste 30 dage) -metricsPageShotsQueryCount = Antal skærmbilleder -metricsPageShotsQueryDay = Dag -metricsPageUsersQueryTitle = Brugere per dag -metricsPageUsersQueryDescription = Antal brugere, der har taget mindst ét skærmbillede om dagen (de seneste 30 dage) -metricsPageUsersQueryCount = Antal brugere -metricsPageUsersQueryDay = Dag -metricsPageUserShotsQueryTitle = Antal skærmbilleder per bruger -metricsPageUserShotsQueryDescription = Antal brugere, der har omkring N skærmbilleder i alt -metricsPageUserShotsQueryCount = Antal brugere -metricsPageUserShotsQueryShots = Anslået antal aktive (ikke udløbne) skærmbilleder -metricsPageRetentionQueryTitle = Bibeholdelse per uge -metricsPageRetentionQueryDescription = Antal dage fra en brugers første skærmbillede til det seneste skærmbillede, grupperet efter start-uge -metricsPageRetentionQueryUsers = Antal brugere -metricsPageRetentionQueryDays = Dage fra brugerens første til brugerens seneste skærmbillede -metricsPageRetentionQueryFirstWeek = Uge, hvor brugeren først tog et skærmbillede -metricsPageTotalRetentionQueryTitle = Total bibeholdelse -metricsPageTotalRetentionQueryDescription = Hvor længe brugere har taget skærmbilleder, grupperet efter uge -metricsPageTotalRetentionQueryUsers = Antal brugere -metricsPageTotalRetentionQueryDays = Dage, brugeren har taget skærmbilleder -metricsPageVersionQueryTitle = Tilføjelses-version -metricsPageVersionQueryDescription = Den tilføjelses-version, der blev brugt under login i de seneste 14 dage -metricsPageVersionQueryUsers = Antal brugere, der logger ind -metricsPageVersionQueryVersion = Tilføjelses-version -metricsPageVersionQueryLastSeen = Dag -metricsPageHeader = Statistik -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Genereret den: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (databasetid: { $time }ms) diff --git a/locales/de/server.ftl b/locales/de/server.ftl deleted file mode 100644 index ec9902ebf1..0000000000 --- a/locales/de/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Meine Bildschirmfotos -gHomeLink = Startseite -gNoShots = - .alt = Keine Bildschirmfotos gefunden -gScreenshotsDescriptionServerless = Bildschirmfotos leicht gemacht. Bildschirmfotos speichern und herunterladen ohne Firefox zu verlassen. - -## Header - -buttonSettings = - .title = Einstellungen -buttonSignIn = - .title = Anmelden -screenshotsLogo = - .title = Startseite von Screenshots -bannerSignIn = Melden Sie sich an oder registrieren Sie sich, um geräteübergreifend Ihre Bildschirmfotos anzusehen und Ihre Favoriten dauerhaft zu speichern. -bannerUpsell = { gScreenshotsDescription } Jetzt Firefox herunterladen -shutdownWarning = Die gespeicherten Bildschirmfotos laufen bald ab. Ab Juni bietet Screenshots keinen Online-Speicher mehr. Möchten Sie Aufnahmen aus Ihrer Bibliothek behalten? Laden Sie sie auf Ihren Computer herunter. -shutdownPageTitle = Screenshots verändert sich -shutdownPageDescription = Ab Juni bietet Screenshots keinen Online-Speicher mehr. Möchten Sie Bildschirmfotos aus Ihrer Bibliothek behalten? Laden Sie die Bildschirmfotos einzeln oder gesammelt herunter. Vielen Dank, dass Sie diese Funktion verwenden. Wir bitten um Entschuldigung für etwaige Unannehmlichkeiten. -shutdownPageContinue = Wir hoffen, dass Sie weiterhin Screenshots zum Aufnehmen, Kopieren und Herunterladen von Bildschirmfotos verwenden. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Was ist neu in Firefox Screenshots? -onboardingPromoMessage = Melden Sie sich jetzt mit einem Firefox-Konto bei Screenshots an und nutzen Sie weitere Funktionen: -onboardingPromoMessageListItem1 = Greifen Sie auf allen Ihren Geräten auf Ihre Bibliothek zu -onboardingPromoMessageListItem2 = Speichern Sie Ihre Lieblingsbildschirmfotos für immer -onboardingPromoDismissButton = Schließen - .title = Schließen -onboardingPromoSigninButton = Anmelden - .title = Anmelden - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Nutzungsbedingungen -footerLinkPrivacy = Datenschutzhinweis -footerReportShot = Bildschirmfoto melden - .title = Dieses Bildschirmfoto wegen Missbrauchs, Spam oder anderen Problemen melden -footerLinkFaqs = Häufig gestellte Fragen -footerLinkDMCA = Verletzung geistigen Eigentums melden -footerLinkDiscourse = Feedback geben -footerLinkRemoveAllData = Alle Daten entfernen - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } wird erstellt -creatingPageTitleDefault = Seite -creatingPageWaitMessage = Dein Bildschirmfoto wird gespeichert … - -## Home page - -homePageDescription = - .content = Intuitive Bildschirmfotos direkt aus dem Browser. Während des Surfens mit Firefox können Sie Screenshots machen, speichern und teilen. -homePageButtonMyShots = Meine Bildschirmfotos anzeigen -homePageTeaser = Bald verfügbar… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Kostenloser Download -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Wie Firefox Screenshots funktioniert -homePageGetStartedTitle = Menü aufrufen -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Wähle das Screenshots-Symbol aus dem Menü „Aktionen für Seite“ in der Adressleiste aus. Dann erscheint oben in Deinem Browser-Fenster das Screenshots-Menü. -homePageCaptureRegion = Einen Bereich aufnehmen -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Lege Deine Auswahl fest, indem Du die Maus über den aufzunehmenden Bereich ziehst. Oder nur mit der Maus drübergehen und Screenshots wählt den Bereich für Dich aus. Damit zufrieden? Dann bitte klicken und auf „Speichern“ gehen, um Dein Bildschirmfoto online zu speichern. Oder direkt auf den Downloadpfeil, um den Screenshot auf Deinem Rechner herunterzuladen. -homePageCapturePage = Eine ganze Seite aufnehmen -homePageCapturePageDescription = Für die Aufnahme ganzer Seiten bitte oben auf die Schaltfläche “Gesamte Seite speichern” klicken. Während die Schaltfläche „Sichtbaren Bereich speichern“ den Bereich erfasst, der ohne Scrollen sichtbar ist, fertigt die Schaltfläche “Ganze Seite speichern” einen Screenshot an, der auch den Bereich erfasst, der erst durch Scrollen sichtbar wird. -homePageDownloadCopy = Herunterladen oder Kopieren -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Mit Screenshots können Sie Ihre Auswahl herunterladen oder direkt in die Zwischenablage kopieren. -homePageLegalLink = Rechtliches -homePagePrivacyLink = Datenschutz -homePageTermsLink = Nutzungsbedingungen -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Alle Daten entfernen -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Sie müssen Firefox Screenshots installiert haben oder mit Ihrem Firefox-Konto angemeldet sein, um Ihr Konto zu löschen. -leavePageErrorGeneric = Ein Fehler ist aufgetreten -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Dies löscht dauerhaft all Deine Daten von Firefox Screenshots. -leavePageButtonProceed = Fortfahren -leavePageButtonCancel = Abbrechen -leavePageDeleted = Alle Bildschirmfotos wurden gelöscht! - -## Not Found page - -notFoundPageTitle = Seite nicht gefunden -notFoundPageIntro = Hoppla. -notFoundPageDescription = Seite nicht gefunden. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Bildschirmfoto: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Fehler beim Speichern des Ablaufdatums -shotPageAlertErrorDeletingShot = Fehler beim Löschen des Bildschirmfotos -shotPageAlertErrorUpdatingTitle = Fehler beim Speichern des Titels -shotPageConfirmDelete = Soll dieses Bildschirmfoto wirklich dauerhaft gelöscht werden? -shotPageShareButton = - .title = Teilen -shotPageCopyButton = - .title = Bildschirmfoto in Zwischenablage kopieren -shotPageCopyActionLabel = Kopieren -shotPageCopied = Kopiert -shotPageShareFacebook = - .title = Auf Facebook teilen -shotPageShareTwitter = - .title = Auf Twitter teilen -shotPageSharePinterest = - .title = Auf Pinterest teilen -shotPageShareEmail = - .title = Link per E-Mail teilen -shotPageShareLink = Einen Link zum Teilen dieses Bildschirmfotos erzeugen: -shotPagePrivacyMessage = Jeder mit dem Link kann das Bildschirmfoto ansehen. -shotPageCopyImageText = - .label = Grafiktext kopieren -shotPageConfirmDeletion = Soll dieses Bildschirmfoto wirklich dauerhaft gelöscht werden? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Wenn Du nichts tust, wird dieses Bildschirmfoto automatisch gelöscht. -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = Wiederherstellen bis { $date } -shotPageExpiredMessage = Dieses Bildschirmfoto ist abgelaufen. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Es wurde ursprünglich von dieser Seite erstellt: -shotPageDeleteButton = - .title = Dieses Bildschirmfoto löschen -shotPageDownloadShot = - .title = Herunterladen -shotPageEditButton = - .title = Diese Grafik bearbeiten -shotPagefavoriteButton = - .title = Dieses Bildschirmfoto als Favorit markieren -shotPageBackToHomeButton = - .title = Startseite -shotPageAllShotsButton = - .title = Alle Bildschirmfotos -shotPageScreenshotsDescriptionServerless = Bildschirmfotos leicht gemacht. Bildschirmfotos speichern und herunterladen ohne Firefox zu verlassen. -shotPageDMCAMessage = Dieses Bildschirmfoto ist aufgrund von Urheberrechtsansprüchen von Dritten nicht mehr verfügbar. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Weitere Informationen erhälst Du per E-Mail an { $dmca }. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Werden bei Deinen Bildschirmfotos Ansprüche geltend gemacht, wird Dir der Zugang zu Firefox Screenshots möglicherweise entzogen. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Bitte gib in Deiner E-Mail die URL dieses Bildschirmfotos an: { $url } -shotPageKeepFor = Wie lange soll dieses Bildschirmfoto aufbewahrt werden? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Zeit auswählen -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Unendlich ∞ -shotPageKeepTenMinutes = 10 Minuten -shotPageKeepOneHour = Eine Stunde -shotPageKeepOneDay = Ein Tag -shotPageKeepOneWeek = Eine Woche -shotPageKeepTwoWeeks = Zwei Wochen -shotPageKeepOneMonth = Ein Monat -shotPageSaveExpiration = speichern -shotPageCancelExpiration = Abbrechen -shotPageDoesNotExpire = Läuft nicht ab -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = Läuft ab -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = Lief ab -timeDiffJustNow = gerade eben -timeDiffMinutesAgo = - { $number -> - [one] vor einer Minute - *[other] vor { $number } Minuten - } -timeDiffHoursAgo = - { $number -> - [one] vor einer Stunde - *[other] vor { $number } Stunden - } -timeDiffDaysAgo = - { $number -> - [one] gestern - *[other] vor { $number } Tagen - } -timeDiffFutureSeconds = in wenigen Sekunden -timeDiffFutureMinutes = - { $number -> - [one] in einer Minute - *[other] in { $number } Minuten - } -timeDiffFutureHours = - { $number -> - [one] in einer Stunde - *[other] in { $number } Stunden - } -timeDiffFutureDays = - { $number -> - [one] morgen - *[other] in { $number } Tagen - } -errorThirdPartyCookiesEnabled = Wenn Sie dieses Bildschirmfoto aufgenommen haben, es aber nicht löschen können, müssen Sie möglicherweise kurzzeitig Cookies von Drittanbietern in den Einstellungen Ihres Browsers zulassen. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Aufgepasst! -promoMessage = Mit neuen Bearbeitungswerkzeugen können Sie Ihr Bildschirmfoto zuschneiden, hervorheben oder Text hinzufügen. -promoLink = Probieren Sie sie aus! -promoCloseButton = - .title = Benachrichtigung schließen - -## Annotations - -annotationPenButton = - .title = Stift -annotationHighlighterButton = - .title = Textmarker -annotationUndoButton = - .title = Rückgängig -annotationRedoButton = - .title = Widerholen -annotationTextButton = - .title = Text hinzufügen -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Zurücksetzen -annotationCropButton = - .title = Zuschneiden -annotationSaveEditButton = Speichern - .title = Bearbeitung speichern -annotationCancelEditButton = Abbrechen - .title = Bearbeiten abbrechen -annotationCropConfirmButton = Bestätigen - .title = Auswahl bestätigen -annotationCropCancelButton = Abbrechen - .title = Auswahl abbrechen -annotationColorWhite = - .title = Weiß -annotationColorBlack = - .title = Schwarz -annotationColorRed = - .title = Rot -annotationColorGreen = - .title = Grün -annotationColorBlue = - .title = Blau -annotationColorYellow = - .title = Gelb -annotationColorPurple = - .title = Violett -annotationColorSeaGreen = - .title = Meergrün -annotationColorGrey = - .title = Grau -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Textgröße -# Values shown in text size selection dropdown -textSizeSmall = Klein -textSizeMedium = Mittel -textSizeLarge = Groß -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Bestätigen - .title = Bestätigen -textToolCancelButton = Abbrechen - .title = Abbrechen -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hallo - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Irgendetwas ist schiefgegangen -copyImageErrorMessage = Ihr Bildschirmfoto konnte nicht in die Zwischenablage kopiert werden. - -## Settings Page - -settingsDisconnectButton = Verbindung trennen - .title = Verbindung trennen -settingsGuestAccountMessage = Gastkonto -settingsSignInButton = Anmelden - .title = Anmelden -SettingsPageHeader = Einstellungen von Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox-Konto -settingsClosePreferences = - .title = Einstellungen schließen -settingsFxaDisconnectAlertMessage = Möchten Sie dieses Gerät wirklich von Ihrem Firefox-Konto trennen? -settingsFxaDisconnectDescription = Wenn Sie sich abmelden, müssen Sie sich erneut anmelden, um wieder auf Ihre Screenshots zugreifen zu können. -settingsFxaConnectDescription = Sie können sich anmelden, um geräteübergreifend auf Ihre Bildschirmfotos zuzugreifen. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Fehler beim Löschen des Bildschirmfotos: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Meine Bildschirmfotos: Suchen nach { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Fehler beim Darstellen der Seite: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Meine Bildschirmfotos durchsuchen -shotIndexPageNoShotsMessage = Keine gespeicherten Bildschirmfotos. -shotIndexPageNoShotsInvitation = Los, erstellen Sie welche. -shotIndexPageLookingForShots = Suchen nach Ihren Bildschirmfotos… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Wir finden keine zu Deiner Suche passenden Bildschirmfotos. -shotIndexPageMyShotsButton = - .title = Meine Bildschirmfotos -shotIndexPageClearSearchButton = - .title = Suche löschen -shotIndexPageConfirmShotDelete = Dieses Bildschirmfoto löschen? -shotIndexPagePreviousPage = - .title = Vorherige Seite -shotIndexPageNextPage = - .title = Nächste Seite -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Dieses Bildschirmfoto ist kein Favorit, daher läuft es ab -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Dieses Bildschirmfoto ist ein Favorit und läuft nicht ab -shotIndexSyncedShot = - .title = Auf anderem Gerät aufgenommenes Bildschirmfoto -shotIndexAlertErrorFavoriteShot = Fehler beim Aktualisieren des Favoriten-Status des Bildschirmfotos - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Soll dieses Bildschirmfoto wirklich gelöscht werden? -shotDeleteCancel = Abbrechen - .title = Abbrechen -shotDeleteConfirm = Löschen - .title = Löschen - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Nutzen Sie zum Export „Datei → Seite speichern unter…“, dann wird Ihr Bildschirmfoto im Ordner „{ $folder }“ abgelegt - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metriken zu Firefox Screenshots -metricsPageTotalsQueryTitle = Gesamt -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Eine Übersicht zu Screenshots -metricsPageTotalsQueryDevices = Insgesamt registrierte Geräte -metricsPageTotalsQueryActiveShots = Aktive Bildschirmfotos -metricsPageTotalsQueryExpiredShots = Abgelaufen (aber wiederherstellbar) -metricsPageTotalsQueryExpiredDeletedShots = Abgelaufen (und gelöscht) -metricsPageShotsQueryTitle = Bildschirmfotos nach Tag -metricsPageShotsQueryDescription = Zahl der pro Tag erstellten Bildschirmfotos (für die letzten 30 Tage) -metricsPageShotsQueryCount = Anzahl der Bildschirmfotos -metricsPageShotsQueryDay = Tag -metricsPageUsersQueryTitle = Nutzer nach Tag -metricsPageUsersQueryDescription = Zahl der Nutzer, die mindestens ein Bildschirmfoto erstellt hat, nach Tag (letzte 30 Tage) -metricsPageUsersQueryCount = Anzahl der Benutzer -metricsPageUsersQueryDay = Tag -metricsPageUserShotsQueryTitle = Zahl von Bildschirmfotos pro Nutzer -metricsPageUserShotsQueryDescription = Die Anzahl der Benutzer, die insgesamt etwa N Bildschirmfotos hat -metricsPageUserShotsQueryCount = Anzahl der Benutzer -metricsPageUserShotsQueryShots = Ungefähre Anzahl aktiver (nicht abgelaufener) Bildschirmfotos -metricsPageRetentionQueryTitle = Weiternutzung nach Woche -metricsPageRetentionQueryDescription = Anzahl der Tage vom ersten bis zum neuesten Bildschirmfoto einer Benutzers, nach Anfangswoche gruppiert -metricsPageRetentionQueryUsers = Anzahl der Benutzer -metricsPageRetentionQueryDays = Tage vom ersten bis zum neuesten Bildschirmfoto eines Benutzers -metricsPageRetentionQueryFirstWeek = Woche, in der der Benutzer erstmals ein Bildschirmfoto erstellt hat -metricsPageTotalRetentionQueryTitle = Weiternutzung insgesamt -metricsPageTotalRetentionQueryDescription = Länge der Zeit, in der Nutzer Bildschirmfotos erstellen, nach Woche gruppiert -metricsPageTotalRetentionQueryUsers = Anzahl der Benutzer -metricsPageTotalRetentionQueryDays = Tage, die der Benutzer Bildschirmfotos erstellt -metricsPageVersionQueryTitle = Add-on-Version -metricsPageVersionQueryDescription = Die Version des Add-ons während der Anmeldung in den letzten 14 Tagen -metricsPageVersionQueryUsers = Anzahl der angemeldeten Benutzer -metricsPageVersionQueryVersion = Add-on-Version -metricsPageVersionQueryLastSeen = Tag -metricsPageHeader = Metriken -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Erstellt am: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (Zeitstempel der Datenbank: { $time }ms) diff --git a/locales/dsb/server.ftl b/locales/dsb/server.ftl deleted file mode 100644 index c141fdcc10..0000000000 --- a/locales/dsb/server.ftl +++ /dev/null @@ -1,409 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Móje fota wobrazowki -gHomeLink = Startowy bok -gNoShots = - .alt = Žedne fota wobrazowki namakane -gScreenshotsDescriptionServerless = Fota wobrazowki lažko napórane. Napórajśo a ześěgniśo fota wobrazowki, mimo aby Firefox spušćił. - -## Header - -buttonSettings = - .title = Nastajenja -buttonSignIn = - .title = Pśizjawiś -screenshotsLogo = - .title = Startowy bok Screenshots -bannerSignIn = Pśizjawśo se abo registrěrujśo se, aby pśez rědy pśistup na waše fota wobrazowki měł a składujśo swóje fawority na pśecej. -bannerUpsell = { gScreenshotsDescription } Wobstarajśo se Firefox něnto -shutdownWarning = Skłaźone fota wobrazowki skóro spadnu. Wót junija Screenshots žeden składowak online njepóbitujo. Cośo fota wobrazowki ze swójeje biblioteki wobchowaś? Ześěgniśo je do swójogo licadła. -shutdownPageTitle = Screenshots se změnja -shutdownPageDescription = Wót junija Screenshots wěcej składowak njepóbitujo. Cośo fota wobrazowki ze swójeje biblioteki wobchowaś? Ześěgniśo fota wobrazowki jadno pó jadnom abo pó kupkach. Źěkujomy se za wužywanje toś teje funkcije a wódajśo pšosym wobuznosći. -shutdownPageContinue = Naźejamy se, až Screenshots dalej wužywaśo, aby wy fota wobrazowki napórał, kopěrował a ześěgnuł. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Co jo nowe w Firefox Screenshots? -onboardingPromoMessage = Pśizjawśo se něnto z kontom Firefox pla Screenshots a cyńśo wěcej: -onboardingPromoMessageListItem1 = Mějśo pśistup k swójej bibliotece na wšych swójich rědach -onboardingPromoMessageListItem2 = Składujśo swóje nejlubše fota wobrazowki na pśecej -onboardingPromoDismissButton = Zachyśiś - .title = Zachyśiś -onboardingPromoSigninButton = Pśizjawiś - .title = Pśizjawiś - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Wuměnjenja -footerLinkPrivacy = Wuzjawjenje priwatnosći -footerReportShot = Toś to foto wobrazowki k wěsći daś - .title = Toś to foto wobrazowki znjewužywanja, spama abo drugich problemow dla k wěsći daś -footerLinkFaqs = Ceste pšašanja -footerLinkDMCA = Pśekśiwjenje duchnego swójstwa k wěsći daś -footerLinkDiscourse = Wašo měnjenje groniś -footerLinkRemoveAllData = Wše daty wótwónoźeś - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } se gótujo -creatingPageTitleDefault = bok -creatingPageWaitMessage = Wašo foto wobrazowki se składujo… - -## Home page - -homePageDescription = - .content = Intuitiwne fota wobrazowki direktne z wobglědowaka. Móžośo fota wobrazowki cyniś, składowaś a źěliś, mjaztym až pśeglědujośo web z pomocu Firefox. -homePageButtonMyShots = K mójim fotam wobrazowki -homePageTeaser = Skóro k dispoziciji... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Dermotne ześěgnjenje -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Kak Firefox Screenshots funkcioněrujo -homePageGetStartedTitle = Prědne kšace -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Wubjeŕśo symbol Screenshots z menija akcijow boka w adresowem pólu, a meni Screenshots pokažo se górjejce we woknje wobglědowaka. -homePageCaptureRegion = Wobcerk fotografěrowaś -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klikniśo a śěgniśo, aby wobcerk wubrał, kótaryž cośo fotografěrowaś. Abo stajśo jadnorje kursor nad tym a klikniśo - Screenshots buźo wobcerk za was wuběraś. Spódoba se wam, což wiźiśo? Wubjeŕśo „Składowaś“ za pśistup k swójomu fotoju wobrazowki online abo tłocašk ze šypku dołoj, aby jo na swójo licadło ześěgnuł. -homePageCapturePage = Bok fotografěrowaś -homePageCapturePageDescription = Wužywajśo tłocašk górjejce napšawo, aby cełe boki fotografěrował. Tłocašk "Wobcerk fotografěrowaś" ten wobcerk składujo, kótaryž móžośo bźez kulanje boka wiźeś a tłocašk "Bok fotografěrowaś" składujo ceły bok. -homePageDownloadCopy = Ześěgnuś abo kopěrowaś -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Napórajśo swójo nejlěpše foto wobrazowki. Fota wobrazowki wam zmóžnja, waš wuběrk ześěgnuś abo jen direktnje do wašogo mjazywótkłada kopěrowaś. -homePageLegalLink = Pšawniske -homePagePrivacyLink = Priwatnosć -homePageTermsLink = Wuměnjenja -homePageCookiesLink = Cookieje - -## Leave Screenshots page - -leavePageRemoveAllData = Wšykne daty wótwónoźeś -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Musyśo Firefox Screenshots instalěrowaś abo se pla konta Firefox pśizjawiś, aby swójo konto wulašował -leavePageErrorGeneric = Zmólka jo nastała -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = To wše waše daty Firefox Screenshots na pśecej wulašujo. -leavePageButtonProceed = Pókšacowaś -leavePageButtonCancel = Pśetergnuś -leavePageDeleted = Wše waše fota wobrazowki su se wulašowali! - -## Not Found page - -notFoundPageTitle = Bok njejpo se namakał -notFoundPageIntro = Hopla. -notFoundPageDescription = Bok njejo se namakał. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Foto wobrazowki: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Zmólka pśi składowanju wótběgoweho datuma -shotPageAlertErrorDeletingShot = Zmólka pśi lašowanju fota wobrazowki -shotPageAlertErrorUpdatingTitle = Zmólka pśi składowanju titela -shotPageConfirmDelete = Cośo napšawdu toś to foto wobrazowki na pśecej wulašowaś? -shotPageShareButton = - .title = Źěliś -shotPageCopyButton = - .title = Wobraz do mjazywótkłada kopěrowaś -shotPageCopyActionLabel = Kopěrowaś -shotPageCopied = Kopěrowany -shotPageShareFacebook = - .title = Na Facebooku źěliś -shotPageShareTwitter = - .title = Na Twitter źěliś -shotPageSharePinterest = - .title = Na Pinterest źěliś -shotPageShareEmail = - .title = Wótkaz pśez mejlku źěliś -shotPageShareLink = Napórajśo wótkaz, aby toś to foto wobrazowki źělił: -shotPagePrivacyMessage = Kuždy z toś tym wótkazom móžo se toś to foto wobrazowki woglědaś. -shotPageCopyImageText = - .label = Wobrazowy tekst kopěrowaś -shotPageConfirmDeletion = Cośo toś to foto wobrazowki napšawdu na pśecej wulašowaś? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Jolic nic njecyniśo, se toś to foto wobrazowki na pśecej wulašujo . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = wótnowiś až do { $date } -shotPageExpiredMessage = Toś to foto wobrazowki jo spadnjone. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = How jo bok, z kótaregož jo se spócetnje napórało: -shotPageDeleteButton = - .title = Toś to foto wobrazowki wulašowaś -shotPageDownloadShot = - .title = Ześěgnuś -shotPageEditButton = - .title = Toś ten wobraz wobźěłaś -shotPagefavoriteButton = - .title = Toś to foto wobrazowki ako faworit wóznamjeniś -shotPageBackToHomeButton = - .title = Startowy bok -shotPageAllShotsButton = - .title = Wšykne fota wobrazowki -shotPageScreenshotsDescriptionServerless = Fota wobrazowki lažko napórane. Napórajśo a ześěgniśo fota wobrazowki, mimo aby Firefox spušćił. -shotPageDMCAMessage = Toś to foto wobrazowki wěcej njejo k dispoziciji dla pšawow awtorstwa tśeśich. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Dalšne informacije pśez e-mail na { $dmca } dostanjośo. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Jolic waše fota wobrazowki někotarym pšawam pódlaže, móžomy wašomu pśistupoju na Firefox Screenshots zajźowaś. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Pšosym pódajśo URL toś togo fota wobrazowki w swójej mejlce: { $url } -shotPageKeepFor = Kak dłujko ma sr toś to foto wobrazowki chowaś? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Cas wubraś -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Na pśecej ∞ -shotPageKeepTenMinutes = 10 minutow -shotPageKeepOneHour = 1 góźina -shotPageKeepOneDay = 1 źeń -shotPageKeepOneWeek = 1 tyźeń -shotPageKeepTwoWeeks = 2 tyźenja -shotPageKeepOneMonth = 1 mjasec -shotPageSaveExpiration = składowaś -shotPageCancelExpiration = pśetergnuś -shotPageDoesNotExpire = njespadnjo -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = spadnjo -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = spadnjony -timeDiffJustNow = rowno -timeDiffMinutesAgo = - { $number -> - [one] pśed 1 minutu - [two] pśed { $number } minutoma - [few] pśed { $number } minutami - *[other] pśed { $number } minutami - } -timeDiffHoursAgo = - { $number -> - [one] pśed 1 góźinu - [two] pśed { $number } góźinoma - [few] pśed { $number } góźinami - *[other] pśed { $number } góźinami - } -timeDiffDaysAgo = - { $number -> - [one] cora - [two] pśed { $number } dnjoma - [few] pśed { $number } dnjami - *[other] pśed { $number } dnjami - } -timeDiffFutureSeconds = za mało sekundow -timeDiffFutureMinutes = - { $number -> - [one] za 1 minutu - [two] za { $number } minuśe - [few] za { $number } minuty - *[other] za { $number } minutow - } -timeDiffFutureHours = - { $number -> - [one] za 1 góźinu - [two] za { $number } góźinje - [few] za { $number } góźiny - *[other] za { $number } góźin - } -timeDiffFutureDays = - { $number -> - [one] witśe - [two] za { $number } dnja - [few] za { $number } dny - *[other] za { $number } dnjow - } -errorThirdPartyCookiesEnabled = Jolic sćo toś to foto wobrazowki gótował a njamóžośo jo wulašowaś, musyśo nachylu cookieje tśeśich póbitowarjow w nastajenjach swójogo wobglědowaka zmóžniś. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Glědajśo! -promoMessage = Z nowymi wobźěłowańskimi rědami móžośo w swójom fośe wobrazowki tekst wurězaś, wuzwignuś a samo pśidaś. -promoLink = Wopytajśo je! -promoCloseButton = - .title = Powěźeńku zacyniś - -## Annotations - -annotationPenButton = - .title = Pisak -annotationHighlighterButton = - .title = Tekstowy marker -annotationUndoButton = - .title = Anulěrowaś -annotationRedoButton = - .title = Wóspjetowaś -annotationTextButton = - .title = Tekst pśidaś -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Slědk stajiś -annotationCropButton = - .title = Wurězaś -annotationSaveEditButton = Składowaś - .title = Změnu składowaś -annotationCancelEditButton = Pśetergnuś - .title = Wobźěłanje pśetergnuś -annotationCropConfirmButton = Wobkšuśiś - .title = Wuběrk wobkšuśiś -annotationCropCancelButton = Pśetergnuś - .title = Wuběrk pśetergnuś -annotationColorWhite = - .title = Běły -annotationColorBlack = - .title = Carny -annotationColorRed = - .title = Cerwjeny -annotationColorGreen = - .title = Zeleny -annotationColorBlue = - .title = Módry -annotationColorYellow = - .title = Žołty -annotationColorPurple = - .title = Purpurowy -annotationColorSeaGreen = - .title = Mórskozeleny -annotationColorGrey = - .title = Šery -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tekstowa wjelikosć -# Values shown in text size selection dropdown -textSizeSmall = Mały -textSizeMedium = Srjejźny -textSizeLarge = Wjeliki -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Wobkšuśiś - .title = Wobkšuśiś -textToolCancelButton = Pśetergnuś - .title = Pśetergnuś -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Witaj - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Něco njejo se raźiło -copyImageErrorMessage = Njejo móžno, wašo foto wobrazowki do mjazywótkłada kopěrowaś. - -## Settings Page - -settingsDisconnectButton = Zwisk źěliś - .title = Zwisk źěliś -settingsGuestAccountMessage = Góstne konto -settingsSignInButton = Pśizjawiś - .title = Pśizjawiś -SettingsPageHeader = Nastajenja Firefox Screenshots -settingsFirefoxAccountSubHeader = Konto Firefox -settingsClosePreferences = - .title = Nastajenja zacyniś -settingsFxaDisconnectAlertMessage = Cośo toś ten rěd napšawdu ze swójogo konta Firefox źěliś? -settingsFxaDisconnectDescription = Jolic se wózjwjaśo, musyśo se znowego pśizjawiś, ab pśistup k swójim fotam wobrazowki slědk dostał. -settingsFxaConnectDescription = Móžośo se pśizjawiś, aby pśistup k swójim fotam wobrazowki pśez rědy měł. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Zmólka pśi lašowanju fota wobrazowki: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Móje fota wobrazowki: Za { $searchTerm } pytaś -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Zmólka pśi pśedstajanju boka: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Móje fota wobrazowki pśepytaś -shotIndexPageNoShotsMessage = Žedne skłaźone fota wobrazowki. -shotIndexPageNoShotsInvitation = Pójśo, napórajśo někake. -shotIndexPageLookingForShots = Pyta se za wašymi fotami wobrazowki... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Njamóžomy fota wobrazowki namakaś, kótarež wašomu pytanjeju wótpowěduju. -shotIndexPageMyShotsButton = - .title = Móje fota wobrazowki -shotIndexPageClearSearchButton = - .title = Pytanje lašowaś -shotIndexPageConfirmShotDelete = Toś to foto wobrazowki lašowaś? -shotIndexPagePreviousPage = - .title = Pjerwjejšny bok -shotIndexPageNextPage = - .title = Pśiducy bok -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = To njejo woblubowane foto wobrazowki a pśepadnjo -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = To jo woblubowane foto wobrazowki a njespadnjo -shotIndexSyncedShot = - .title = Foto wobrazowki z drugego rěda -shotIndexAlertErrorFavoriteShot = Zmólka pśi aktualizěrowanju statusa nejlubšego fota wobrazowki - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Cośo toś to foto wobrazowki napšawdu lašowaś? -shotDeleteCancel = Pśetergnuś - .title = Pśetergnuś -shotDeleteConfirm = Lašowaś - .title = Lašowaś - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Aby eksportěrował, wužywajśo Dataja > Bok składowaś ako… a namakajośo swóje fota wobrazowki w zarědniku { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metriki Firefox Screenshots -metricsPageTotalsQueryTitle = Dogromady -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Pśeglěd Screenshots -metricsPageTotalsQueryDevices = Zregistrěrowane rědy dogromady -metricsPageTotalsQueryActiveShots = Aktiwne fota wobrazowki -metricsPageTotalsQueryExpiredShots = Wótběgnuło (dajo se pak wótnowiś) -metricsPageTotalsQueryExpiredDeletedShots = Wótběgnuło (a wulašowane) -metricsPageShotsQueryTitle = Fota wobrazowki na źeń -metricsPageShotsQueryDescription = Licba fotow wobrazowki napóranych kuždy źeń (za zachadne 30 dnjow) -metricsPageShotsQueryCount = Licba fotow wobrazowki -metricsPageShotsQueryDay = Źeń -metricsPageUsersQueryTitle = Wužywarje pó dnju -metricsPageUsersQueryDescription = Licba wužywarjow, kótarež su nanejmjenjej jadno foto wobrazowki napórali (zachadne 30 dnjow) -metricsPageUsersQueryCount = Licba wužywarjow -metricsPageUsersQueryDay = Źeń -metricsPageUserShotsQueryTitle = Licba fotow wobrazowki na wužywarja -metricsPageUserShotsQueryDescription = Licba wužywarjow, kótarež maju dogromady wokoło N fotow wobrazowki -metricsPageUserShotsQueryCount = Licba wužywarjow -metricsPageUserShotsQueryShots = Pśibližna licba aktiwnych (njespadnjonych) fotow wobrazowki -metricsPageRetentionQueryTitle = Dalejwužiwanje pó tyźenju -metricsPageRetentionQueryDescription = Licba dnjow wót prědnego fota wobrazowki wužywarja až do nejnowšego, zrědowane pó zachopnem tyźenju -metricsPageRetentionQueryUsers = Licba wužywarjow -metricsPageRetentionQueryDays = Dny wót prědnego až do nejnowšego fota wobrazowki wužywarja -metricsPageRetentionQueryFirstWeek = Tyźeń, gaž wužywaŕ jo prědne foto wobrazowki napórał -metricsPageTotalRetentionQueryTitle = Dalejwužywanje dogromady -metricsPageTotalRetentionQueryDescription = Cas, w kótaremž su wužywarje fota wobrazowki napórali, zrědowane pó tyźenju -metricsPageTotalRetentionQueryUsers = Licba wužywarjow -metricsPageTotalRetentionQueryDays = Dny, gaž jo wužywaŕ fota wobrazowki napórał -metricsPageVersionQueryTitle = Wersija dodanka -metricsPageVersionQueryDescription = Wersija dodanka, kótaraž jo se za zachadne 14 dnjow za pśizjawjenje wužywała -metricsPageVersionQueryUsers = Licba pśizjawjonych wužywarjow -metricsPageVersionQueryVersion = Wersija dodanka -metricsPageVersionQueryLastSeen = Źeń -metricsPageHeader = Metriki -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Napórane: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (cas datoweje banki: { $time }ms) diff --git a/locales/el/server.ftl b/locales/el/server.ftl deleted file mode 100644 index 91f5d0add8..0000000000 --- a/locales/el/server.ftl +++ /dev/null @@ -1,394 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Τα στιγμιότυπά μου -gHomeLink = Αρχική -gNoShots = - .alt = Δεν βρέθηκαν στιγμιότυπα -gScreenshotsDescriptionServerless = Τα στιγμιότυπα έγιναν εύκολη υπόθεση. Κάντε δημιουργία και λήψη μέσα από το Firefox. - -## Header - -buttonSettings = - .title = Ρυθμίσεις -buttonSignIn = - .title = Σύνδεση -screenshotsLogo = - .title = Αρχική σελίδα Screenshots -bannerSignIn = Συνδεθείτε ή εγγραφείτε για πρόσβαση στα στιγμιότυπά σας από όλες τις συσκευές και αποθήκευση των αγαπημένων σας για πάντα. -bannerUpsell = { gScreenshotsDescription } Λήψη του Firefox τώρα -shutdownWarning = Τα αποθηκευμένα στιγμιότυπα λήγουν σύντομα. Ξεκινώντας από τον Ιούνιο, το Screenshots δεν θα προσφέρει πλέον online αποθηκευτικό χώρο. Θέλετε να διατηρήσετε στιγμιότυπα από τη βιβλιοθήκη σας; Κάντε λήψη στον υπολογιστή σας. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Τι νέο υπάρχει στο Firefox Screenshots; -onboardingPromoMessage = Τώρα, συνδεθείτε στο Screenshots με ένα Λογαριασμό Firefox και κάντε περισσότερα: -onboardingPromoMessageListItem1 = Πρόσβαση στη βιβλιοθήκη σας από όλες τις συσκευές σας -onboardingPromoMessageListItem2 = Αποθήκευση αγαπημένων στιγμιότυπων για πάντα -onboardingPromoDismissButton = Απόρριψη - .title = Απόρριψη -onboardingPromoSigninButton = Σύνδεση - .title = Σύνδεση - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Όροι χρήσης -footerLinkPrivacy = Πολιτική Απορρήτου -footerReportShot = Αναφορά στιγμιότυπου - .title = Αναφέρετε αυτό το στιγμιότυπο ως ακατάλληλο, ανεπιθύμητο ή για άλλα προβλήματα -footerLinkFaqs = Συχνές ερωτήσεις -footerLinkDMCA = Αναφορά IP παραβίασης πνευματικής ιδιοκτησίας -footerLinkDiscourse = Γράψτε το σχόλιο σας -footerLinkRemoveAllData = Διαγραφή όλων των δεδομένων - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Δημιουργία { $title } -creatingPageTitleDefault = σελίδα -creatingPageWaitMessage = Αποθήκευση στιγμιότυπου… - -## Home page - -homePageDescription = - .content = Εύκολη λήψη στιγμιοτύπων, ενσωματωμένη στο πρόγραμμα περιήγησης. Λήψη, αποθήκευση και κοινή χρήση στιγμιοτύπων κατά την περιήγηση στο διαδίκτυο με το Firefox. -homePageButtonMyShots = Μετάβαση στα στιγμιότυπά μου -homePageTeaser = Έρχεται σύντομα... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Δωρεάν λήψη -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Πώς λειτουργεί το Firefox Screenshots -homePageGetStartedTitle = Ξεκινήστε -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Επιλέξτε το εικονίδιο του Screenshots από το μενού ενεργειών σελίδας στη γραμμή διευθύνσεων και το μενού του Screenshots θα εμφανιστεί στο πάνω μέρος του παραθύρου του προγράμματος περιήγησής σας. -homePageCaptureRegion = Καταγραφή περιοχής -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Κάντε κλικ και σύρετε για να επιλέξετε την περιοχή που θέλετε να καταγράψετε σε στιγμιότυπο. Ή απλά μετακινήστε τον κέρσορα και κάντε κλικ — το Screenshots θα επιλέξει για εσάς την περιοχή. Σάς αρέσει αυτό που βλέπετε; Επιλέξτε "Αποθήκευση" για να αποκτήσετε πρόσβαση στο στιγμιότυπό σας διαδικτυακά ή το κάτω βέλος για να κάνετε λήψη της εικόνας στον υπολογιστή σας. -homePageCapturePage = Καταγραφή σελίδας -homePageCapturePageDescription = Χρησιμοποιήστε τα κουμπιά επάνω δεξιά για να καταγράψετε πλήρεις σελίδες σε στιγμιότυπα. Το κουμπί "Αποθήκευση ορατού" θα καταγράψει την περιοχή που μπορείτε να δείτε χωρίς κύλιση, ενώ το "Αποθήκευση πλήρους σελίδας" θα καταγράψει τα πάντα στη σελίδα. -homePageDownloadCopy = Λήψη ή αντιγραφή -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Τα καλύτερα στιγμιότυπά σας. Το Screenshots σάς επιτρέπει να κάνετε λήψη της επιλογής σας ή αντιγραφή στο πρόχειρο. -homePageLegalLink = Νομικά -homePagePrivacyLink = Απόρρητο -homePageTermsLink = Όροι -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Διαγραφή όλων των δεδομένων -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Πρέπει να έχετε εγκαταστήσει το Firefox Screenshots ή να έχετε συνδεθεί στο λογαριασμό Firefox για να διαγράψετε το λογαριασμό σας -leavePageErrorGeneric = Προέκυψε σφάλμα -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Αυτό θα διαγράψει οριστικά όλα τα δεδομένα του Firefox Screenshots σας. -leavePageButtonProceed = Συνέχεια -leavePageButtonCancel = Ακύρωση -leavePageDeleted = Όλα τα στιγμιότυπά σας έχουν διαγραφεί! - -## Not Found page - -notFoundPageTitle = Η σελίδα δεν βρέθηκε -notFoundPageIntro = Ωχ. -notFoundPageDescription = Η σελίδα δεν βρέθηκε. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Στιγμιότυπο: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Σφάλμα αποθήκευσης ημερομηνίας λήξης -shotPageAlertErrorDeletingShot = Σφάλμα διαγραφής στιγμιότυπου -shotPageAlertErrorUpdatingTitle = Σφάλμα αποθήκευσης τίτλου -shotPageConfirmDelete = Θέλετε σίγουρα να διαγράψετε οριστικά το στιγμιότυπο; -shotPageShareButton = - .title = Κοινή χρήση -shotPageCopyButton = - .title = Αντιγραφή εικόνας στο πρόχειρο -shotPageCopyActionLabel = Αντιγραφή -shotPageCopied = Αντιγράφηκε -shotPageShareFacebook = - .title = Κοινοποίηση στο Facebook -shotPageShareTwitter = - .title = Κοινοποίηση στο Twitter -shotPageSharePinterest = - .title = Κοινοποίηση στο Pinterest -shotPageShareEmail = - .title = Κοινοποίηση συνδέσμου μέσω email -shotPageShareLink = Λάβετε ένα σύνδεσμο για κοινή χρήση στιγμιότυπου: -shotPagePrivacyMessage = Οποιοσδήποτε μπορεί να δει αυτό το στιγμιότυπο αν έχει το σύνδεσμο. -shotPageCopyImageText = - .label = Αντιγραφή κειμένου εικόνας -shotPageConfirmDeletion = Θέλετε σίγουρα να διαγράψετε οριστικά αυτό το στιγμιότυπο; -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Αν δεν κάνετε τίποτα, αυτό το στιγμιότυπο θα διαγραφεί οριστικά . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = ανάκτηση μέχρι { $date } -shotPageExpiredMessage = Αυτό το στιγμιότυπο έχει λήξει. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Ορίστε η σελίδα, από την οποία δημιουργήθηκε αρχικά: -shotPageDeleteButton = - .title = Διαγραφή στιγμιότυπου -shotPageDownloadShot = - .title = Λήψη -shotPageEditButton = - .title = Επεξεργασία εικόνας -shotPagefavoriteButton = - .title = Προσθήκη στιγμιότυπου στα αγαπημένα -shotPageBackToHomeButton = - .title = Αρχική σελίδα -shotPageAllShotsButton = - .title = Όλα τα στιγμιότυπα -shotPageScreenshotsDescriptionServerless = Τα στιγμιότυπα έγιναν εύκολη υπόθεση. Κάντε δημιουργία και λήψη μέσα από το Firefox. -shotPageDMCAMessage = Αυτό το στιγμιότυπο δεν είναι πλέον διαθέσιμο λόγω ισχυρισμού πνευματικής ιδιοκτησίας ενός τρίτου. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Παρακαλώ στείλτε email στο { $dmca } για να ζητήσετε περαιτέρω πληροφορίες. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Αν τα στιγμιότυπά σας υπόκεινται σε πολλαπλούς ισχυρισμούς, ενδέχεται να αποκλείσουμε την πρόσβασή σας στο Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Παρακαλώ συμπεριλάβετε το URL αυτού του στιγμιότυπου στο email σας: { $url } -shotPageKeepFor = Πόσο θα διατηρηθεί αυτό το στιγμιότυπο; -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Επιλέξτε χρόνο -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Επ' αόριστον ∞ -shotPageKeepTenMinutes = 10 λεπτά -shotPageKeepOneHour = 1 ώρα -shotPageKeepOneDay = 1 ημέρα -shotPageKeepOneWeek = 1 εβδομάδα -shotPageKeepTwoWeeks = 2 εβδομάδες -shotPageKeepOneMonth = 1 μήνας -shotPageSaveExpiration = αποθήκευση -shotPageCancelExpiration = ακύρωση -shotPageDoesNotExpire = δεν λήγει -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = λήγει -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = έληξε -timeDiffJustNow = μόλις τώρα -timeDiffMinutesAgo = - { $number -> - [one] 1 λεπτό πριν - *[other] { $number } λεπτά πριν - } -timeDiffHoursAgo = - { $number -> - [one] 1 ώρα πριν - *[other] { $number } ώρες πριν - } -timeDiffDaysAgo = - { $number -> - [one] χθες - *[other] { $number } ημέρες πριν - } -timeDiffFutureSeconds = σε λίγα δευτερόλεπτα -timeDiffFutureMinutes = - { $number -> - [one] σε 1 λεπτό - *[other] σε { $number } λεπτά - } -timeDiffFutureHours = - { $number -> - [one] σε 1 ώρα - *[other] σε { $number } ώρες - } -timeDiffFutureDays = - { $number -> - [one] αύριο - *[other] σε { $number } ημέρες - } -errorThirdPartyCookiesEnabled = Αν "τραβήξατε" αυτό το στιγμιότυπο και δεν μπορείτε να το διαγράψετε, ίσως χρειαστεί να ενεργοποιήσετε προσωρινά τα cookies τρίτων από τις προτιμήσεις του προγράμματος περιήγησής σας. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Κάντε σημειώσεις! -promoMessage = Ενημερωμένα εργαλεία επεξεργασίας για περικοπή, επισήμανση, ακόμη και προσθήκη κειμένου σε στιγμιότυπα. -promoLink = Δοκιμάστε τα -promoCloseButton = - .title = Κλείσιμο ειδοποίησης - -## Annotations - -annotationPenButton = - .title = Στυλό -annotationHighlighterButton = - .title = Μαρκαδόρος -annotationUndoButton = - .title = Αναίρεση -annotationRedoButton = - .title = Επανάληψη -annotationTextButton = - .title = Προσθήκη κειμένου -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Εκκαθάριση -annotationCropButton = - .title = Περικοπή -annotationSaveEditButton = Αποθήκευση - .title = Αποθήκευση επεξεργασίας -annotationCancelEditButton = Ακύρωση - .title = Ακύρωση επεξεργασίας -annotationCropConfirmButton = Επιβεβαίωση - .title = Επιβεβαίωση επιλογής -annotationCropCancelButton = Ακύρωση - .title = Ακύρωση επιλογής -annotationColorWhite = - .title = Λευκό -annotationColorBlack = - .title = Μαύρο -annotationColorRed = - .title = Κόκκινο -annotationColorGreen = - .title = Πράσινο -annotationColorBlue = - .title = Μπλε -annotationColorYellow = - .title = Κίτρινο -annotationColorPurple = - .title = Μοβ -annotationColorSeaGreen = - .title = Θαλασσόχρους -annotationColorGrey = - .title = Γκρι -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Μέγεθος κειμένου -# Values shown in text size selection dropdown -textSizeSmall = Μικρό -textSizeMedium = Μεσαίο -textSizeLarge = Μεγάλο -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Επιβεβαίωση - .title = Επιβεβαίωση -textToolCancelButton = Ακύρωση - .title = Ακύρωση -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Γεια σας - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Κάτι πήγε στραβά -copyImageErrorMessage = Αδυναμία αντιγραφής στιγμιότυπου στο πρόχειρο. - -## Settings Page - -settingsDisconnectButton = Αποσύνδεση - .title = Αποσύνδεση -settingsGuestAccountMessage = Λογαριασμός επισκέπτη -settingsSignInButton = Είσοδος - .title = Είσοδος -SettingsPageHeader = Ρυθμίσεις Firefox Screenshots -settingsFirefoxAccountSubHeader = Λογαριασμός Firefox -settingsClosePreferences = - .title = Κλείσιμο προτιμήσεων -settingsFxaDisconnectAlertMessage = Θέλετε σίγουρα να αποσυνδέσετε αυτή τη συσκευή από το λογαριασμό Firefox σας; -settingsFxaDisconnectDescription = Αν αποσυνδεθείτε, θα πρέπει να συνδεθείτε ξανά για να αποκτήσετε ξανά πρόσβαση στα στιγμιότυπά σας. -settingsFxaConnectDescription = Μπορείτε να συνδεθείτε για πρόσβαση στα στιγμιότυπά σας από όλες τις συσκευές σας. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Σφάλμα διαγραφής στιγμιότυπου: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Τα στιγμιότυπά μου: αναζήτηση για { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Σφάλμα εμφάνισης σελίδας: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Αναζήτηση στα στιγμιότυπά μου -shotIndexPageNoShotsMessage = Κανένα αποθηκευμένο στιγμιότυπο. -shotIndexPageNoShotsInvitation = Εμπρός, δημιουργήστε μερικά. -shotIndexPageLookingForShots = Αναζήτηση των στιγμιοτύπων σας… -shotIndexPageNoSearchResultsIntro = Χμμ -shotIndexPageNoSearchResults = Δεν μπορούμε να βρούμε κανένα στιγμιότυπο που να αντιστοιχεί στην αναζήτησή σας. -shotIndexPageMyShotsButton = - .title = Τα στιγμιότυπά μου -shotIndexPageClearSearchButton = - .title = Εκκαθάριση αναζήτησης -shotIndexPageConfirmShotDelete = Διαγραφή στιγμιότυπου; -shotIndexPagePreviousPage = - .title = Προηγούμενη σελίδα -shotIndexPageNextPage = - .title = Επόμενη σελίδα -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Αυτό δεν είναι ένα αγαπημένο στιγμιότυπο και θα λήξει -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Αυτό είναι ένα αγαπημένο στιγμιότυπο και δεν λήγει -shotIndexSyncedShot = - .title = Στιγμιότυπο από άλλη συσκευή -shotIndexAlertErrorFavoriteShot = Σφάλμα ενημέρωσης κατάστασης αγαπημένων στιγμιότυπων - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Θέλετε σίγουρα να διαγράψετε αυτό το στιγμιότυπο; -shotDeleteCancel = Ακύρωση - .title = Ακύρωση -shotDeleteConfirm = Διαγραφή - .title = Διαγραφή - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Για εξαγωγή: χρησιμοποιήστε το Αρχείο > Αποθήκευση σελίδας ως… και θα βρείτε τα στιγμιότυπα στο φάκελο { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Δείκτες Firefox Screenshots -metricsPageTotalsQueryTitle = Συνολικά -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Μια επισκόπηση του Screenshots -metricsPageTotalsQueryDevices = Σύνολο εγγεγραμμένων συσκευών -metricsPageTotalsQueryActiveShots = Ενεργά στιγμιότυπα -metricsPageTotalsQueryExpiredShots = Ληγμένα (αλλά ανακτήσιμα) -metricsPageTotalsQueryExpiredDeletedShots = Ληγμένα (και διαγραμμένα) -metricsPageShotsQueryTitle = Στιγμιότυπα ανά ημέρα -metricsPageShotsQueryDescription = Αριθμός στιγμιοτύπων που δημιουργούνται κάθε μέρα (για τις 30 τελευταίες ημέρες) -metricsPageShotsQueryCount = Αριθμός στιγμιοτύπων -metricsPageShotsQueryDay = Ημέρα -metricsPageUsersQueryTitle = Χρήστες ανά ημέρα -metricsPageUsersQueryDescription = Αριθμός χρηστών που δημιούργησαν τουλάχιστον ένα στιγμιότυπο, ανά ημέρα (τις τελευταίες 30 ημέρες) -metricsPageUsersQueryCount = Αριθμός χρηστών -metricsPageUsersQueryDay = Ημέρα -metricsPageUserShotsQueryTitle = Αριθμός στιγμιοτύπων ανά χρήστη -metricsPageUserShotsQueryDescription = Ο αριθμός των χρηστών που έχουν συνολικά N στιγμιότυπα -metricsPageUserShotsQueryCount = Αριθμός χρηστών -metricsPageUserShotsQueryShots = Κατά προσέγγιση αριθμός ενεργών (μη ληγμένων) στιγμιοτύπων -metricsPageRetentionQueryTitle = Διατήρηση ανά εβδομάδα -metricsPageRetentionQueryDescription = Αριθμός ημερών από το πρώτο μέχρι το πιο πρόσφατο στιγμιότυπο του χρήστη, ομαδοποιημένες από την αρχική εβδομάδα -metricsPageRetentionQueryUsers = Αριθμός χρηστών -metricsPageRetentionQueryDays = Ημέρες από από το πρώτο μέχρι το πιο πρόσφατο στιγμιότυπο του χρήστη -metricsPageRetentionQueryFirstWeek = Η εβδομάδα που ο χρήστης δημιούργησε το πρώτο στιγμιότυπο -metricsPageTotalRetentionQueryTitle = Συνολική διατήρηση -metricsPageTotalRetentionQueryDescription = Χρονικό διάστημα που οι χρήστες δημιουργούν στιγμιότυπα, ανά εβδομάδα -metricsPageTotalRetentionQueryUsers = Αριθμός χρηστών -metricsPageTotalRetentionQueryDays = Ημέρες που ο χρήστες δημιουργεί στιγμιότυπα -metricsPageVersionQueryTitle = Έκδοση προσθέτου -metricsPageVersionQueryDescription = Η έκδοση του προσθέτου που χρησιμοποιήθηκε κατά τη σύνδεση, τις τελευταίες 14 ημέρες -metricsPageVersionQueryUsers = Αριθμός συνδεδεμένων χρηστών -metricsPageVersionQueryVersion = Έκδοση προσθέτου -metricsPageVersionQueryLastSeen = Ημέρα -metricsPageHeader = Δείκτες -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Δημιουργήθηκε στις: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (χρόνος βάσης δεδομένων: { $time }ms) diff --git a/locales/en-CA/server.ftl b/locales/en-CA/server.ftl deleted file mode 100644 index 3b53f706aa..0000000000 --- a/locales/en-CA/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = My Shots -gHomeLink = Home -gNoShots = - .alt = No shots found -gScreenshotsDescriptionServerless = Screenshots made simple. Capture and download screenshots without leaving Firefox. - -## Header - -buttonSettings = - .title = Settings -buttonSignIn = - .title = Sign In -screenshotsLogo = - .title = Screenshots Home -bannerSignIn = Sign in or sign up to access your shots across devices and save your favourites forever. -bannerUpsell = { gScreenshotsDescription } Get Firefox now -shutdownWarning = Saved screenshots are expiring soon. Starting in June, Screenshots will no longer offer online storage. Want to keep shots from your library? Download them to your computer. -shutdownPageTitle = Screenshots is changing -shutdownPageDescription = Starting in June, Screenshots will no longer offer online storage. Want to keep shots from your library? Download shots individually or in batch. Thank you for using this feature, and we’re sorry for any inconvenience. -shutdownPageContinue = We hope you’ll continue to use Screenshots to capture, copy, and download shots. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = What’s new with Firefox Screenshots? -onboardingPromoMessage = Now, sign in to Screenshots with a Firefox Account and do more: -onboardingPromoMessageListItem1 = Access your library on all of your devices -onboardingPromoMessageListItem2 = Store your favourite shots forever -onboardingPromoDismissButton = Dismiss - .title = Dismiss -onboardingPromoSigninButton = Sign In - .title = Sign In - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Terms -footerLinkPrivacy = Privacy Notice -footerReportShot = Report Shot - .title = Report this shot for abuse, spam, or other problems -footerLinkFaqs = FAQs -footerLinkDMCA = Report IP Infringement -footerLinkDiscourse = Give Feedback -footerLinkRemoveAllData = Remove All Data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creating { $title } -creatingPageTitleDefault = page -creatingPageWaitMessage = Saving your shot - -## Home page - -homePageDescription = - .content = Intuitive screenshots baked right into the browser. Capture, save and share screenshots as you browse the Web using Firefox. -homePageButtonMyShots = Go To My Shots -homePageTeaser = Coming Soon… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Free Download -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = How Firefox Screenshots Works -homePageGetStartedTitle = Get Started -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Select the Screenshots icon from the page actions menu in the address bar, and the Screenshots menu will appear on top of your browser window. -homePageCaptureRegion = Capture a Region -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Click and drag to select the area you want to capture. Or just hover and click — Screenshots will select the area for you. Like what you see? Select Save to access your screenshot online or the down arrow button to download it to your computer. -homePageCapturePage = Capture a Page -homePageCapturePageDescription = Use the buttons in the upper right to capture full pages. The Save Visible button will capture the area you can view without scrolling, and Save Full Page will capture everything on the page. -homePageDownloadCopy = Download or Copy -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Take your best shot. Screenshots lets you download your selection or copy it right to your clipboard. -homePageLegalLink = Legal -homePagePrivacyLink = Privacy -homePageTermsLink = Terms -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Remove All Data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = You must have Firefox Screenshots installed or signed in to Firefox Account to delete your account -leavePageErrorGeneric = An error occurred -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = This will permanently erase all of your Firefox Screenshots data. -leavePageButtonProceed = Proceed -leavePageButtonCancel = Cancel -leavePageDeleted = All of your screenshots have been erased! - -## Not Found page - -notFoundPageTitle = Page Not Found -notFoundPageIntro = Oops. -notFoundPageDescription = Page not found. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Screenshot: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Error saving expiration -shotPageAlertErrorDeletingShot = Error deleting shot -shotPageAlertErrorUpdatingTitle = Error saving title -shotPageConfirmDelete = Are you sure you want to delete this shot permanently? -shotPageShareButton = - .title = Share -shotPageCopyButton = - .title = Copy image to clipboard -shotPageCopyActionLabel = Copy -shotPageCopied = Copied -shotPageShareFacebook = - .title = Share on Facebook -shotPageShareTwitter = - .title = Share on Twitter -shotPageSharePinterest = - .title = Share on Pinterest -shotPageShareEmail = - .title = Share link via email -shotPageShareLink = Get a shareable link to this shot: -shotPagePrivacyMessage = Anyone with the link can view this shot. -shotPageCopyImageText = - .label = Copy image text -shotPageConfirmDeletion = Are you sure you want to delete this shot permanently? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = If you do nothing, this shot will be permanently deleted . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restore until { $date } -shotPageExpiredMessage = This shot has expired. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Here is the page it was originally created from: -shotPageDeleteButton = - .title = Delete this shot -shotPageDownloadShot = - .title = Download -shotPageEditButton = - .title = Edit this image -shotPagefavoriteButton = - .title = Favourite this shot -shotPageBackToHomeButton = - .title = Homepage -shotPageAllShotsButton = - .title = All Shots -shotPageScreenshotsDescriptionServerless = Screenshots made simple. Capture and download screenshots without leaving Firefox. -shotPageDMCAMessage = This shot is no longer available due to a third party intellectual property claim. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Please email { $dmca } to request further information. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = If your Shots are subject to multiple claims, we may revoke your access to Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Please include the URL of this shot in your email: { $url } -shotPageKeepFor = How long should this shot be retained? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Select time -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinitely ∞ -shotPageKeepTenMinutes = 10 Minutes -shotPageKeepOneHour = 1 Hour -shotPageKeepOneDay = 1 Day -shotPageKeepOneWeek = 1 Week -shotPageKeepTwoWeeks = 2 Weeks -shotPageKeepOneMonth = 1 Month -shotPageSaveExpiration = save -shotPageCancelExpiration = cancel -shotPageDoesNotExpire = does not expire -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expires -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = expired -timeDiffJustNow = just now -timeDiffMinutesAgo = - { $number -> - [one] 1 minute ago - *[other] { $number } minutes ago - } -timeDiffHoursAgo = - { $number -> - [one] 1 hour ago - *[other] { $number } hours ago - } -timeDiffDaysAgo = - { $number -> - [one] yesterday - *[other] { $number } days ago - } -timeDiffFutureSeconds = in a few seconds -timeDiffFutureMinutes = - { $number -> - [one] in 1 minute - *[other] in { $number } minutes - } -timeDiffFutureHours = - { $number -> - [one] in 1 hour - *[other] in { $number } hours - } -timeDiffFutureDays = - { $number -> - [one] tomorrow - *[other] in { $number } days - } -errorThirdPartyCookiesEnabled = If you took this shot and cannot delete it, you may need to temporarily enable third party cookies from your browser’s preferences. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Take Note! -promoMessage = Updated editing tools let you crop, highlight, and even add text to your shot. -promoLink = Give them a try -promoCloseButton = - .title = Close notification - -## Annotations - -annotationPenButton = - .title = Pen -annotationHighlighterButton = - .title = Highlighter -annotationUndoButton = - .title = Undo -annotationRedoButton = - .title = Redo -annotationTextButton = - .title = Add text -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Clear -annotationCropButton = - .title = Crop -annotationSaveEditButton = Save - .title = Save edit -annotationCancelEditButton = Cancel - .title = Cancel editing -annotationCropConfirmButton = Confirm - .title = Confirm selection -annotationCropCancelButton = Cancel - .title = Cancel selection -annotationColorWhite = - .title = White -annotationColorBlack = - .title = Black -annotationColorRed = - .title = Red -annotationColorGreen = - .title = Green -annotationColorBlue = - .title = Blue -annotationColorYellow = - .title = Yellow -annotationColorPurple = - .title = Purple -annotationColorSeaGreen = - .title = Sea Green -annotationColorGrey = - .title = Grey -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Text size -# Values shown in text size selection dropdown -textSizeSmall = Small -textSizeMedium = Medium -textSizeLarge = Large -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirm - .title = Confirm -textToolCancelButton = Cancel - .title = Cancel -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hello - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Something went wrong -copyImageErrorMessage = Unable to copy your shot to the clipboard. - -## Settings Page - -settingsDisconnectButton = Disconnect - .title = Disconnect -settingsGuestAccountMessage = Guest Account -settingsSignInButton = Sign In - .title = Sign in -SettingsPageHeader = Firefox Screenshots Settings -settingsFirefoxAccountSubHeader = Firefox Account -settingsClosePreferences = - .title = Close preferences -settingsFxaDisconnectAlertMessage = Are you sure you want to disconnect this device from your Firefox Account? -settingsFxaDisconnectDescription = If you sign out, you will need to sign in again to regain access to your screenshots. -settingsFxaConnectDescription = You can sign in to access your screenshots across devices. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Error deleting shot: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = My Shots: search for { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Error rendering page: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Search my shots -shotIndexPageNoShotsMessage = No saved shots. -shotIndexPageNoShotsInvitation = Go on, create some. -shotIndexPageLookingForShots = Looking for your shots… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = We canʼt find any shots that match your search. -shotIndexPageMyShotsButton = - .title = My Shots -shotIndexPageClearSearchButton = - .title = Clear search -shotIndexPageConfirmShotDelete = Delete this shot? -shotIndexPagePreviousPage = - .title = Previous page -shotIndexPageNextPage = - .title = Next page -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = This is not a favourite shot and it will expire -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = This is a favourite shot and it does not expire -shotIndexSyncedShot = - .title = Shot taken on another device -shotIndexAlertErrorFavoriteShot = Error updating favourite shot status - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Are you sure you want to delete this shot? -shotDeleteCancel = Cancel - .title = Cancel -shotDeleteConfirm = Delete - .title = Delete - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = To export: use File > Save Page As… and you will find your screenshots in the folder { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots Metrics -metricsPageTotalsQueryTitle = Totals -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = An overview of Screenshots -metricsPageTotalsQueryDevices = Total devices registered -metricsPageTotalsQueryActiveShots = Active shots -metricsPageTotalsQueryExpiredShots = Expired (but recoverable) -metricsPageTotalsQueryExpiredDeletedShots = Expired (and deleted) -metricsPageShotsQueryTitle = Shots by Day -metricsPageShotsQueryDescription = Number of shots created each day (for the last 30 days) -metricsPageShotsQueryCount = Number of shots -metricsPageShotsQueryDay = Day -metricsPageUsersQueryTitle = Users by Day -metricsPageUsersQueryDescription = Number of users who created at least one shot, by day (last 30 days) -metricsPageUsersQueryCount = Number of users -metricsPageUsersQueryDay = Day -metricsPageUserShotsQueryTitle = Number of Shots per User -metricsPageUserShotsQueryDescription = The number of users who have about N total shots -metricsPageUserShotsQueryCount = Number of users -metricsPageUserShotsQueryShots = Approximate number of active (unexpired) shots -metricsPageRetentionQueryTitle = Retention by Week -metricsPageRetentionQueryDescription = Number of days from a userʼs first shot to most recent shot, grouped by starting week -metricsPageRetentionQueryUsers = Number of users -metricsPageRetentionQueryDays = Days from the userʼs first to most recent shot -metricsPageRetentionQueryFirstWeek = Week the user first created a shot -metricsPageTotalRetentionQueryTitle = Total Retention -metricsPageTotalRetentionQueryDescription = Length of time users have been creating shots, grouped by week -metricsPageTotalRetentionQueryUsers = Number of users -metricsPageTotalRetentionQueryDays = Days the user has been creating shots -metricsPageVersionQueryTitle = Add-on Version -metricsPageVersionQueryDescription = The version of the add-on used during sign-in, in the last 14 days -metricsPageVersionQueryUsers = Number of users signing in -metricsPageVersionQueryVersion = Add-on version -metricsPageVersionQueryLastSeen = Day -metricsPageHeader = Metrics -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generated at: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (database time: { $time }ms) diff --git a/locales/en-GB/server.ftl b/locales/en-GB/server.ftl deleted file mode 100644 index 2c68a1b5b7..0000000000 --- a/locales/en-GB/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = My Shots -gHomeLink = Home -gNoShots = - .alt = No shots found -gScreenshotsDescriptionServerless = Screenshots made simple. Capture and download screenshots without leaving Firefox. - -## Header - -buttonSettings = - .title = Settings -buttonSignIn = - .title = Sign In -screenshotsLogo = - .title = Screenshots Home -bannerSignIn = Sign in or sign up to access your shots across devices and save your favourites forever. -bannerUpsell = { gScreenshotsDescription } Get Firefox now -shutdownWarning = Saved screenshots are expiring soon. Starting in June, Screenshots will no longer offer online storage. Want to keep shots from your library? Download them to your computer. -shutdownPageTitle = Screenshots is changing -shutdownPageDescription = Starting in June, Screenshots will no longer offer online storage. Want to keep shots from your library? Download shots individually or in batch. Thank you for using this feature, and we’re sorry for any inconvenience. -shutdownPageContinue = We hope you’ll continue to use Screenshots to capture, copy, and download shots. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = What’s new with Firefox Screenshots? -onboardingPromoMessage = Now, sign in to Screenshots with a Firefox Account and do more: -onboardingPromoMessageListItem1 = Access your library on all of your devices -onboardingPromoMessageListItem2 = Store your favourite shots forever -onboardingPromoDismissButton = Dismiss - .title = Dismiss -onboardingPromoSigninButton = Sign In - .title = Sign In - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Terms -footerLinkPrivacy = Privacy Notice -footerReportShot = Report Shot - .title = Report this shot for abuse, spam, or other problems -footerLinkFaqs = FAQs -footerLinkDMCA = Report IP Infringement -footerLinkDiscourse = Give Feedback -footerLinkRemoveAllData = Remove All Data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creating { $title } -creatingPageTitleDefault = page -creatingPageWaitMessage = Saving your shot - -## Home page - -homePageDescription = - .content = Intuitive screenshots baked right into the browser. Capture, save and share screenshots as you browse the Web using Firefox. -homePageButtonMyShots = Go To My Shots -homePageTeaser = Coming Soon… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Free Download -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = How Firefox Screenshots Works -homePageGetStartedTitle = Get Started -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Select the Screenshots icon from the page actions menu in the address bar, and the Screenshots menu will appear on top of your browser window. -homePageCaptureRegion = Capture a Region -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Click and drag to select the area you want to capture. Or just hover and click — Screenshots will select the area for you. Like what you see? Select Save to access your screenshot online or the down arrow button to download it to your computer. -homePageCapturePage = Capture a Page -homePageCapturePageDescription = Use the buttons in the upper right to capture full pages. The Save Visible button will capture the area you can view without scrolling, and Save Full Page will capture everything on the page. -homePageDownloadCopy = Download or Copy -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Take your best shot. Screenshots lets you download your selection or copy it right to your clipboard. -homePageLegalLink = Legal -homePagePrivacyLink = Privacy -homePageTermsLink = Terms -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Remove All Data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = You must have Firefox Screenshots installed or signed in to Firefox Account to delete your account -leavePageErrorGeneric = An error occurred -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = This will permanently erase all of your Firefox Screenshots data. -leavePageButtonProceed = Proceed -leavePageButtonCancel = Cancel -leavePageDeleted = All of your screenshots have been erased! - -## Not Found page - -notFoundPageTitle = Page Not Found -notFoundPageIntro = Oops. -notFoundPageDescription = Page not found. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Screenshot: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Error saving expiration -shotPageAlertErrorDeletingShot = Error deleting shot -shotPageAlertErrorUpdatingTitle = Error saving title -shotPageConfirmDelete = Are you sure you want to delete this shot permanently? -shotPageShareButton = - .title = Share -shotPageCopyButton = - .title = Copy image to clipboard -shotPageCopyActionLabel = Copy -shotPageCopied = Copied -shotPageShareFacebook = - .title = Share on Facebook -shotPageShareTwitter = - .title = Share on Twitter -shotPageSharePinterest = - .title = Share on Pinterest -shotPageShareEmail = - .title = Share link via email -shotPageShareLink = Get a shareable link to this shot: -shotPagePrivacyMessage = Anyone with the link can view this shot. -shotPageCopyImageText = - .label = Copy image text -shotPageConfirmDeletion = Are you sure you want to delete this shot permanently? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = If you do nothing, this shot will be permanently deleted . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restore until { $date } -shotPageExpiredMessage = This shot has expired. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Here is the page it was originally created from: -shotPageDeleteButton = - .title = Delete this shot -shotPageDownloadShot = - .title = Download -shotPageEditButton = - .title = Edit this image -shotPagefavoriteButton = - .title = Favourite this shot -shotPageBackToHomeButton = - .title = Homepage -shotPageAllShotsButton = - .title = All Shots -shotPageScreenshotsDescriptionServerless = Screenshots made simple. Capture and download screenshots without leaving Firefox. -shotPageDMCAMessage = This shot is no longer available due to a third party intellectual property claim. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Please email { $dmca } to request further information. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = If your Shots are subject to multiple claims, we may revoke your access to Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Please include the URL of this shot in your email: { $url } -shotPageKeepFor = How long should this shot be retained? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Select time -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinitely ∞ -shotPageKeepTenMinutes = 10 Minutes -shotPageKeepOneHour = 1 Hour -shotPageKeepOneDay = 1 Day -shotPageKeepOneWeek = 1 Week -shotPageKeepTwoWeeks = 2 Weeks -shotPageKeepOneMonth = 1 Month -shotPageSaveExpiration = save -shotPageCancelExpiration = cancel -shotPageDoesNotExpire = does not expire -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expires -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = expired -timeDiffJustNow = just now -timeDiffMinutesAgo = - { $number -> - [one] 1 minute ago - *[other] { $number } minutes ago - } -timeDiffHoursAgo = - { $number -> - [one] 1 hour ago - *[other] { $number } hours ago - } -timeDiffDaysAgo = - { $number -> - [one] yesterday - *[other] { $number } days ago - } -timeDiffFutureSeconds = in a few seconds -timeDiffFutureMinutes = - { $number -> - [one] in 1 minute - *[other] in { $number } minutes - } -timeDiffFutureHours = - { $number -> - [one] in 1 hour - *[other] in { $number } hours - } -timeDiffFutureDays = - { $number -> - [one] tomorrow - *[other] in { $number } days - } -errorThirdPartyCookiesEnabled = If you took this shot and cannot delete it, you may need to temporarily enable third party cookies from your browser’s preferences. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Take Note! -promoMessage = Updated editing tools let you crop, highlight, and even add text to your shot. -promoLink = Give them a try -promoCloseButton = - .title = Close notification - -## Annotations - -annotationPenButton = - .title = Pen -annotationHighlighterButton = - .title = Highlighter -annotationUndoButton = - .title = Undo -annotationRedoButton = - .title = Redo -annotationTextButton = - .title = Add text -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Clear -annotationCropButton = - .title = Crop -annotationSaveEditButton = Save - .title = Save edit -annotationCancelEditButton = Cancel - .title = Cancel editing -annotationCropConfirmButton = Confirm - .title = Confirm selection -annotationCropCancelButton = Cancel - .title = Cancel selection -annotationColorWhite = - .title = White -annotationColorBlack = - .title = Black -annotationColorRed = - .title = Red -annotationColorGreen = - .title = Green -annotationColorBlue = - .title = Blue -annotationColorYellow = - .title = Yellow -annotationColorPurple = - .title = Purple -annotationColorSeaGreen = - .title = Sea Green -annotationColorGrey = - .title = Grey -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Text size -# Values shown in text size selection dropdown -textSizeSmall = Small -textSizeMedium = Medium -textSizeLarge = Large -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirm - .title = Confirm -textToolCancelButton = Cancel - .title = Cancel -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hello - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Something went wrong -copyImageErrorMessage = Unable to copy your shot to the clipboard. - -## Settings Page - -settingsDisconnectButton = Disconnect - .title = Disconnect -settingsGuestAccountMessage = Guest Account -settingsSignInButton = Sign In - .title = Sign in -SettingsPageHeader = Firefox Screenshots Settings -settingsFirefoxAccountSubHeader = Firefox Account -settingsClosePreferences = - .title = Close preferences -settingsFxaDisconnectAlertMessage = Are you sure you want to disconnect this device from your Firefox Account? -settingsFxaDisconnectDescription = If you sign out, you will need to sign in again to regain access to your screenshots. -settingsFxaConnectDescription = You can sign in to access your screenshots across devices. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Error deleting shot: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = My Shots: search for { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Error rendering page: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Search my shots -shotIndexPageNoShotsMessage = No saved shots. -shotIndexPageNoShotsInvitation = Go on, create some. -shotIndexPageLookingForShots = Looking for your shots… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = We canʼt find any shots that match your search. -shotIndexPageMyShotsButton = - .title = My Shots -shotIndexPageClearSearchButton = - .title = Clear search -shotIndexPageConfirmShotDelete = Delete this shot? -shotIndexPagePreviousPage = - .title = Previous page -shotIndexPageNextPage = - .title = Next page -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = This is not a favourite shot and it will expire -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = This is a favourite shot and it does not expire -shotIndexSyncedShot = - .title = Shot taken on another device -shotIndexAlertErrorFavoriteShot = Error updating favourite shot status - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Are you sure you want to delete this shot? -shotDeleteCancel = Cancel - .title = Cancel -shotDeleteConfirm = Delete - .title = Delete - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = To export: use File > Save Page As… and you will find your screenshots in the folder { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots Metrics -metricsPageTotalsQueryTitle = Totals -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = An overview of Screenshots -metricsPageTotalsQueryDevices = Total devices registered -metricsPageTotalsQueryActiveShots = Active shots -metricsPageTotalsQueryExpiredShots = Expired (but recoverable) -metricsPageTotalsQueryExpiredDeletedShots = Expired (and deleted) -metricsPageShotsQueryTitle = Shots by Day -metricsPageShotsQueryDescription = Number of shots created each day (for the last 30 days) -metricsPageShotsQueryCount = Number of shots -metricsPageShotsQueryDay = Day -metricsPageUsersQueryTitle = Users by Day -metricsPageUsersQueryDescription = Number of users who created at least one shot, by day (last 30 days) -metricsPageUsersQueryCount = Number of users -metricsPageUsersQueryDay = Day -metricsPageUserShotsQueryTitle = Number of Shots per User -metricsPageUserShotsQueryDescription = The number of users who have about N total shots -metricsPageUserShotsQueryCount = Number of users -metricsPageUserShotsQueryShots = Approximate number of active (unexpired) shots -metricsPageRetentionQueryTitle = Retention by Week -metricsPageRetentionQueryDescription = Number of days from a userʼs first shot to most recent shot, grouped by starting week -metricsPageRetentionQueryUsers = Number of users -metricsPageRetentionQueryDays = Days from the userʼs first to most recent shot -metricsPageRetentionQueryFirstWeek = Week the user first created a shot -metricsPageTotalRetentionQueryTitle = Total Retention -metricsPageTotalRetentionQueryDescription = Length of time users have been creating shots, grouped by week -metricsPageTotalRetentionQueryUsers = Number of users -metricsPageTotalRetentionQueryDays = Days the user has been creating shots -metricsPageVersionQueryTitle = Add-on Version -metricsPageVersionQueryDescription = The version of the add-on used during login, in the last 14 days -metricsPageVersionQueryUsers = Number of users logging in -metricsPageVersionQueryVersion = Add-on version -metricsPageVersionQueryLastSeen = Day -metricsPageHeader = Metrics -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generated at: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (database time: { $time }ms) diff --git a/locales/en-US/server.ftl b/locales/en-US/server.ftl deleted file mode 100644 index fd5433267f..0000000000 --- a/locales/en-US/server.ftl +++ /dev/null @@ -1,390 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - -## Global phrases shared across pages, prefixed with 'g' -gMyShots = My Shots -gHomeLink = Home -gNoShots = - .alt = No shots found -gScreenshotsDescriptionServerless = Screenshots made simple. Capture and download screenshots without leaving Firefox. - -## Header -buttonSettings = - .title = Settings -buttonSignIn = - .title = Sign In -screenshotsLogo = - .title = Screenshots Home -bannerSignIn = Sign in or sign up to access your shots across devices and save your favorites forever. -bannerUpsell = {gScreenshotsDescription} Get Firefox now -shutdownWarning = Saved screenshots are expiring soon. Starting in June, Screenshots will no longer offer online storage. Want to keep shots from your library? Download them to your computer. -shutdownPageTitle = Screenshots is changing -shutdownPageDescription = Starting in June, Screenshots will no longer offer online storage. Want to keep shots from your library? Download shots individually or in batch. Thank you for using this feature, and we’re sorry for any inconvenience. -shutdownPageContinue = We hope you’ll continue to use Screenshots to capture, copy, and download shots. - -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = What’s new with Firefox Screenshots? -onboardingPromoMessage = Now, sign in to Screenshots with a Firefox Account and do more: -onboardingPromoMessageListItem1 = Access your library on all of your devices -onboardingPromoMessageListItem2 = Store your favorite shots forever -onboardingPromoDismissButton = Dismiss - .title = Dismiss -onboardingPromoSigninButton = Sign In - .title = Sign In - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Terms -footerLinkPrivacy = Privacy Notice -footerReportShot = Report Shot - .title = Report this shot for abuse, spam, or other problems -footerLinkFaqs = FAQs -footerLinkDMCA = Report IP Infringement -footerLinkDiscourse = Give Feedback -footerLinkRemoveAllData = Remove All Data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creating { $title } -creatingPageTitleDefault = page -creatingPageWaitMessage = Saving your shot… - -## Home page - -homePageDescription = - .content = Intuitive screenshots baked right into the browser. Capture, save and share screenshots as you browse the Web using Firefox. -homePageButtonMyShots = Go To My Shots -homePageTeaser = Coming Soon… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Free Download -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = How Firefox Screenshots Works -homePageGetStartedTitle = Get Started -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Select the Screenshots icon from the page actions menu in the address bar, and the Screenshots menu will appear on top of your browser window. -homePageCaptureRegion = Capture a Region -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Click and drag to select the area you want to capture. Or just hover and click — Screenshots will select the area for you. Like what you see? Select Save to access your screenshot online or the down arrow button to download it to your computer. -homePageCapturePage = Capture a Page -homePageCapturePageDescription = Use the buttons in the upper right to capture full pages. The Save Visible button will capture the area you can view without scrolling, and Save Full Page will capture everything on the page. -homePageDownloadCopy = Download or Copy -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Take your best shot. Screenshots lets you download your selection or copy it right to your clipboard. -homePageLegalLink = Legal -homePagePrivacyLink = Privacy -homePageTermsLink = Terms -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Remove All Data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = You must have Firefox Screenshots installed or signed in to Firefox Account to delete your account -leavePageErrorGeneric = An error occurred -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = This will permanently erase all of your Firefox Screenshots data. -leavePageButtonProceed = Proceed -leavePageButtonCancel = Cancel -leavePageDeleted = All of your screenshots have been erased! - -## Not Found page - -notFoundPageTitle = Page Not Found -notFoundPageIntro = Oops. -notFoundPageDescription = Page not found. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Screenshot: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Error saving expiration -shotPageAlertErrorDeletingShot = Error deleting shot -shotPageAlertErrorUpdatingTitle = Error saving title -shotPageConfirmDelete = Are you sure you want to delete this shot permanently? -shotPageShareButton = - .title = Share -shotPageCopyButton = - .title = Copy image to clipboard -shotPageCopyActionLabel = Copy -shotPageCopied = Copied -shotPageShareFacebook = - .title = Share on Facebook -shotPageShareTwitter = - .title = Share on Twitter -shotPageSharePinterest = - .title = Share on Pinterest -shotPageShareEmail = - .title = Share link via email -shotPageShareLink = Get a shareable link to this shot: -shotPagePrivacyMessage = Anyone with the link can view this shot. -shotPageCopyImageText = - .label = Copy image text -shotPageConfirmDeletion = Are you sure you want to delete this shot permanently? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = If you do nothing, this shot will be permanently deleted . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restore until { $date } -shotPageExpiredMessage = This shot has expired. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Here is the page it was originally created from: -shotPageDeleteButton = - .title = Delete this shot -shotPageDownloadShot = - .title = Download -shotPageEditButton = - .title = Edit this image -shotPagefavoriteButton = - .title = Favorite this shot -shotPageBackToHomeButton = - .title = Homepage -shotPageAllShotsButton = - .title = All Shots -shotPageScreenshotsDescriptionServerless = Screenshots made simple. Capture and download screenshots without leaving Firefox. -shotPageDMCAMessage = This shot is no longer available due to a third party intellectual property claim. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Please email { $dmca } to request further information. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = If your Shots are subject to multiple claims, we may revoke your access to Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Please include the URL of this shot in your email: { $url } -shotPageKeepFor = How long should this shot be retained? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Select time -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinitely ∞ -shotPageKeepTenMinutes = 10 Minutes -shotPageKeepOneHour = 1 Hour -shotPageKeepOneDay = 1 Day -shotPageKeepOneWeek = 1 Week -shotPageKeepTwoWeeks = 2 Weeks -shotPageKeepOneMonth = 1 Month -shotPageSaveExpiration = save -shotPageCancelExpiration = cancel -shotPageDoesNotExpire = does not expire -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expires -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = expired -timeDiffJustNow = just now -timeDiffMinutesAgo = { $number -> - [one] 1 minute ago - *[other] { $number } minutes ago - } -timeDiffHoursAgo = { $number -> - [one] 1 hour ago - *[other] { $number } hours ago - } -timeDiffDaysAgo = { $number -> - [one] yesterday - *[other] { $number } days ago - } -timeDiffFutureSeconds = in a few seconds -timeDiffFutureMinutes = { $number -> - [one] in 1 minute - *[other] in { $number } minutes - } -timeDiffFutureHours = { $number -> - [one] in 1 hour - *[other] in { $number } hours - } -timeDiffFutureDays = { $number -> - [one] tomorrow - *[other] in { $number } days - } - -errorThirdPartyCookiesEnabled = If you took this shot and cannot delete it, you may need to temporarily enable third party cookies from your browser’s preferences. - -## Shot Page New Feature Promotion Dialog. -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Take Note! -promoMessage = Updated editing tools let you crop, highlight, and even add text to your shot. -promoLink = Give them a try -promoCloseButton = - .title = Close notification - -## Annotations - -annotationPenButton = - .title = Pen -annotationHighlighterButton = - .title = Highlighter -annotationUndoButton = - .title = Undo -annotationRedoButton = - .title = Redo -annotationTextButton = - .title = Add text -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Clear -annotationCropButton = - .title = Crop -annotationSaveEditButton = Save - .title = Save edit -annotationCancelEditButton = Cancel - .title = Cancel editing -annotationCropConfirmButton = Confirm - .title = Confirm selection -annotationCropCancelButton = Cancel - .title = Cancel selection -annotationColorWhite = - .title = White -annotationColorBlack = - .title = Black -annotationColorRed = - .title = Red -annotationColorGreen = - .title = Green -annotationColorBlue = - .title = Blue -annotationColorYellow = - .title = Yellow -annotationColorPurple = - .title = Purple -annotationColorSeaGreen = - .title = Sea Green -annotationColorGrey = - .title = Grey - -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Text size -# Values shown in text size selection dropdown -textSizeSmall = Small -textSizeMedium = Medium -textSizeLarge = Large -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirm - .title = Confirm -textToolCancelButton = Cancel - .title = Cancel -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hello - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Something went wrong -copyImageErrorMessage = Unable to copy your shot to the clipboard. - -## Settings Page - -settingsDisconnectButton = Disconnect - .title = Disconnect -settingsGuestAccountMessage = Guest Account -settingsSignInButton = Sign In - .title = Sign in -SettingsPageHeader = Firefox Screenshots Settings -settingsFirefoxAccountSubHeader = Firefox Account -settingsClosePreferences = - .title = Close preferences -settingsFxaDisconnectAlertMessage = Are you sure you want to disconnect this device from your Firefox Account? -settingsFxaDisconnectDescription = If you sign out, you will need to sign in again to regain access to your screenshots. -settingsFxaConnectDescription = You can sign in to access your screenshots across devices. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Error deleting shot: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = My Shots: search for { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Error rendering page: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Search my shots -shotIndexPageNoShotsMessage = No saved shots. -shotIndexPageNoShotsInvitation = Go on, create some. -shotIndexPageLookingForShots = Looking for your shots… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = We canʼt find any shots that match your search. -shotIndexPageMyShotsButton = - .title = My Shots -shotIndexPageClearSearchButton = - .title = Clear search -shotIndexPageConfirmShotDelete = Delete this shot? -shotIndexPagePreviousPage = - .title = Previous page -shotIndexPageNextPage = - .title = Next page -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = This is not a favorite shot and it will expire -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = This is a favorite shot and it does not expire -shotIndexSyncedShot = - .title = Shot taken on another device -shotIndexAlertErrorFavoriteShot = Error updating favorite shot status - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Are you sure you want to delete this shot? -shotDeleteCancel = Cancel - .title = Cancel -shotDeleteConfirm = Delete - .title = Delete - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = To export: use File > Save Page As… and you will find your screenshots in the folder { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots Metrics -metricsPageTotalsQueryTitle = Totals -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = An overview of Screenshots -metricsPageTotalsQueryDevices = Total devices registered -metricsPageTotalsQueryActiveShots = Active shots -metricsPageTotalsQueryExpiredShots = Expired (but recoverable) -metricsPageTotalsQueryExpiredDeletedShots = Expired (and deleted) -metricsPageShotsQueryTitle = Shots by Day -metricsPageShotsQueryDescription = Number of shots created each day (for the last 30 days) -metricsPageShotsQueryCount = Number of shots -metricsPageShotsQueryDay = Day -metricsPageUsersQueryTitle = Users by Day -metricsPageUsersQueryDescription = Number of users who created at least one shot, by day (last 30 days) -metricsPageUsersQueryCount = Number of users -metricsPageUsersQueryDay = Day -metricsPageUserShotsQueryTitle = Number of Shots per User -metricsPageUserShotsQueryDescription = The number of users who have about N total shots -metricsPageUserShotsQueryCount = Number of users -metricsPageUserShotsQueryShots = Approximate number of active (unexpired) shots -metricsPageRetentionQueryTitle = Retention by Week -metricsPageRetentionQueryDescription = Number of days from a userʼs first shot to most recent shot, grouped by starting week -metricsPageRetentionQueryUsers = Number of users -metricsPageRetentionQueryDays = Days from the userʼs first to most recent shot -metricsPageRetentionQueryFirstWeek = Week the user first created a shot -metricsPageTotalRetentionQueryTitle = Total Retention -metricsPageTotalRetentionQueryDescription = Length of time users have been creating shots, grouped by week -metricsPageTotalRetentionQueryUsers = Number of users -metricsPageTotalRetentionQueryDays = Days the user has been creating shots -metricsPageVersionQueryTitle = Add-on Version -metricsPageVersionQueryDescription = The version of the add-on used during login, in the last 14 days -metricsPageVersionQueryUsers = Number of users logging in -metricsPageVersionQueryVersion = Add-on version -metricsPageVersionQueryLastSeen = Day -metricsPageHeader = Metrics -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generated at: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (database time: { $time }ms) diff --git a/locales/en-ZA/server.ftl b/locales/en-ZA/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/en-ZA/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/eo/server.ftl b/locales/eo/server.ftl deleted file mode 100644 index 0b3a063cc6..0000000000 --- a/locales/eo/server.ftl +++ /dev/null @@ -1,387 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Miaj ekrankopioj -gHomeLink = Eka paĝo -gNoShots = - .alt = Neniu ekrankopio trovita - -## Header - -buttonSettings = - .title = Agordoj -buttonSignIn = - .title = Komenci seancon -screenshotsLogo = - .title = Eka paĝo de ekrankopioj -bannerSignIn = Komencu seancon aŭ registriĝu por aliri viajn ekrankopiojn en ĉiuj aparatoj kaj konservi la plej ŝatatajn por ĉiam. -bannerUpsell = { gScreenshotsDescription } Ricevi Firefox nun -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Kio estas nova en Firefox Screenshots? -onboardingPromoMessage = Nun komencu seancon en Screenshots per via konto de Firefox por: -onboardingPromoMessageListItem1 = Aliri vian bibliotekon ĉe viaj ĉiuj aparatoj -onboardingPromoMessageListItem2 = Konservi viajn plej ŝatatajn ekrankopiojn por ĉiam -onboardingPromoDismissButton = Ignori - .title = Ignori -onboardingPromoSigninButton = Komenci seancon - .title = Komenci seancon per via konto de Firefox - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Kondiĉoj -footerLinkPrivacy = Rimarko pri privateco -footerReportShot = Denunci ekrankopion - .title = Denunci tiun ĉi ekrankopion pro eksceso, trudmesaĝado aŭ aliaj problemoj -footerLinkFaqs = Oftaj demandoj -footerLinkDMCA = Raporti malobservon de IP -footerLinkDiscourse = Sendi komentojn -footerLinkRemoveAllData = Forigi ĉiujn datumojn - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } kreata -creatingPageTitleDefault = paĝo -creatingPageWaitMessage = Ekrankopio konservata… - -## Home page - -homePageDescription = - .content = Ekrankopioj intuiciaj, rekte en la retumilo. Faru, konservu kaj dividu ekrankopiojn dum vi retumas per Firefox. -homePageButtonMyShots = Iri al 'Miaj ekrankopioj' -homePageTeaser = Baldaŭ aperonta… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Senpaga elŝuto -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Kiel funkcias Firefox Screenshots -homePageGetStartedTitle = Unuaj paŝoj -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Elektu la emblemon de Firefox Screenshots en la menuo «Retaĝaj agoj» en la adresa strio, kaj la menuo aperos sur la fenestro de via retumilo. -homePageCaptureRegion = Kapti areon -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Alklaku kaŭ trenu por elekti la areon, kion vi volas kapti. Aŭ simple ŝvebu kaj alklaku — La ekrankopia ilo elektos la areon por vi. Ĉu vi ŝatas kion vi vidas? Elektu 'Konservi' por rete aliri vian ekrankopion aŭ la butonon kun la sageto malsupre por elŝuti al via komputilo. -homePageCapturePage = Kapti paĝon -homePageCapturePageDescription = Uzu la butonojn supre kaj dekstre por kapti tutajn paĝojn. La butono 'Konservi tion, kio videblas' kaptos la areon, kiun vi vidas se vi ne ŝovas. La butono 'Konservi tutan paĝon' kaptos ĉion en la paĝo. -homePageDownloadCopy = Elŝuti aŭ kopii -homePageLegalLink = Leĝaĵoj -homePagePrivacyLink = Privateco -homePageTermsLink = Kondiĉoj -homePageCookiesLink = Kuketoj - -## Leave Screenshots page - -leavePageRemoveAllData = Forigi ĉiujn datumojn -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Por forigi vian konton vi devas havi Firefox Screenshots instalita, aŭ esti komencinta seancon per via konto de Firefox -leavePageErrorGeneric = Eraro okazis -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Tio ĉi definitive forigos ĉiujn viajn datumojn de Firefox Screenshots. -leavePageButtonProceed = Fari -leavePageButtonCancel = Nuligi -leavePageDeleted = Ĉiuj viaj ekrankopioj estis forigitaj! - -## Not Found page - -notFoundPageTitle = Paĝo ne trovita -notFoundPageIntro = Fuŝ'. -notFoundPageDescription = Paĝo ne trovita - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Ekrankopio: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Eraro dum konservo de senvalidiĝo -shotPageAlertErrorDeletingShot = Eraro dum forigo de ekrankopio -shotPageAlertErrorUpdatingTitle = Eraro dum konservo de titolo -shotPageConfirmDelete = Ĉu vi certe volas definitive forigi tiun ĉi ekrankopion? -shotPageShareButton = - .title = Dividi -shotPageCopyButton = - .title = Kopii bildon al tondujo -shotPageCopyActionLabel = Kopii -shotPageCopied = Kopiita -shotPageShareFacebook = - .title = Dividi en Facebook -shotPageShareTwitter = - .title = Dividi en Twitter -shotPageSharePinterest = - .title = Dividi en Pinterest -shotPageShareEmail = - .title = Dividi ligilon retpoŝte -shotPageShareLink = Ricevi divideblan ligilon al tiu ĉi ekrankopio -shotPagePrivacyMessage = Ricevinte tiun ligilon, iu ajn povos vidi tiun ĉi ekrankopion. -shotPageCopyImageText = - .label = Kopii tekston de bildo -shotPageConfirmDeletion = Ĉu vi certe volas definitive forigi tiun ĉi ekrankopion? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Se vi faras nenion, tiu ĉi ekrankopio estos definitive forigita . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restarigi ĝis { $date } -shotPageExpiredMessage = Tiu ĉi ekrankopio senvalidiĝis. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Jen la paĝo el kiu ĝi estis origine kreita: -shotPageDeleteButton = - .title = Forigi tiun ĉi ekrankopion -shotPageDownloadShot = - .title = Elŝuti -shotPageEditButton = - .title = Redakti tiun ĉi bildon -shotPagefavoriteButton = - .title = Marki tiun ĉi ekrankopion kiel plejl ŝatatan -shotPageBackToHomeButton = - .title = Eka paĝo -shotPageAllShotsButton = - .title = Ĉiuj ekrankopioj -shotPageDMCAMessage = Tiu ĉi ekrankopio ne plu estas havebla pro plendo pri intelekta kopirajto. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Bonvolu skribi retpoŝte al { $dmca } por peti pli da informo. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Se viaj ekrankopioj ricevas plurajn plendojn, ni povus nuligi vian aliron al Ekrankopioj de Firefox. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Bonvolu aldoni la retadreson de tiu ĉi ekrankopio en via retpoŝto: { $url } -shotPageKeepFor = Kiel longe tiu ĉi ekrankopio devus esti gardita? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Elekti daŭron -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = senlime ∞ -shotPageKeepTenMinutes = 10 minutojn -shotPageKeepOneHour = horon -shotPageKeepOneDay = tagon -shotPageKeepOneWeek = semajnon -shotPageKeepTwoWeeks = 2 semajnojn -shotPageKeepOneMonth = monaton -shotPageSaveExpiration = konservi -shotPageCancelExpiration = nuligi -shotPageDoesNotExpire = ĉiam valida -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = senvalidiĝas -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = senvalidiĝis -timeDiffJustNow = ĵus -timeDiffMinutesAgo = - { $number -> - [one] antaŭ minuto - *[other] antaŭ { $number } minutoj - } -timeDiffHoursAgo = - { $number -> - [one] antaŭ horo - *[other] antaŭ { $number } horoj - } -timeDiffDaysAgo = - { $number -> - [one] hieraŭ - *[other] antaŭ { $number } tagoj - } -timeDiffFutureSeconds = post kelkaj sekundoj -timeDiffFutureMinutes = - { $number -> - [one] post minuto - *[other] post { $number } minutoj - } -timeDiffFutureHours = - { $number -> - [one] post horo - *[other] post { $number } horoj - } -timeDiffFutureDays = - { $number -> - [one] morgaŭ - *[other] post { $number } tagoj - } -errorThirdPartyCookiesEnabled = Se vi faris tiun ĉi ekrankopion kaj ne povas ĝin forigi, vi eble bezonos provizore aktivigi nerektajn kuketojn en la preferoj de via retumilo. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Faru noton! -promoMessage = La ĝisdatigitaj redaktiloj permesas al vi, eltondi, elstarigi kaj eĉ aldoni tekston al via ekrankopio. -promoLink = Provu ilin -promoCloseButton = - .title = Fermi sciigon - -## Annotations - -annotationPenButton = - .title = Skribilo -annotationHighlighterButton = - .title = Elstarigilo -annotationUndoButton = - .title = Malfari -annotationRedoButton = - .title = Refari -annotationTextButton = - .title = Aldoni tekston -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Viŝi -annotationCropButton = - .title = Eltondi -annotationSaveEditButton = Konservi - .title = Konservi redaktojn -annotationCancelEditButton = Nuligi - .title = Nuligi redaktojn -annotationCropConfirmButton = Konfirmi - .title = Konfirmi elekton -annotationCropCancelButton = Nuligi - .title = Nuligi elekton -annotationColorWhite = - .title = Blanka -annotationColorBlack = - .title = Nigra -annotationColorRed = - .title = Ruĝa -annotationColorGreen = - .title = Verda -annotationColorBlue = - .title = Blua -annotationColorYellow = - .title = Flava -annotationColorPurple = - .title = Purpura -annotationColorSeaGreen = - .title = Bluverda -annotationColorGrey = - .title = Griza -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Grando de teksto -# Values shown in text size selection dropdown -textSizeSmall = Eta -textSizeMedium = Meza -textSizeLarge = Granda -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Konfirmi - .title = Konfirmi -textToolCancelButton = Nuligi - .title = Nuligi -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Saluton - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Io ne bone funkciis -copyImageErrorMessage = Ne eblis kopii vian ekrankopion al la tondujo. - -## Settings Page - -settingsDisconnectButton = Malkonekti - .title = Malkonekti -settingsGuestAccountMessage = Gasta konto -settingsSignInButton = Komenci seancon - .title = Komenci seancon -SettingsPageHeader = Agordoj de Firefox Screenshots -settingsFirefoxAccountSubHeader = Konto de Firefox -settingsClosePreferences = - .title = Fermi preferojn -settingsFxaDisconnectAlertMessage = Ĉu vi certe volas malkonekti tiun ĉi aparaton de via konto de Firefox? -settingsFxaDisconnectDescription = Se vi finas la seancon, vi devos poste komenci novan por aliri denove viajn ekrankopiojn. -settingsFxaConnectDescription = Vi povas komenci seancon por aliri viajn ekrankopiojn en ĉiuj viaj aparatoj. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Eraro dum forigo de ekrankopio: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Miaj ekrankopioj: serĉi { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Eraro dum montro de ekrano: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Serĉi miajn ekrankopiojn -shotIndexPageNoShotsMessage = Neniu konservita ekrankopio. -shotIndexPageNoShotsInvitation = Ek, kreu kelkajn. -shotIndexPageLookingForShots = Ekrankopioj serĉataj… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Ni ne povis trovi iun ajn ekrankopion kiu kongruu kun via serĉo. -shotIndexPageMyShotsButton = - .title = Miaj ekrankopioj -shotIndexPageClearSearchButton = - .title = Viŝi serĉon -shotIndexPageConfirmShotDelete = Ĉu forigi tiun ĉi ekrankopion? -shotIndexPagePreviousPage = - .title = Antaŭa paĝo -shotIndexPageNextPage = - .title = Venonta paĝo -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Tiu ĉi ne estas plej ŝatata ekrankopio, kaj ĝi senvalidiĝos -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Tiu ĉi estas plej ŝatata ekrankopio, kiu ne senvalidiĝos -shotIndexSyncedShot = - .title = Ekrankopio farita en alia aparato -shotIndexAlertErrorFavoriteShot = Eraro dum aktualigo de stato de plej ŝatata ekrankopio - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Ĉu vi certe volas forigi tiun ĉi ekrankopion? -shotDeleteCancel = Nuligi - .title = Nuligi -shotDeleteConfirm = Forigi - .title = Forigi - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Statistikoj de Firefox Screenshots -metricsPageTotalsQueryTitle = Sumoj -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Superrigardo pri Screenshots -metricsPageTotalsQueryDevices = Kvanto de registritaj aparatoj -metricsPageTotalsQueryActiveShots = Aktivaj ekrankopioj -metricsPageTotalsQueryExpiredShots = Senvalidiĝintaj (sed rehaveblaj) -metricsPageTotalsQueryExpiredDeletedShots = Senvalidiĝintaj (kaj forigitaj) -metricsPageShotsQueryTitle = Ekrankopioj ĉiutage -metricsPageShotsQueryDescription = Nombro de ekrankopioj ĉiutage (por la lastaj 30 tagoj) -metricsPageShotsQueryCount = Nombro de ekrankopioj -metricsPageShotsQueryDay = Tago -metricsPageUsersQueryTitle = Uzantoj ĉiutage -metricsPageUsersQueryDescription = Nombro de uzantoj kiuj kreis minimume unu ekrankopion, ĉiutage (lastaj 30 tagoj) -metricsPageUsersQueryCount = Nombro de uzantoj -metricsPageUsersQueryDay = Tago -metricsPageUserShotsQueryTitle = Nombro de ekrankopioj por uzanto -metricsPageUserShotsQueryDescription = La nombro de uzantoj kiuj havas pli malpli N ekrankopiojn entute -metricsPageUserShotsQueryCount = Nombro de uzantoj -metricsPageUserShotsQueryShots = Proksimuma nombro de aktivaj (ne senvalidiĝintaj) ekrankopioj -metricsPageRetentionQueryTitle = Pluuzado ĉiusemajne -metricsPageRetentionQueryDescription = Nombro de tagoj inter la unua kaj lasta ekrankopio de uzanto, grupigitaj laŭ la unua semajno -metricsPageRetentionQueryUsers = Nombro de uzantoj -metricsPageRetentionQueryDays = Tagoj inter la unua kaj lasta ekrankopio de la uzanto -metricsPageRetentionQueryFirstWeek = Semajno, kiam la uzanto kreis la unuan ekrankopion -metricsPageTotalRetentionQueryTitle = Pluuzado entute -metricsPageTotalRetentionQueryDescription = Tempo, dum kiu uzantoj kreis ekrankopiojn, grupigita laŭ semajno -metricsPageTotalRetentionQueryUsers = Nombro de uzantoj -metricsPageTotalRetentionQueryDays = Tagoj, dum kiuj la uzanto kreis ekrankopiojn -metricsPageVersionQueryTitle = Versio de aldonaĵo -metricsPageVersionQueryDescription = La versio de la aldonaĵo uzita por komenci seancon, dum la lastaj 14 tagoj -metricsPageVersionQueryUsers = Nombro de uzantoj kun seancoj komencitaj -metricsPageVersionQueryVersion = Versio de aldonaĵo -metricsPageVersionQueryLastSeen = Tago -metricsPageHeader = Statistikoj -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Kreitaj je: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (datumbaza tempo: { $time }ms) diff --git a/locales/es-AR/server.ftl b/locales/es-AR/server.ftl deleted file mode 100644 index 956598fcf2..0000000000 --- a/locales/es-AR/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mis capturas -gHomeLink = Inicio -gNoShots = - .alt = No se encontraron capturas -gScreenshotsDescriptionServerless = Capturas de pantalla simplificadas. Sacá y descargá capturas de pantalla sin salir de Firefox. - -## Header - -buttonSettings = - .title = Ajustes -buttonSignIn = - .title = Ingresar -screenshotsLogo = - .title = Página de inicio de Screenshots -bannerSignIn = Inicie la sesión o regístrese para acceder a sus fotos en todos los dispositivos y guardar sus favoritos para siempre. -bannerUpsell = { gScreenshotsDescription } Obtener Firefox ahora -shutdownWarning = Las capturas de pantalla guardadas serán eliminadas en breve. A partir de junio Screenshots ya no ofrecerá almacenamiento en línea. Si querés mantener las capturas de tu biblioteca Descargalas a tu computadora. -shutdownPageTitle = Screenshots está cambiando -shutdownPageDescription = A partir de junio, Screenshots ya no ofrecerá almacenamiento en línea. ¿Querés mantener las capturas de tu biblioteca? Descargalas individualmente o en lote . Gracias por usar esta función, y lamentamos cualquier inconveniente. -shutdownPageContinue = Esperamos que sigas usando Screenshots para tomar, copiar y descargar capturas de pantalla. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = ¿Qué hay de nuevo en Firefox Screenshots? -onboardingPromoMessage = Ahora, iniciá la sesión en Screenshots con una cuenta de Firefox y ahorrá tiempo: -onboardingPromoMessageListItem1 = Accedé a tu biblioteca en todos tus dispositivos -onboardingPromoMessageListItem2 = Almacená tus fotos favoritas para siempre -onboardingPromoDismissButton = Descartar - .title = Descartar -onboardingPromoSigninButton = Iniciar sesión - .title = Iniciar sesión - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Términos -footerLinkPrivacy = Nota de privacidad -footerReportShot = Informar acerca de la captura - .title = Informar acerca de la captura por ser abuso, correo basura u otros problemas -footerLinkFaqs = Preguntas frecuentes -footerLinkDMCA = Informar infracción de PI -footerLinkDiscourse = Enviar opinión -footerLinkRemoveAllData = Eliminar todos los datos - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creando { $title } -creatingPageTitleDefault = página -creatingPageWaitMessage = Guardando captura… - -## Home page - -homePageDescription = - .content = Capturas de pantalla intuitivas metidas en el navegador. Capturá, guardá y compartí capturas mientras navegás la web usando Firefox. -homePageButtonMyShots = Ir a mis capturas -homePageTeaser = Próximamente… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Descarga gratuita -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Como funciona Firefox Screenshots -homePageGetStartedTitle = Primeros pasos -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Seleccioná el ícono de Screenshots en el menú de acciones de la barra de direcciones y aparecerá el menú en la parte superior de la ventana del navegador. -homePageCaptureRegion = Capturar una región -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Hacé clic y arrastrá para seleccionar el área que querés capturar. O simplemente pasá por encima y hace clic — Screenshots seleccionará el área para vos. ¿Te gusta lo que ves? Seleccioná Guardar para acceder a tu captura en línea o el botón con la flecha hacia abajo para guardarla en tu computadora. -homePageCapturePage = Capturar una página -homePageCapturePageDescription = Usá los botones en la parte superior derecha para capturar la página completa. El botón Guardar Visibe capturará el área que se puede ver sin desplazarse y Guardar Página Completa capturará todo en la página. -homePageDownloadCopy = Descargar o copiar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Sacá tu mejor foto. Screenshots te permite descargar tu selección o copiarla directamente en tu portapapeles. -homePageLegalLink = Legales -homePagePrivacyLink = Privacidad -homePageTermsLink = Términos -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Eliminar todos los datos -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Debe tener Firefox Screenshots instalado o iniciada la sesión en la cuenta de Firefox para eliminar su cuenta -leavePageErrorGeneric = Ocurrió un error -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Esto borrará de forma permanente todos tus datos de Firefox Screenshots. -leavePageButtonProceed = Continuar -leavePageButtonCancel = Cancelar -leavePageDeleted = ¡Todas tus capturas fueron borradas! - -## Not Found page - -notFoundPageTitle = Página no encontrada -notFoundPageIntro = Epa. -notFoundPageDescription = Página no encontrada. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Captura: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Error guardando expiración -shotPageAlertErrorDeletingShot = Error borrando captura -shotPageAlertErrorUpdatingTitle = Error guardando título -shotPageConfirmDelete = ¿Está seguro de querer borrar esta captura permanentemente? -shotPageShareButton = - .title = Compartir -shotPageCopyButton = - .title = Copiar la imagen al portapapeles -shotPageCopyActionLabel = Copiar -shotPageCopied = Copiada -shotPageShareFacebook = - .title = Compartir en Facebook -shotPageShareTwitter = - .title = Compartir en Twitter -shotPageSharePinterest = - .title = Compartir en Pinterest -shotPageShareEmail = - .title = Compartir enlace por correo electrónico -shotPageShareLink = Obtener un enlace compartible para esta captura: -shotPagePrivacyMessage = Cualquiera con el enlace puede ver esta captura. -shotPageCopyImageText = - .label = Copiar texto de imagen -shotPageConfirmDeletion = ¿Está seguro de querer borrar esta captura permanentemente? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Si no hacés nada, esta captura será permanentemente eliminada . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaurar hasta { $date } -shotPageExpiredMessage = Esta captura ha expirado. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Esta es la página de la que fue originalmente creada: -shotPageDeleteButton = - .title = Borrar esta captura -shotPageDownloadShot = - .title = Descargar -shotPageEditButton = - .title = Editar esta imagen -shotPagefavoriteButton = - .title = Marcar esta captura como favorita -shotPageBackToHomeButton = - .title = Página de inicio -shotPageAllShotsButton = - .title = Todas las capturas -shotPageScreenshotsDescriptionServerless = Capturas de pantalla simplificadas. Sacá y descargá capturas de pantalla sin salir de Firefox. -shotPageDMCAMessage = La captura no está más disponible por una queja de terceros por propiedad intelectual. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Enviá un correo electrónico a { $dmca } para pedir más información. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Si tus capturas reciben múltiples reclamos, podemos revocar tu acceso a Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Incluí la URL de esta captura en tu correo electrónico: { $url } -shotPageKeepFor = ¿Cuánto tiempo debería mantenerse esta captura? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Seleccionar tiempo -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinidamente ∞ -shotPageKeepTenMinutes = 10 minutos -shotPageKeepOneHour = 1 hora -shotPageKeepOneDay = 1 día -shotPageKeepOneWeek = 1 semana -shotPageKeepTwoWeeks = 2 semanas -shotPageKeepOneMonth = 1 mes -shotPageSaveExpiration = guardar -shotPageCancelExpiration = cancelar -shotPageDoesNotExpire = no expira -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expira -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = expirada -timeDiffJustNow = ahora mismo -timeDiffMinutesAgo = - { $number -> - [one] hace un minuto - *[other] hace { $number } minutos - } -timeDiffHoursAgo = - { $number -> - [one] hace una hora - *[other] hace { $number } horas - } -timeDiffDaysAgo = - { $number -> - [one] ayer - *[other] hace { $number } días - } -timeDiffFutureSeconds = en unos pocos segundos -timeDiffFutureMinutes = - { $number -> - [one] en 1 minuto - *[other] en { $number } minutos - } -timeDiffFutureHours = - { $number -> - [one] en 1 hora - *[other] en { $number } horas - } -timeDiffFutureDays = - { $number -> - [one] mañana - *[other] en { $number } días - } -errorThirdPartyCookiesEnabled = Si hizo esta captura y no puede eliminarla, puede ser necesario que habilite temporalmente cookies de terceros en las preferencias del navegador. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = ¡Tome nota! -promoMessage = Las herramientas de edición actualizadas le permiten cortar, destacar e incluso añadir texto a su captura. -promoLink = Pruébelas -promoCloseButton = - .title = Cerrar la notificación - -## Annotations - -annotationPenButton = - .title = Lapicera -annotationHighlighterButton = - .title = Resaltador -annotationUndoButton = - .title = Deshacer -annotationRedoButton = - .title = Rehacer -annotationTextButton = - .title = Agregar texto -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Limpiar -annotationCropButton = - .title = Recortar -annotationSaveEditButton = Guardar - .title = Guardar edición -annotationCancelEditButton = Cancelar - .title = Cancelar edición -annotationCropConfirmButton = Confirmar - .title = Confirmar selección -annotationCropCancelButton = Cancelar - .title = Cancelar selección -annotationColorWhite = - .title = Blanco -annotationColorBlack = - .title = Negro -annotationColorRed = - .title = Rojo -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Azul -annotationColorYellow = - .title = Amarillo -annotationColorPurple = - .title = Púrpura -annotationColorSeaGreen = - .title = Verde mar -annotationColorGrey = - .title = Gris -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tamaño del texto -# Values shown in text size selection dropdown -textSizeSmall = Pequeño -textSizeMedium = Mediano -textSizeLarge = Grande -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirmar - .title = Confirmar -textToolCancelButton = Cancelar - .title = Cancelar -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hola - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Algo salió mal -copyImageErrorMessage = No se puede copiar su captura en el portapapeles. - -## Settings Page - -settingsDisconnectButton = Desconectar - .title = Desconectar -settingsGuestAccountMessage = Cuenta de invitado -settingsSignInButton = Iniciar sesión - .title = Iniciar sesión -SettingsPageHeader = Configuración de Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox Account -settingsClosePreferences = - .title = Cerrar preferencias -settingsFxaDisconnectAlertMessage = ¿Seguro que querés desconectar este dispositivo de tu cuenta de Firefox? -settingsFxaDisconnectDescription = Si cerrás la sesión, tendrás que volver a iniciar la para recuperar el acceso a tus capturas de pantalla. -settingsFxaConnectDescription = Puede iniciar sesión para acceder a sus capturas de pantalla a través de dispositivos. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Error borrando captura: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mis capturas: búsqueda de { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Error dibujando la página: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Buscar mis capturas -shotIndexPageNoShotsMessage = No hay capturas guardadas. -shotIndexPageNoShotsInvitation = Vamos, create alguna. -shotIndexPageLookingForShots = Buscando tus capturas… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = No podemos encontrar capturas que coincidan con la búsqueda. -shotIndexPageMyShotsButton = - .title = Mis capturas -shotIndexPageClearSearchButton = - .title = Borrar búsqueda -shotIndexPageConfirmShotDelete = ¿Borrar esta captura? -shotIndexPagePreviousPage = - .title = Página anterior -shotIndexPageNextPage = - .title = Página siguiente -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Esta no es una captura favorita y tendrá fecha de vencimiento -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Esta es una captura favorita y no se vence -shotIndexSyncedShot = - .title = Captura tomada en otro dispositivo -shotIndexAlertErrorFavoriteShot = Error al actualizar el estado de la captura favorita - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = ¿Está seguro de que quiere eliminar esta captura? -shotDeleteCancel = Cancelar - .title = Cancelar -shotDeleteConfirm = Eliminar - .title = Eliminar - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Para exportar: usá Archivo> Guardar página como... y encontrarás tus capturas de pantalla en la carpeta { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Métricas de Firefox Screenshots -metricsPageTotalsQueryTitle = Totales -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Una visión general de Screenshots -metricsPageTotalsQueryDevices = Dispositivos registrados totales -metricsPageTotalsQueryActiveShots = Capturas activas -metricsPageTotalsQueryExpiredShots = Expirada (pero recuperable) -metricsPageTotalsQueryExpiredDeletedShots = Expirada (y borrada) -metricsPageShotsQueryTitle = Capturas por día -metricsPageShotsQueryDescription = Número de capturas creadas cada día (los últimos 30 días) -metricsPageShotsQueryCount = Número de capturas -metricsPageShotsQueryDay = Día -metricsPageUsersQueryTitle = Usuarios por día -metricsPageUsersQueryDescription = Número de usuarios que crearon al menos una captura, por día (últimos 30 días) -metricsPageUsersQueryCount = Número de usuarios -metricsPageUsersQueryDay = Día -metricsPageUserShotsQueryTitle = Número de capturas por usuario -metricsPageUserShotsQueryDescription = El número de usuarios que tienen cerca de N capturas totales -metricsPageUserShotsQueryCount = Número de usuarios -metricsPageUserShotsQueryShots = Número aproximado de capturas activas (no expiradas) -metricsPageRetentionQueryTitle = Retención por semana -metricsPageRetentionQueryDescription = Número de días desde la primera captura del usuario hasta la más reciente, agrupadas por semana de inicio. -metricsPageRetentionQueryUsers = Número de usuarios -metricsPageRetentionQueryDays = Días desde la primera captura del usuario hasta la más reciente -metricsPageRetentionQueryFirstWeek = Semana en la que el usuario creo la primera captura -metricsPageTotalRetentionQueryTitle = Retención total -metricsPageTotalRetentionQueryDescription = Cantidad de tiempo que los usuarios han estado creando capturas, agrupado por semana. -metricsPageTotalRetentionQueryUsers = Número de usuarios -metricsPageTotalRetentionQueryDays = Días que el usuario ha estado creando capturas -metricsPageVersionQueryTitle = Versión del complemento -metricsPageVersionQueryDescription = La versión del complemento usado durante el ingreso, en los últimos 14 días -metricsPageVersionQueryUsers = Número de usuarios ingresados -metricsPageVersionQueryVersion = Versión del complemento -metricsPageVersionQueryLastSeen = Día -metricsPageHeader = Métricas -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generada el: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (tiempo de la base de datos: { $time }ms) diff --git a/locales/es-CL/server.ftl b/locales/es-CL/server.ftl deleted file mode 100644 index 7e228284fa..0000000000 --- a/locales/es-CL/server.ftl +++ /dev/null @@ -1,396 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mis capturas -gHomeLink = Inicio -gNoShots = - .alt = No se econtraron capturas -gScreenshotsDescriptionServerless = Capturas de pantalla simplificadas. Toma capturas de pantalla y descárgalas sin salir de Firefox. - -## Header - -buttonSettings = - .title = Ajustes -buttonSignIn = - .title = Conectarse -screenshotsLogo = - .title = Inicio de Screenshots -bannerSignIn = Conéctate o regístrate para acceder a tus capturas en todos tus dispositivos y guardar tus favoritas para siempre. -bannerUpsell = { gScreenshotsDescription } Obtener Firefox ahora -shutdownWarning = Las capturas de pantalla guardadas serán eliminadas dentro de poco. A partir de junio Screenshots ya no ofrecerá almacenamiento en línea. ¿Quieres mantener las capturas de tu biblioteca? Descárgalas a tu computador. -shutdownPageTitle = Screenshots está cambiando -shutdownPageDescription = Desde junio, Screenshots ya no ofrecerá almacenamiento en línea. ¿Quieres mantener tus capturas que tienes en la biblioteca? Bájalas de forma individual o en lote. Gracias por usar esta función, y lamentamos cualquier inconveniente. -shutdownPageContinue = Esperamos que sigas usando Screenshots para capturar, copiar y descargar capturas. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = ¿Qué hay de nuevo en Firefox Screenshots? -onboardingPromoMessage = Ahora, conéctate a Screenshots con una cuenta de Firefox y haz más: -onboardingPromoMessageListItem1 = Accede a tu biblioteca desde todos tus dispositivos -onboardingPromoMessageListItem2 = Almacena tus capturas favoritas por siempre -onboardingPromoDismissButton = Ocultar - .title = Ocultar -onboardingPromoSigninButton = Conectarse - .title = Conectarse - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Términos -footerLinkPrivacy = Aviso de privacidad -footerReportShot = Reportar captura - .title = Reportar esta captura por abuso, spam u otro problema -footerLinkFaqs = Preguntas frecuentes -footerLinkDMCA = Reportar infracción de PI -footerLinkDiscourse = Enviar comentario -footerLinkRemoveAllData = Eliminar todos los datos - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creando { $title } -creatingPageTitleDefault = página -creatingPageWaitMessage = Guardando tu captura… - -## Home page - -homePageDescription = - .content = Capturas de pantalla intuitivas integradas en el navegador. Captura, guarda y comparte las capturas mientras navegas por la Web usando Firefox. -homePageButtonMyShots = Ir a mis capturas -homePageTeaser = Próximamente… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Descarga gratuita -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Cómo funciona Firefox Screenshots -homePageGetStartedTitle = Empezar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Selecciona el ícono de Screenshots en el menú de acciones de página en la barra de direcciones, y el menú de Screenshots aparecerá sobre tu ventana del navegador. -homePageCaptureRegion = Captura una región -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Haz clic y arrastra para seleccionar el área que quieres capturar. O solo colocate sobre una parte y haz clic — Screenshots seleccionará el área por ti. ¿Te gusta lo que ves? Selecciona Guardar para acceder a tu captura de pantalla en línea o el botón con forma de flecha apuntando hacia abajo para descargarla a tu computador. -homePageCapturePage = Captura una página -homePageCapturePageDescription = Usa los botones en la parte superior derecha para capturar páginas completas. El botón para guardar lo visible capturará el área que puedes ver sin desplazarte por la página, y el de guardar la página completa capturará incluso lo que se encuentre más arriba o abajo de la pantalla. -homePageDownloadCopy = Descargar o copiar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Saca la mejor captura. Screenshots te permite descargar tu selección o copiarla directamente en el portapapeles. -homePageLegalLink = Legal -homePagePrivacyLink = Privacidad -homePageTermsLink = Términos -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Eliminar todos los datos -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Debes tener Firefox Screenshots instalado o conectarte a tu cuenta de Firefox para eliminar tu cuenta. -leavePageErrorGeneric = Ocurrió un error -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Esto eliminará permanentemente todos tus datos de Firefox Screenshots -leavePageButtonProceed = Proceder -leavePageButtonCancel = Cancelar -leavePageDeleted = ¡Todas tus capturas fueron eliminadas! - -## Not Found page - -notFoundPageTitle = Página no encontrada -notFoundPageIntro = Chuta. -notFoundPageDescription = Página no encontrada. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Captura: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Error al guardar fecha de expiración -shotPageAlertErrorDeletingShot = Error al eliminar captura -shotPageAlertErrorUpdatingTitle = Error al guardar el título -shotPageConfirmDelete = ¿Estás seguro de que quieres eliminar esta captura permanentemente? -shotPageShareButton = - .title = Compartir -shotPageCopyButton = - .title = Copiar imagen al portapapeles -shotPageCopyActionLabel = Copiar -shotPageCopied = Copiada -shotPageShareFacebook = - .title = Compartir en Facebook -shotPageShareTwitter = - .title = Compartir en Twitter -shotPageSharePinterest = - .title = Compartir en Pinterest -shotPageShareEmail = - .title = Compartir enlace por correo electrónico -shotPageShareLink = Obtener un enlace compartible para esta captura: -shotPagePrivacyMessage = Cualquiera que tenga el enlace puede ver esta captura. -shotPageCopyImageText = - .label = Copiar texto de la imagen -shotPageConfirmDeletion = ¿Estás seguro de que quieres eliminar esta captura de forma permanente? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Si no haces nada, esta captura se eliminará de forma permanente en . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaurar hasta { $date } -shotPageExpiredMessage = Esta captura ha expirado. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Esta es la página de la que fue originalmente creada: -shotPageDeleteButton = - .title = Borrar esta captura -shotPageDownloadShot = - .title = Descargar -shotPageEditButton = - .title = Editar esta imagen -shotPagefavoriteButton = - .title = Marcar esta captura como favorita -shotPageBackToHomeButton = - .title = Página de inicio -shotPageAllShotsButton = - .title = Todas las capturas -shotPageScreenshotsDescriptionServerless = Capturas de pantalla simplificadas. Toma capturas de pantalla y descárgalas sin salir de Firefox. -shotPageDMCAMessage = Esta captura ya no eá disponible debido a un reclamo de propiedad intelectual de un tercero. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Por favor, envía un correo a { $dmca } para solicitar más información. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Si tus capturas recibiesen muchos reclamos, podríamos revocar tu acceso a Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Por favor, incluye la URL de esta captura en tu correo: { $url } -shotPageKeepFor = ¿Cuánto tiempo debiera ser guardada esta captura? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Seleccionar tiempo -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinidamente ∞ -shotPageKeepTenMinutes = 10 minutos -shotPageKeepOneHour = 1 hora -shotPageKeepOneDay = 1 día -shotPageKeepOneWeek = 1 semana -shotPageKeepTwoWeeks = 2 semanas -shotPageKeepOneMonth = 1 mes -shotPageSaveExpiration = guardar -shotPageCancelExpiration = cancelar -shotPageDoesNotExpire = no expira -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expira en -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = expiró hace -timeDiffJustNow = justo ahora -timeDiffMinutesAgo = - { $number -> - [one] hace 1 minuto - *[other] hace { $number } minutos - } -timeDiffHoursAgo = - { $number -> - [one] hace 1 hora - *[other] hace { $number } horas - } -timeDiffDaysAgo = - { $number -> - *[one] ayer - } -timeDiffFutureSeconds = en unos segundos -timeDiffFutureMinutes = - { $number -> - [one] en 1 minuto - *[other] en { $number } minutos - } -timeDiffFutureHours = - { $number -> - [one] en 1 hora - *[other] en { $number } horas - } -timeDiffFutureDays = - { $number -> - [one] mañana - *[other] en { $number } días - } -errorThirdPartyCookiesEnabled = Si tomaste esta captura y no puedes eliminarla, puede que debas activar temporalmente las cookies de terceros en las preferencias de tu navegador. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = ¡Toma nota! -promoMessage = Las herramientas de edición actualizadas te permiten cortar, destacar e incluso añadir texto a tu captura. -promoLink = Pruébalas -promoCloseButton = - .title = Cerrar notificación - -## Annotations - -annotationPenButton = - .title = Lápiz -annotationHighlighterButton = - .title = Destacador -annotationUndoButton = - .title = Deshacer -annotationRedoButton = - .title = Rehacer -annotationTextButton = - .title = Añadir texto -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Limpiar -annotationCropButton = - .title = Recortar -annotationSaveEditButton = Guardar - .title = Guardar edición -annotationCancelEditButton = Cancelar - .title = Cancelar edición -annotationCropConfirmButton = Confirmar - .title = Confirmar selección -annotationCropCancelButton = Cancelar - .title = Cancelar selección -annotationColorWhite = - .title = Blanco -annotationColorBlack = - .title = Negro -annotationColorRed = - .title = Rojo -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Azul -annotationColorYellow = - .title = Amarillo -annotationColorPurple = - .title = Púrpura -annotationColorSeaGreen = - .title = Verde mar -annotationColorGrey = - .title = Gris -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tamaño del texto -# Values shown in text size selection dropdown -textSizeSmall = Pequeño -textSizeMedium = Mediano -textSizeLarge = Grande -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirmar - .title = Confirmar -textToolCancelButton = Cancelar - .title = Cancelar -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hola - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Algo se fue a las pailas -copyImageErrorMessage = No se pudo copiar tu captura al portapapeles. - -## Settings Page - -settingsDisconnectButton = Desconectarse - .title = Desconectarse -settingsGuestAccountMessage = Cuenta de invitado -settingsSignInButton = Conectarse - .title = Conectarse -SettingsPageHeader = Ajustes de Firefox Screenshots -settingsFirefoxAccountSubHeader = Cuenta de Firefox -settingsClosePreferences = - .title = Cerrar preferencias -settingsFxaDisconnectAlertMessage = ¿Estás seguro de que quieres desconectar este dispositivo de tu cuenta de Firefox? -settingsFxaDisconnectDescription = Si cierras la sesión, tendrás que volver a conectarte para recuperar el acceso a tus capturas de pantalla. -settingsFxaConnectDescription = Puedes conectarte para acceder a tus capturas de pantalla en todos tus dispositivos. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Error borrando captura: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mis capturas: buscar por { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Error al renderizar la página: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Buscar mis capturas -shotIndexPageNoShotsMessage = No hay capturas guardadas. -shotIndexPageNoShotsInvitation = Vamos, crea alguna. -shotIndexPageLookingForShots = Buscando por tus capturas... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = No pudimos encontrar capturas que coincidan con tu búsqueda. -shotIndexPageMyShotsButton = - .title = Mis capturas -shotIndexPageClearSearchButton = - .title = Limpiar búsqueda -shotIndexPageConfirmShotDelete = ¿Eliminar esta captura? -shotIndexPagePreviousPage = - .title = Página anterior -shotIndexPageNextPage = - .title = Página siguiente -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Esta no es una captura favorita y expirará -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Esta es una captura favorita y no expira -shotIndexSyncedShot = - .title = Captura tomada en otro dispositivo -shotIndexAlertErrorFavoriteShot = Error al actualizar el estado de la captura favorita - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = ¿Estas seguro de eliminar esta captura? -shotDeleteCancel = Cancelar - .title = Cancelar -shotDeleteConfirm = Eliminar - .title = Eliminar - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Para exportar: usa Archivo > Guardar página como… y encontrarás tu captura de pantalla dentro de la carpeta { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Métricas de Firefox Screenshots -metricsPageTotalsQueryTitle = Totales -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Una vista general de Screenshots -metricsPageTotalsQueryDevices = Total de dispositivos registrados -metricsPageTotalsQueryActiveShots = Capturas activas -metricsPageTotalsQueryExpiredShots = Expirada (pero recuperable) -metricsPageTotalsQueryExpiredDeletedShots = Expirada (y eliminada) -metricsPageShotsQueryTitle = Capturas por día -metricsPageShotsQueryDescription = Número de capturas creadas cada día (para los últimos 30 días) -metricsPageShotsQueryCount = Número de capturas -metricsPageShotsQueryDay = Día -metricsPageUsersQueryTitle = Usuarios por día -metricsPageUsersQueryDescription = Número de usuarios que crearon al menos una captura, por día (últimos 30 días) -metricsPageUsersQueryCount = Número de usuarios -metricsPageUsersQueryDay = Día -metricsPageUserShotsQueryTitle = Número de capturas por usuario -metricsPageUserShotsQueryDescription = El número de usuarios que tienen cerca de N capturas totales -metricsPageUserShotsQueryCount = Número de usuarios -metricsPageUserShotsQueryShots = Número aproximado de capturas activas (no expiradas) -metricsPageRetentionQueryTitle = Retención por semana -metricsPageRetentionQueryDescription = Número de días desde la primera captura del usuario hasta la más reciente, agrupadas por semana de inicio. -metricsPageRetentionQueryUsers = Número de usuarios -metricsPageRetentionQueryDays = Días desde la primera captura del usuario hasta la más reciente -metricsPageRetentionQueryFirstWeek = Semana en la que el usuario creó la primera captura -metricsPageTotalRetentionQueryTitle = Retención total -metricsPageTotalRetentionQueryDescription = Periodo de tiempo en que los usuarios han estado creando capturas, agrupado por semana -metricsPageTotalRetentionQueryUsers = Número de usuarios -metricsPageTotalRetentionQueryDays = Días en que el usuario ha estado creando capturas -metricsPageVersionQueryTitle = Versión del complemento -metricsPageVersionQueryDescription = La versión del complemento usada durante el ingreso, en los últimos 14 días -metricsPageVersionQueryUsers = Número de usuarios conectados -metricsPageVersionQueryVersion = Versión del complemento -metricsPageVersionQueryLastSeen = Día -metricsPageHeader = Métricas -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generada el: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (tiempo de la base de datos: { $time }ms) diff --git a/locales/es-ES/server.ftl b/locales/es-ES/server.ftl deleted file mode 100644 index 29b551bb5d..0000000000 --- a/locales/es-ES/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mis capturas -gHomeLink = Inicio -gNoShots = - .alt = No se han encontrado capturas -gScreenshotsDescriptionServerless = Capturas de pantalla simplificadas. Haz y descarga capturas de pantalla sin salir de Firefox. - -## Header - -buttonSettings = - .title = Ajustes -buttonSignIn = - .title = Iniciar sesión -screenshotsLogo = - .title = Página de inicio de Screenshots -bannerSignIn = Inicia sesión o regístrate para acceder a tus capturas en todos tus dispositivos y guardar tus favoritas para siempre. -bannerUpsell = { gScreenshotsDescription } Obtener Firefox ahora -shutdownWarning = Las capturas de pantalla guardadas serán eliminadas en breve. A partir de junio, Screenshots ya no ofrecerá almacenamiento en línea. ¿Quieres conservar las capturas de tu biblioteca? Descárgalas a tu ordenador. -shutdownPageTitle = Screenshots está cambiando -shutdownPageDescription = A partir de junio, Screenshots ya no ofrecerá almacenamiento en línea. ¿Quieres mantener las capturas de tu biblioteca? Descárgalas individualmente o en conjunto. Gracias por usar esta función y lamentamos las molestias. -shutdownPageContinue = Esperamos que sigas usando Screenshots para hacer, copiar y descargar capturas de pantalla. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Novedades de Firefox Screenshots -onboardingPromoMessage = Ahora, inicia sesión en Screenshots con un cuenta de Firefox y haz más: -onboardingPromoMessageListItem1 = Accede a tu biblioteca desde todos tus dispositivos -onboardingPromoMessageListItem2 = Almacena tus capturas favoritas para siempre -onboardingPromoDismissButton = Descartar - .title = Descartar -onboardingPromoSigninButton = Iniciar sesión - .title = Iniciar sesión - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Términos -footerLinkPrivacy = Aviso de privacidad -footerReportShot = Informar de la captura - .title = Informar de esta captura por abuso, spam u otros problemas -footerLinkFaqs = FAQ -footerLinkDMCA = Denunciar violación de IP -footerLinkDiscourse = Enviar comentario -footerLinkRemoveAllData = Eliminar todos los datos - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creando { $title } -creatingPageTitleDefault = página -creatingPageWaitMessage = Guardando captura... - -## Home page - -homePageDescription = - .content = Capturas de pantalla intuitivas hechas en el propio navegador. Captura, guarda y comparte capturas de pantalla mientras navegas por la Web con Firefox. -homePageButtonMyShots = Ir a mis capturas -homePageTeaser = Próximamente... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Descarga gratuita -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Cómo funciona Firefox Screenshots -homePageGetStartedTitle = Comenzar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Selecciona el icono de Screenshots en el menú de acciones con la página. y te aparecerá el menú en la parte superior de la ventana del navegador. -homePageCaptureRegion = Captura un área -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Haz clic y arrastra para seleccionar el área que quieras capturar. O pasa el ratón por encima y haz clic - Screenshots lo hará por ti. ¿Te gusta? Selecciona Guardar para acceder a tus capturas en línea o pulsa la tecla de la flecha hacia abajo para descargarlo en tu equipo. -homePageCapturePage = Captura una página -homePageCapturePageDescription = Utiliza los botones de la parte superior derecha para capturar páginas completas. El botón Guardar área visible capturará lo que puedes ver sin deslizarte; Guardar página completa guardará todo lo que aparece en la página. -homePageDownloadCopy = Descargar o copiar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Haz tu mejor captura. Screenshots te permite descargar tu selección o copiarla directamente en tu portapapeles. -homePageLegalLink = Legal -homePagePrivacyLink = Privacidad -homePageTermsLink = Términos -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Eliminar todos los datos -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Debes tener instalado Firefox Screenshots o iniciar sesión en tu cuenta Firefox para eliminar tu cuenta. -leavePageErrorGeneric = Se produjo un error -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Esta acción eliminará de forma permanente todos tus datos de Firefox Screenshots. -leavePageButtonProceed = Continuar -leavePageButtonCancel = Cancelar -leavePageDeleted = ¡Se han eliminado todas tus capturas! - -## Not Found page - -notFoundPageTitle = Página no encontrada -notFoundPageIntro = Ups. -notFoundPageDescription = Página no encontrada. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Captura de pantalla: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Error al guardar fecha de expiración -shotPageAlertErrorDeletingShot = Error al eliminar captura -shotPageAlertErrorUpdatingTitle = Error al guardar el título -shotPageConfirmDelete = ¿Estás seguro de que quieres eliminarla de forma permanente? -shotPageShareButton = - .title = Compartir -shotPageCopyButton = - .title = Copiar la imagen al portapapeles -shotPageCopyActionLabel = Copiar -shotPageCopied = Copiada -shotPageShareFacebook = - .title = Compartir en Facebook -shotPageShareTwitter = - .title = Compartir en Twitter -shotPageSharePinterest = - .title = Compartir en Pinterest -shotPageShareEmail = - .title = Compartir enlace por correo electrónico -shotPageShareLink = Obtener enlace para compartir esta captura: -shotPagePrivacyMessage = Cualquiera que tenga el enlace puede ver la captura. -shotPageCopyImageText = - .label = Copiar texto de la imagen -shotPageConfirmDeletion = ¿Estás seguro de que quieres eliminarla de forma permanente? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Si no haces nada, la captura se eliminará de forma permanente en . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaurar hasta { $date } -shotPageExpiredMessage = Esta captura ha expirado. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Esta es la página de la que se originó en un principio: -shotPageDeleteButton = - .title = Eliminar esta captura -shotPageDownloadShot = - .title = Descargar -shotPageEditButton = - .title = Editar esta imagen -shotPagefavoriteButton = - .title = Elegir como favorita esta foto -shotPageBackToHomeButton = - .title = Página de inicio -shotPageAllShotsButton = - .title = Todas las capturas -shotPageScreenshotsDescriptionServerless = Capturas de pantalla simplificadas. Haz y descarga capturas de pantalla sin salir de Firefox. -shotPageDMCAMessage = Esta captura ya no está disponible por una reclamación de propiedad intelectual de terceros. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Envía un correo a { $dmca } para solicitar más información. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Si tus capturas están sujetas a múltiples reclamaciones, nos guardamos el derecho de anular tu acceso a Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Incluye la URL de esta captura en tu correo: { $url } -shotPageKeepFor = ¿Durante cuánto tiempo se debería retener esta captura? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Seleccionar tiempo -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = ∞ indefinidamente -shotPageKeepTenMinutes = 10 minutos -shotPageKeepOneHour = 1 hora -shotPageKeepOneDay = 1 día -shotPageKeepOneWeek = 1 semana -shotPageKeepTwoWeeks = 2 semanas -shotPageKeepOneMonth = 1 mes -shotPageSaveExpiration = guardar -shotPageCancelExpiration = cancelar -shotPageDoesNotExpire = no expirará -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = caduca -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = expiró el -timeDiffJustNow = ahora mismo -timeDiffMinutesAgo = - { $number -> - [one] hace un minuto - *[other] hace { $number } minutos - } -timeDiffHoursAgo = - { $number -> - [one] hace una hora - *[other] hace { $number } horas - } -timeDiffDaysAgo = - { $number -> - [one] ayer - *[other] hace { $number } días - } -timeDiffFutureSeconds = en unos segundos -timeDiffFutureMinutes = - { $number -> - [one] en un minuto - *[other] en { $number } minutos - } -timeDiffFutureHours = - { $number -> - [one] en 1 hora - *[other] en { $number } horas - } -timeDiffFutureDays = - { $number -> - [one] mañana - *[other] en { $number } días - } -errorThirdPartyCookiesEnabled = Si hiciste una captura y no puedes borrarla, puede que tengas que desactivar temporalmente las cookies de terceros en las preferencias del navegador. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = ¡Toma nota! -promoMessage = Las herramientas de edición actualizadas te permiten cortar, resaltar e incluso añadir texto a tu captura. -promoLink = Pruébalas -promoCloseButton = - .title = Cerrar notificación - -## Annotations - -annotationPenButton = - .title = Bolígrafo. -annotationHighlighterButton = - .title = Subrayador -annotationUndoButton = - .title = Deshacer -annotationRedoButton = - .title = Rehacer -annotationTextButton = - .title = Añadir texto -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Limpiar -annotationCropButton = - .title = Recortar -annotationSaveEditButton = Guardar - .title = Guardar los cambios -annotationCancelEditButton = Cancelar - .title = Cancelar los cambios -annotationCropConfirmButton = Confirmar - .title = Confirmar selección -annotationCropCancelButton = Cancelar - .title = Cancelar selección -annotationColorWhite = - .title = Blanco -annotationColorBlack = - .title = Negro -annotationColorRed = - .title = Rojo -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Azul -annotationColorYellow = - .title = Amarillo -annotationColorPurple = - .title = Púrpura -annotationColorSeaGreen = - .title = Verde marino -annotationColorGrey = - .title = Gris -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tamaño del texto -# Values shown in text size selection dropdown -textSizeSmall = Pequeño -textSizeMedium = Mediano -textSizeLarge = Grande -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirmar - .title = Confirmar -textToolCancelButton = Cancelar - .title = Cancelar -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hola - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Algo no ha ido bien -copyImageErrorMessage = No se puede copiar tu captura al portapapeles. - -## Settings Page - -settingsDisconnectButton = Desconectar - .title = Desconectar -settingsGuestAccountMessage = Cuenta de invitado -settingsSignInButton = Iniciar sesión - .title = Iniciar sesión -SettingsPageHeader = Configuración de Firefox Screenshots -settingsFirefoxAccountSubHeader = Cuenta de Firefox -settingsClosePreferences = - .title = Cerrar preferencias -settingsFxaDisconnectAlertMessage = ¿Estás seguro de que quieres desconectar este dispositivo de tu cuenta de Firefox? -settingsFxaDisconnectDescription = Si cierras la sesión, tendrás que volver a iniciarla para recuperar el acceso a tus capturas de pantalla. -settingsFxaConnectDescription = Puedes iniciar sesión para acceder a tus capturas de pantalla a través de todos tus dispositivos. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Error al eliminar la captura: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mis capturas: buscar { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Error al renderizar la página: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Buscar en mis capturas -shotIndexPageNoShotsMessage = No hay capturas guardadas. -shotIndexPageNoShotsInvitation = Vamos, haz algunas. -shotIndexPageLookingForShots = Buscando en tus capturas... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = No encontramos ninguna captura que coincida con tu búsqueda. -shotIndexPageMyShotsButton = - .title = Mis capturas -shotIndexPageClearSearchButton = - .title = Limpiar búsqueda -shotIndexPageConfirmShotDelete = ¿Eliminar esta captura? -shotIndexPagePreviousPage = - .title = Página anterior -shotIndexPageNextPage = - .title = Página siguiente -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Esta captura no está marcada como favorita y caducará -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Esta es una captura favorita y no caduca -shotIndexSyncedShot = - .title = Captura realizada en otro dispositivo -shotIndexAlertErrorFavoriteShot = Error al actualizar el estado de la captura favorita - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = ¿Está seguro de que quiere eliminar esta captura? -shotDeleteCancel = Cancelar - .title = Cancelar -shotDeleteConfirm = Eliminar - .title = Eliminar - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Para exportar: usa Archivo> Guardar página como... y encontrarás tus capturas de pantalla en la carpeta { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Métricas de Firefox Screenshots -metricsPageTotalsQueryTitle = Totales -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Vista global de Screenshots -metricsPageTotalsQueryDevices = Dispositivos registrados en total -metricsPageTotalsQueryActiveShots = Capturas activas -metricsPageTotalsQueryExpiredShots = Expirada (pero recuperable) -metricsPageTotalsQueryExpiredDeletedShots = Expirada (y eliminada) -metricsPageShotsQueryTitle = Capturas por día -metricsPageShotsQueryDescription = Número de capturas creadas cada día (últimos 30 días) -metricsPageShotsQueryCount = Número de capturas -metricsPageShotsQueryDay = Día -metricsPageUsersQueryTitle = Usuarios por día -metricsPageUsersQueryDescription = Número de usuarios que crearon al menos una pestaña, por día (últimos 30 días) -metricsPageUsersQueryCount = Número de usuarios -metricsPageUsersQueryDay = Día -metricsPageUserShotsQueryTitle = Número de capturas por usuario -metricsPageUserShotsQueryDescription = El número de usuarios que tienen un total de N capturas -metricsPageUserShotsQueryCount = Número de usuarios -metricsPageUserShotsQueryShots = Número aproximado de capturas activas (no expiradas) -metricsPageRetentionQueryTitle = Retención por semana -metricsPageRetentionQueryDescription = Número de días entre la primera y última captura de un usuario -metricsPageRetentionQueryUsers = Número de usuarios -metricsPageRetentionQueryDays = Días transcurridos entre la primera y la última captura del usuario -metricsPageRetentionQueryFirstWeek = Semana en la que el usuario creó la primera captura -metricsPageTotalRetentionQueryTitle = Retención total -metricsPageTotalRetentionQueryDescription = Periodo de tiempo que los usuarios han estado creando capturas, agrupados por semana -metricsPageTotalRetentionQueryUsers = Número de usuarios -metricsPageTotalRetentionQueryDays = Días en los que el usuario ha creado capturas -metricsPageVersionQueryTitle = Versión del complemento -metricsPageVersionQueryDescription = La versión del complemento utilizada al iniciar sesión, en los últimos 14 días -metricsPageVersionQueryUsers = Número de usuarios que inician sesión -metricsPageVersionQueryVersion = Versión del complemento -metricsPageVersionQueryLastSeen = Día -metricsPageHeader = Métricas -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generada el: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (database time: { $time }ms) diff --git a/locales/es-MX/server.ftl b/locales/es-MX/server.ftl deleted file mode 100644 index 81d113c257..0000000000 --- a/locales/es-MX/server.ftl +++ /dev/null @@ -1,387 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mis capturas -gHomeLink = Inicio -gNoShots = - .alt = No se encontraron capturas - -## Header - -buttonSettings = - .title = Preferencias -buttonSignIn = - .title = Iniciar sesión -screenshotsLogo = - .title = Página de inicio de Screenshots -bannerSignIn = Iniciar sesión o registrarse para acceder a tus capturas a través de tus dispositivos y guardar tus favoritos para siempre. -bannerUpsell = { gScreenshotsDescription } Obtener Firefox ahora -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = ¿Qué hay de nuevo en Firefox Screenshots? -onboardingPromoMessage = Ahora, inicia sesión en Screenshots con un cuenta de Firefox y haz más: -onboardingPromoMessageListItem1 = Accede a tu biblioteca en todos tus dispositivos -onboardingPromoMessageListItem2 = Almacena tus fotos favoritas para siempre -onboardingPromoDismissButton = Descartar - .title = Descartar -onboardingPromoSigninButton = Iniciar sesión - .title = Iniciar sesión - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Términos -footerLinkPrivacy = Aviso de privacidad -footerReportShot = Reportar captura - .title = Reportar esta captura por abuso, spam u otros problemas -footerLinkFaqs = Preguntas frecuentes -footerLinkDMCA = Reportar infracción de IP -footerLinkDiscourse = Enviar comentario -footerLinkRemoveAllData = Eliminar todos los datos - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creando { $title } -creatingPageTitleDefault = página -creatingPageWaitMessage = Guardando tu captura... - -## Home page - -homePageDescription = - .content = Capturas de pantalla intuitivas hechas en el navegador. Capturas, guarda y comparte capturas de pantalla mientras navegas la Web, usando Firefox. -homePageButtonMyShots = Ir a mis capturas -homePageTeaser = Próximamente... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Descargar gratis -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Cómo trabaja Firefox Screenshots -homePageGetStartedTitle = Comenzar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Selecciona el ícono Screenshots en el menú de acciones de la página en la barra de direcciones y el menú Screenshots aparecerá en la parte superior de la ventana del navegador. -homePageCaptureRegion = Captura una región -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Haz clic y arrastra para seleccionar el área que quieras capturar. O pasa el mouse por encima y haz clic - Screenshots lo hará por ti. ¿Te gusta? Selecciona Guardar para acceder a tus capturas en línea o pulsa la tecla de la flecha hacia abajo para descargarlo en tu equipo. -homePageCapturePage = Captura una página -homePageCapturePageDescription = Utiliza los botones de la parte superior derecha para capturar páginas completas. El botón Guardar área visible capturará lo que puedes ver sin deslizarte; Guardar página completa guardará todo lo que aparece en la página. -homePageDownloadCopy = Descargar o copiar -homePageLegalLink = Legal -homePagePrivacyLink = Privacidad -homePageTermsLink = Términos -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Eliminar todos los datos -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Debes tener Firefox Screenshots instalado o conectarte a tu cuenta de Firefox para eliminar tu cuenta -leavePageErrorGeneric = Ha ocurrido un error -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Esto eliminará permanentemente toda tu información de Firefox Screenshots -leavePageButtonProceed = Continuar -leavePageButtonCancel = Cancelar -leavePageDeleted = ¡Todas tus capturas de pantalla han sido eliminadas! - -## Not Found page - -notFoundPageTitle = No se encontró la página -notFoundPageIntro = Ups. -notFoundPageDescription = No se encontró la página. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Captura de pantalla: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Error al guardar fecha de expiración -shotPageAlertErrorDeletingShot = Error al eliminar captura -shotPageAlertErrorUpdatingTitle = Error al guardar el título -shotPageConfirmDelete = ¿Estás seguro que quieres eliminarla de forma permanente? -shotPageShareButton = - .title = Compartir -shotPageCopyButton = - .title = Copiar la imagen al portapapeles -shotPageCopyActionLabel = Copiar -shotPageCopied = Copiado -shotPageShareFacebook = - .title = Compartir en Facebook -shotPageShareTwitter = - .title = Compartir en Twitter -shotPageSharePinterest = - .title = Compartir en Pinterest -shotPageShareEmail = - .title = Compartir enlace vía correo electrónico -shotPageShareLink = Obtener enlace para compartir esta captura: -shotPagePrivacyMessage = Cualquier con el enlace puede ver esta captura -shotPageCopyImageText = - .label = Copiar texto de la imagen -shotPageConfirmDeletion = ¿Estás seguro que deseas eliminar esta captura de forma permanente? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Si no haces nada, la captura se eliminará de forma permanente en . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaurar hasta { $date } -shotPageExpiredMessage = Esta captura ha expirado. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Esta es la página dónde fue originalmente creada: -shotPageDeleteButton = - .title = Eliminar esta captura -shotPageDownloadShot = - .title = Descargar -shotPageEditButton = - .title = Editar esta imagen -shotPagefavoriteButton = - .title = Marcar esta captura como favorita -shotPageBackToHomeButton = - .title = Página de inicio -shotPageAllShotsButton = - .title = Todas las capturas -shotPageDMCAMessage = Esta captura ya no está disponible debido a un reclamo de derechos de autor. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Envía un correo a { $dmca } para solicitar más información. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Si tus capturas fueran objeto de múltiples reclamos, podemos revocarte el acceso a Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Por favor, incluye la URL de esta captura en tu correo electrónico: { $url } -shotPageKeepFor = ¿Qué tanto esta captura debe ser mantenida? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Selecciona tiempo -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinidamente ∞ -shotPageKeepTenMinutes = 10 minutos -shotPageKeepOneHour = 1 hora -shotPageKeepOneDay = 1 día -shotPageKeepOneWeek = 1 semana -shotPageKeepTwoWeeks = 2 semanas -shotPageKeepOneMonth = 1 mes -shotPageSaveExpiration = guardar -shotPageCancelExpiration = cancelar -shotPageDoesNotExpire = no expira -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expira en -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = expiró hace -timeDiffJustNow = justo ahora -timeDiffMinutesAgo = - { $number -> - [one] hace 1 minuto - *[other] hace { $number } minutos - } -timeDiffHoursAgo = - { $number -> - [one] hace 1 hora - *[other] hace { $number } horas - } -timeDiffDaysAgo = - { $number -> - [one] ayer - *[other] hace { $number } días - } -timeDiffFutureSeconds = en unos segundos -timeDiffFutureMinutes = - { $number -> - [one] en 1 minuto - *[other] en { $number } minutos - } -timeDiffFutureHours = - { $number -> - [one] en 1 hora - *[other] en { $number } horas - } -timeDiffFutureDays = - { $number -> - [one] mañana - *[other] en { $number } días - } -errorThirdPartyCookiesEnabled = Si tomas esta captura y no la puedes eliminar, puedes necesitar temporalmente habilitar cookies de terceros desde las preferencias de tu navegador. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = ¡Toma nota! -promoMessage = Las herramientas de edición actualizadas te permiten cortar, resaltar e incluso agregar texto a tu captura. -promoLink = Pruébalas -promoCloseButton = - .title = Cerrar notificación - -## Annotations - -annotationPenButton = - .title = Pluma -annotationHighlighterButton = - .title = Marcador -annotationUndoButton = - .title = Deshacer -annotationRedoButton = - .title = Rehacer -annotationTextButton = - .title = Agregar texto -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Limpiar -annotationCropButton = - .title = Recortar -annotationSaveEditButton = Guardar - .title = Guardar los cambios -annotationCancelEditButton = Cancelar - .title = Cancelar los cambios -annotationCropConfirmButton = Confirmar - .title = Confirmar selección -annotationCropCancelButton = Cancelar - .title = Cancelar selección -annotationColorWhite = - .title = Blanco -annotationColorBlack = - .title = Negro -annotationColorRed = - .title = Rojo -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Azul -annotationColorYellow = - .title = Amarillo -annotationColorPurple = - .title = Púrpura -annotationColorSeaGreen = - .title = Verde mar -annotationColorGrey = - .title = Gris -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tamaño del texto -# Values shown in text size selection dropdown -textSizeSmall = Pequeño -textSizeMedium = Mediano -textSizeLarge = Grande -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirmar - .title = Confirmar -textToolCancelButton = Cancelar - .title = Cancelar -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hola - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Algo salió mal -copyImageErrorMessage = No se puede copiar su captura al portapapeles. - -## Settings Page - -settingsDisconnectButton = Desconectar - .title = Desconectar -settingsGuestAccountMessage = Cuenta de invitado -settingsSignInButton = Iniciar sesión - .title = Iniciar sesión -SettingsPageHeader = Configuración de Firefox Screenshots -settingsFirefoxAccountSubHeader = Cuenta de Firefox -settingsClosePreferences = - .title = Cerrar preferencias -settingsFxaDisconnectAlertMessage = ¿Estás seguro que quieres desconectar este dispositivo de tu cuenta de Firefox? -settingsFxaDisconnectDescription = Si cierras la sesión, tendrás que volver a iniciarla para recuperar el acceso a tus capturas de pantalla. -settingsFxaConnectDescription = Puedes iniciar sesión para acceder a tus capturas de pantalla a través de varios dispositivos. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Error eliminando captura: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mis capturas: buscar por { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Error al renderizar la página: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Buscar mis capturas -shotIndexPageNoShotsMessage = No hay capturas guardadas. -shotIndexPageNoShotsInvitation = Adelante, crea una. -shotIndexPageLookingForShots = Buscando tus capturas... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = No pudimos encontrar ninguna captura que coincida con tu búsqueda. -shotIndexPageMyShotsButton = - .title = Mis capturas -shotIndexPageClearSearchButton = - .title = Limpiar búsqueda -shotIndexPageConfirmShotDelete = ¿Eliminar esta captura? -shotIndexPagePreviousPage = - .title = Página anterior -shotIndexPageNextPage = - .title = Página siguiente -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Esta no es una captura favorita y expirará -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Esta es una captura favorita y no expira -shotIndexSyncedShot = - .title = Captura tomada en otro dispositivo -shotIndexAlertErrorFavoriteShot = Error al actualizar el estado de la captura favorita - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = ¿De verdad quieres eliminar esta captura? -shotDeleteCancel = Cancelar - .title = Cancelar -shotDeleteConfirm = Eliminar - .title = Eliminar - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Métricas de Firefox Screenshots -metricsPageTotalsQueryTitle = Totales -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Vista global de Screenshots -metricsPageTotalsQueryDevices = Total de dispositivos registrados -metricsPageTotalsQueryActiveShots = Capturas activas -metricsPageTotalsQueryExpiredShots = Expirada (pero recuperable) -metricsPageTotalsQueryExpiredDeletedShots = Expirada (y eliminada) -metricsPageShotsQueryTitle = Capturas por día -metricsPageShotsQueryDescription = Número de capturas creadas cada día (por los últimos 30 días) -metricsPageShotsQueryCount = Número de capturas -metricsPageShotsQueryDay = Día -metricsPageUsersQueryTitle = Usuarios por día -metricsPageUsersQueryDescription = Número de usuarios quienes crearon al menos una captura por día (en los últimos 30 días) -metricsPageUsersQueryCount = Número de usuarios -metricsPageUsersQueryDay = Día -metricsPageUserShotsQueryTitle = Número de capturas por usuario -metricsPageUserShotsQueryDescription = El número de usuarios quienes tienen cerca de N cantidad de capturas -metricsPageUserShotsQueryCount = Número de usuarios -metricsPageUserShotsQueryShots = Número aproximado de capturas activas (no expiradas) -metricsPageRetentionQueryTitle = Retención por semana -metricsPageRetentionQueryDescription = Número de días entre la primera y última captura de un usuario -metricsPageRetentionQueryUsers = Número de usuarios -metricsPageRetentionQueryDays = Días transcurridos entre la primera y la última captura del usuario -metricsPageRetentionQueryFirstWeek = Semana en la que el usuario creó la primera captura -metricsPageTotalRetentionQueryTitle = Retención total -metricsPageTotalRetentionQueryDescription = Periodo de tiempo en que los usuarios han estado creando capturas, agrupado por semana -metricsPageTotalRetentionQueryUsers = Número de usuarios -metricsPageTotalRetentionQueryDays = Días desde que el usuario ha estado creando capturas -metricsPageVersionQueryTitle = Versión del complemento -metricsPageVersionQueryDescription = La versión del complemento usado durante el inicio de sesión, en los últimos 14 días -metricsPageVersionQueryUsers = Número de usuarios iniciando sesión -metricsPageVersionQueryVersion = Versión del complemento -metricsPageVersionQueryLastSeen = Día -metricsPageHeader = Métricas -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generada el: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (tiempo en la base de datos: { $time }ms) diff --git a/locales/et/server.ftl b/locales/et/server.ftl deleted file mode 100644 index ae08c1d08a..0000000000 --- a/locales/et/server.ftl +++ /dev/null @@ -1,382 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Minu pildid -gHomeLink = Avaleht -gNoShots = - .alt = Pilte ei leitud -gScreenshotsDescription = Ekraanipildid lihtsalt. Tee, salvesta ja jaga ekraanipilte Firefoxist lahkumata. - -## Header - -buttonSettings = - .title = Sätted -buttonSignIn = - .title = Logi sisse -screenshotsLogo = - .title = Avaleht -bannerSignIn = Logi sisse või registreeru kasutajaks, et pääseda ligi ekraanipiltidele kõigist oma seadmetest ning salvestada lemmikud jäädavalt. -bannerUpsell = { gScreenshotsDescription } Hangi Firefox -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Mis on uut Firefox Screenshots keskkonnas? -onboardingPromoMessage = Nüüd saad keskkonda sisse logida Firefoxi kontoga ja teha rohkem asju: -onboardingPromoMessageListItem1 = pääsed ligi piltidele kõigist oma seadmetest -onboardingPromoMessageListItem2 = saad salvestada pilte igavesti -onboardingPromoDismissButton = Peida - .title = Peida -onboardingPromoSigninButton = Logi sisse - .title = Logi sisse - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Kasutustingimused -footerLinkPrivacy = Privaatsuspoliitika -footerReportShot = Raporteeri ekraanipildist - .title = Anna teada väärkasutatud, spämmivast või muid probleeme sisaldavat ekraanipildist -footerLinkFaqs = KKK -footerLinkDMCA = Intellektuaalomandi rikkumisest teatamine -footerLinkDiscourse = Tagasiside andmine -footerLinkRemoveAllData = Kõigi andmete eemaldamine - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Loomisel: { $title } -creatingPageTitleDefault = leht -creatingPageWaitMessage = Pildi salvestamine… - -## Home page - -homePageDescription = - .content = Veebilehitsejasse sisse ehitatud intuitiivsed ekraanipildid. Tee, salvesta ja jaga ekraanipilte veebi sirvimisel Firefoxis. -homePageButtonMyShots = Minu piltide juurde -homePageTeaser = Varsti tulekul… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Tasuta allalaadimine -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Kuidas Firefox Screenshots töötab -homePageGetStartedTitle = Alustamine -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Vali Screenshotsi ikoon lehe tegevuste menüüst ja su brauseriakna kohal avaneb ekraanipiltide tegemise menüü. -homePageCaptureRegion = Piirkonna valimine -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klõpsa ja lohista alal, mida salvestada soovid. Või lihtsalt hoia kursorit selle kohal ja klõpsa — Screenshots valib ala sinu eest. Oled nähtavaga rahul? Vali Salvesta ekraanipildile võrgus ligipääsuks või vajuta nupule noolega alla, kui soovid selle enda arvutisse alla laadida. -homePageCapturePage = Lehe salvestamine -homePageCapturePageDescription = Tervete lehtede salvestamiseks kasuta nuppe ülal paremal. Salvesta nähtav nupp valib ala, mida näed kerimata, ja Salvesta terve leht valib kogu lehe. -homePageSaveShare = Salvestamine ja jagamine -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageShaveShareFavoriteDescription = Tee oma parim pilt. Seejärel salvesta see võrgus olevasse kuvapiltide kogumikku ning Firefox kopeerib lingi pildile sinu seadme vahemällu, et saaksid pilti lihtsalt jagada. Kogumikku lisatud pildid aeguvad automaatselt kahe nädala pärast, aga sa võid kustutada need ka kiiremini või säilitada neid soovi korral kauem. -homePageSignInTitle = Sinu pildid kõikjal -homePageSignInDescription = Logi sisse oma Firefoxi kontoga, et pääseda ekraanipiltidele ligi kõikjalt, kus kasutad Firefoxi. Lisatud boonusena saad siis lemmik ekraanipilte säilitada jäädavalt. -homePageLegalLink = Õiguslik teave -homePagePrivacyLink = Privaatsus -homePageTermsLink = Kasutustingimused -homePageCookiesLink = Küpsised - -## Leave Screenshots page - -leavePageRemoveAllData = Kõigi andmete eemaldamine -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Oma konto kustutamiseks peab sul olema paigaldatud Firefox Screenshots või sa pead olema sisse logitud Firefoxi kontosse -leavePageErrorGeneric = Tekkis viga -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = See kustutab jäädavalt kõik sinu Firefox Screenshots andmed. -leavePageButtonProceed = Edasi -leavePageButtonCancel = Tühista -leavePageDeleted = Kõik su ekraanipildid kustutati! - -## Not Found page - -notFoundPageTitle = Lehekülge ei leitud -notFoundPageIntro = Ups. -notFoundPageDescription = Lehekülge ei leitud. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Ekraanipilt: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Aegumise salvestamisel tekkis viga -shotPageAlertErrorDeletingShot = Pildi kustutamisel tekkis viga -shotPageAlertErrorUpdatingTitle = Pildi pealkirja salvestamisel tekkis viga -shotPageConfirmDelete = Kas oled kindel, et soovid pildi jäädavalt kustutada? -shotPageShareButton = - .title = Jaga -shotPageCopyButton = - .title = Kopeeri pilt vahemällu -shotPageCopyActionLabel = Kopeeri -shotPageCopied = Kopeeritud -shotPageShareFacebook = - .title = Jaga Facebookis -shotPageShareTwitter = - .title = Jaga Twiteris -shotPageSharePinterest = - .title = Jaga Pinterestis -shotPageShareEmail = - .title = Jaga lingiga e-posti teel -shotPageShareLink = Hangi jagamiseks selle pildi link: -shotPagePrivacyMessage = Kes tahes saab linki teades seda pilti vaadata. -shotPageCopyImageText = - .label = Kopeeri pildi tekst -shotPageConfirmDeletion = Kas oled kindel, et soovid selle pildi jäädavalt kustutada? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Kui sa midagi ei tee, siis kustutatakse see pilt jäädavalt . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = taasta kuni { $date } -shotPageExpiredMessage = See pilt on aegunud. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Siin on leht, millel see algselt loodi: -shotPageDeleteButton = - .title = Kustuta see pilti -shotPageDownloadShot = - .title = Laadi alla -shotPageEditButton = - .title = Muuda seda pilti -shotPagefavoriteButton = - .title = Lisa lemmikutesse -shotPageBackToHomeButton = - .title = Avalehele -shotPageAllShotsButton = - .title = Kõik pildid -shotPageScreenshotsDescription = Ekraanipildid lihtsalt. Tee, salvesta ja jaga ekraanipilte Firefoxist lahkumata. -shotPageDMCAMessage = See pilt pole enam saadaval intellektuaalomandi nõude tõttu kolmandalt osapoolelt. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Palun kirjuta { $dmca }, kui soovid rohkem teavet. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Kui su pildid saavad mitu sellist nõuet, siis võime tühistada sinu ligipääsu Firefox Screenshots teenusele. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Palun kaasa kirjas selle pildi URL: { $url } -shotPageKeepFor = Kui kaua peaks seda pilti säilitama? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Aja valimine -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Igavesti ∞ -shotPageKeepTenMinutes = 10 minutit -shotPageKeepOneHour = 1 tund -shotPageKeepOneDay = 1 päev -shotPageKeepOneWeek = 1 nädal -shotPageKeepTwoWeeks = 2 nädalat -shotPageKeepOneMonth = 1 kuu -shotPageSaveExpiration = salvesta -shotPageCancelExpiration = tühista -shotPageDoesNotExpire = ei aegu -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = aegub -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = aegunud -timeDiffJustNow = just praegu -timeDiffMinutesAgo = - { $number -> - [one] minut tagasi - *[other] { $number } minutit tagasi - } -timeDiffHoursAgo = - { $number -> - [one] tund tagasi - *[other] { $number } tundi tagasi - } -timeDiffDaysAgo = - { $number -> - [one] eile - *[other] { $number } päeva tagasi - } -timeDiffFutureSeconds = paari sekundi jooksul -timeDiffFutureMinutes = - { $number -> - [one] minuti jooksul - *[other] { $number } minuti jooksul - } -timeDiffFutureHours = - { $number -> - [one] tunni jooksul - *[other] { $number } tunni jooksul - } -timeDiffFutureDays = - { $number -> - [one] homme - *[other] { $number } päeva jooksul - } -errorThirdPartyCookiesEnabled = Kui sina tegid selle pildi ja ei saa seda kustutada, siis pead ehk ajutiselt lubama kolmanda osapoole küpsised oma brauseri sätetes. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Teadmiseks! -promoMessage = Uuendatud muutmise tööriistad võimaldavad kärpida, esile tuua ja isegi pildile teksti lisada. -promoLink = Tee proovi -promoCloseButton = - .title = Sulge teavitus - -## Annotations - -annotationPenButton = - .title = Pliiats -annotationHighlighterButton = - .title = Marker -annotationUndoButton = - .title = Võta tagasi -annotationRedoButton = - .title = Tee uuesti -annotationTextButton = - .title = Lisa tekst -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Puhasta -annotationCropButton = - .title = Kärbi -annotationSaveEditButton = Salvesta - .title = Salvesta muudatused -annotationCancelEditButton = Loobu - .title = Loobu muudatustest -annotationCropConfirmButton = Kinnita - .title = Kinnita valik -annotationCropCancelButton = Loobu - .title = Loobu valikust -annotationColorWhite = - .title = Valge -annotationColorBlack = - .title = Must -annotationColorRed = - .title = Punane -annotationColorGreen = - .title = Roheline -annotationColorBlue = - .title = Sinine -annotationColorYellow = - .title = Kollane -annotationColorPurple = - .title = Lilla -annotationColorSeaGreen = - .title = Mereroheline -annotationColorGrey = - .title = Hall -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Teksti suurus -# Values shown in text size selection dropdown -textSizeSmall = Väike -textSizeMedium = Keskmine -textSizeLarge = Suur -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Kinnita - .title = Kinnita -textToolCancelButton = Loobu - .title = Loobu -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Tere - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Midagi läks valesti -copyImageErrorMessage = Pilti pole võimalik vahemällu kopeerida. - -## Settings Page - -settingsDisconnectButton = Ühenda lahti - .title = Ühenda lahti -settingsGuestAccountMessage = Külaliskonto -settingsSignInButton = Logi sisse - .title = Logi sisse -SettingsPageHeader = Firefox Screenshots'i seaded -settingsFirefoxAccountSubHeader = Firefoxi konto -settingsClosePreferences = - .title = Sulge seaded -settingsFxaDisconnectAlertMessage = Kas oled kindel, et soovid selle seadme Firefoxi kontost lahti ühendada? -settingsFxaDisconnectDescription = Kui logid välja, siis pead oma piltide nägemiseks uuesti sisse logima. -settingsFxaConnectDescription = Sa võid sisse logida, et näha pilte kõigis oma seadmetes. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Pildi kustutamisel tekkis viga: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Minu pildid: otsi { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Lehe kuvamisel tekkis viga: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Minu piltidest otsimine -shotIndexPageNoShotsMessage = Salvestatud pildid puuduvad. -shotIndexPageNoShotsInvitation = Ära pelga, tee mõned. -shotIndexPageLookingForShots = Otsime sinu pilte… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Me ei leidnud su otsingule sobivaid pilte. -shotIndexPageMyShotsButton = - .title = Minu pildid -shotIndexPageClearSearchButton = - .title = Tühjenda otsing -shotIndexPageConfirmShotDelete = Kas tõesti kustutada see pilt? -shotIndexPagePreviousPage = - .title = Eelmine leht -shotIndexPageNextPage = - .title = Järgmine leht -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = See pilt ei ole lemmikuks märgitud ja see aegub -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = See pilt on märgitud lemmikuks ja see ei aegu -shotIndexSyncedShot = - .title = See pilt tehti teises seadmes -shotIndexAlertErrorFavoriteShot = Viga pildi lemmikuks olemise oleku muutmisel - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Kas oled kindel, et soovid selle pildi kustutada? -shotDeleteCancel = Loobu - .title = Loobu -shotDeleteConfirm = Kustuta - .title = Kustuta - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots statistika -metricsPageTotalsQueryTitle = Kokku -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Screenshots ülevaade -metricsPageTotalsQueryDevices = Registreeritud seadmeid -metricsPageTotalsQueryActiveShots = Aktiivsed pildid -metricsPageTotalsQueryExpiredShots = Aegunud (kuid taastatavad) -metricsPageTotalsQueryExpiredDeletedShots = Aegunud (ja kustutatud) -metricsPageShotsQueryTitle = Pildid päevade kaupa -metricsPageShotsQueryDescription = Igapäevaselt loodud piltide arv (viimase 30 päeva jooksul) -metricsPageShotsQueryCount = Piltide arv -metricsPageShotsQueryDay = Päev -metricsPageUsersQueryTitle = Kasutajate arv päevade lõikes -metricsPageUsersQueryDescription = Kasutajate arv, kes salvestasid vähemalt ühe pildi, päevade lõikes (viimased 30 päeva) -metricsPageUsersQueryCount = Kasutajate arv -metricsPageUsersQueryDay = Päev -metricsPageUserShotsQueryTitle = Piltide arv kasutaja kohta -metricsPageUserShotsQueryDescription = Kasutajate arv, kellel on kokku umbes N pilti -metricsPageUserShotsQueryCount = Kasutajate arv -metricsPageUserShotsQueryShots = Umbkaudne arv aktiivseid (aegumata) pilte -metricsPageRetentionQueryUsers = Kasutajate arv -metricsPageTotalRetentionQueryUsers = Kasutajate arv -metricsPageVersionQueryTitle = Laienduse versioon -metricsPageVersionQueryUsers = Sisselogitud kasutajate arv -metricsPageVersionQueryVersion = Laienduse versioon -metricsPageVersionQueryLastSeen = Päev -metricsPageHeader = Statistika -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Genereeritud: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (andmebaasi aeg: { $time }ms) diff --git a/locales/eu/server.ftl b/locales/eu/server.ftl deleted file mode 100644 index 5a184b5343..0000000000 --- a/locales/eu/server.ftl +++ /dev/null @@ -1,85 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Header - - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Baldintzak -footerLinkPrivacy = Pribatutasun-oharra -footerLinkFaqs = Ohiko galderak - -## Creating page - - -## Home page - -homePageDownloadFirefoxTitle = Firefox -homePageGetStartedTitle = Hasi erabiltzen -homePageLegalLink = Lege-oharrak -homePagePrivacyLink = Pribatutasuna -homePageCookiesLink = Cookieak - -## Leave Screenshots page - -leavePageButtonCancel = Utzi - -## Not Found page - -notFoundPageIntro = Ene! - -## Shot page - -shotPageCopied = Kopiatuta -shotPageDownloadShot = - .title = Deskargatu -shotPageKeepTenMinutes = 10 minutu -shotPageKeepOneHour = Ordu bat -shotPageKeepOneDay = Egun bat -shotPageKeepOneWeek = Aste bat -shotPageKeepTwoWeeks = 2 aste -shotPageKeepOneMonth = Hilabete -shotPageSaveExpiration = gorde -shotPageCancelExpiration = utzi -shotPageDoesNotExpire = ez da iraungitzen -timeDiffJustNow = oraintxe bertan - -## Shot Page New Feature Promotion Dialog. - - -## Annotations - -annotationCropConfirmButton = Berretsi - .title = Berretsi hautapena -annotationCropCancelButton = Utzi - .title = Utzi hautapena - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - - -## Settings Page - - -## Shotindex page - -shotIndexPagePreviousPage = - .title = Aurreko orria -shotIndexPageNextPage = - .title = Hurrengo orria - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - -metricsPageTotalRetentionQueryUsers = Erabiltzaile kopurua diff --git a/locales/fa/server.ftl b/locales/fa/server.ftl deleted file mode 100644 index 656c9593de..0000000000 --- a/locales/fa/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = تصاویر من -gHomeLink = خانه -gNoShots = - .alt = هیچ تصویری پیدا نشد -gScreenshotsDescriptionServerless = گرفتن تصویر از صفحه آسان است. تصویر را بگیرید و ذخیره کنید بدون ترک کردن فایرفاکس. - -## Header - -buttonSettings = - .title = تنظیمات -buttonSignIn = - .title = ورود -screenshotsLogo = - .title = صفحه خانگی تصاویر صفحه -bannerSignIn = وارد شوید یا ثبت نام کنید برای دسترسی به تصاویر که بر روی دستگاه‌ های شما هستند و تصویر مورد علاقه خود را برای همیشه ذخیره کنید. -bannerUpsell = { gScreenshotsDescription } هم‌اکنون فایرفاکس را دریافت کنید -shutdownWarning = تصاویر ذخیره شده از صفحه به زودی منقضی خواهند شد آغاز از ماه جون،‌ برنامه گرفتن تصویر از صفحه بعد از این تاریخ امکان ذخیره تصاویر به صورت آنلاین را ارائه نمی‌کند. می‌خواهید تصاویر خود را حفظ کنید؟ آن ها رو بر روی کامپیوتر خود ذخیره کنید. -shutdownPageTitle = تصاویر صفحه در حال تغییر است -shutdownPageDescription = از اواسط خرداد ماه این برنامه دیگر امکان ذخیره آنلاین رو به شما نمی‌دهد. آیا نیاز دارید تصایور را داشته باشید؟ هر تصویر رو به صورت جدا دانلود کنید یا دسته ای. ممنون برای استفاده از این قابلیت و ما متاسفیم برای هرگونه ناراحتی که به وجود آمده است. -shutdownPageContinue = ما امیدواریم شما به استفاده از این برنامه و گرفتن‌، برداشت و دریافت تصاویر ادامه دهید. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = چه چیزهایی جدیدی در Firefox Screenshots وجود دارد؟ -onboardingPromoMessage = همین الان به وسیله حساب فایرفاکس خودتون،‌ وارد حساب Screenshots بشید و کارهای زیادی انجام بدید: -onboardingPromoMessageListItem1 = دسترسی به کتابخانه خودتون بر روی تمامی دستگاه‌ها -onboardingPromoMessageListItem2 = ذخیره بهترین تصویری که گرفتید برای همیشه -onboardingPromoDismissButton = رد کردن - .title = ردکردن -onboardingPromoSigninButton = واردشدن - .title = واردشدن - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = موزیلا -footerLinkTerms = شرایط استفاده -footerLinkPrivacy = نکات حفظ حریم‌شخصی -footerReportShot = گزارش عکس - .title = این عکس را به خاطر سواستفاده، هرزنامه یا مشکلات دیگر گزارش کنید -footerLinkFaqs = سوالات متداول -footerLinkDMCA = گزارش تخلف IP -footerLinkDiscourse = ارسال بازخورد -footerLinkRemoveAllData = حذف همه‌ی داده‌ها - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = ایجاد { $title } -creatingPageTitleDefault = صفحه -creatingPageWaitMessage = در حال ذخیره کردن عکس شما… - -## Home page - -homePageDescription = - .content = عکس‌های بصری گرفته شده مستقیما در مرورگر شما آماده می‌شود. گرفتن،‌ ذخیره و هم‌رسانی تصاویر صفحه در حالی که با فایرفاکس وب را مرور می‌کنید. -homePageButtonMyShots = برو به عکس‌های من -homePageTeaser = به زودی… -homePageDownloadFirefoxTitle = فایرفاکس -homePageDownloadFirefoxSubTitle = دریافت رایگان -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots چگونه کار می‌کند -homePageGetStartedTitle = شروع کنید -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = انتخاب شمایل برای تصویر از صفحه از بخش فهرست اقدامات در آدرس بار،‌ و فهرست تصاویر لحظه ای در بالای پنجره مرورگر ظاهر خواهد شد. -homePageCaptureRegion = گرفتن عکس از یک ناحیه -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = ناحیه که می‌خواهید ثبت کنید را انتخاب کنید و بکشید. یا فقط به روی آن بروید و کلیک کنید — Screenshots برای شما محدوده مورد نظر را انتخاب‌ می‌کند. دقیقا همانند چیزی که می بینید؟ بر روی ذخیره کلیک کنید تا عکس‌های گرفته شده به صورت آنلاین ذخیره شود یا برای ذخیره بر روی کامپیوتر بر روی دکمه فلش به سمت پایین کلیک کنید. -homePageCapturePage = گرفتن عکس از صفحه -homePageCapturePageDescription = از دکمه ظاهر شده در راست برای گرفتن تمام صفحه تصویر استفاده کنید. دکمه ذخیره آشکار این امکان را به شما می‌دهد بدون اسکرول کردن به پایین، قسمت های پایین را ثبت کنید و ذخیره به صورت تمام صفحه هر‌آنچه در صفحه دارید را ذخیره می‌کند. -homePageDownloadCopy = دریافت یا برداشت -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = بهترین تصویر خود را بگیرید. برنامه گرفتن تصویر از صفحه این امکان را به شما می دهد تا انتخاب های خود را دریافت کنید یا آن ها را به صورت مستقیم بر روی بخش برداشت خود انتقال دهید. -homePageLegalLink = حقوقی -homePagePrivacyLink = حریم‌خصوصی -homePageTermsLink = شرایط -homePageCookiesLink = کوکی‌ها - -## Leave Screenshots page - -leavePageRemoveAllData = حذف تمام داده‌ها -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = شما باید Firefox Screenshots را نصب داشته باشید یا وارد حساب فایرفاکس خود شوید تا بتوانید حساب خود را حذف کنید -leavePageErrorGeneric = خطایی رخ داده است. -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = این تمام اطلاعات Firefox Screenshots شما را به صورت دائمی حذف خواهد کرد. -leavePageButtonProceed = ادامه -leavePageButtonCancel = لغو -leavePageDeleted = تمام عکس‌های صفحه شما حذف شدند! - -## Not Found page - -notFoundPageTitle = صفحه پیدا نشد -notFoundPageIntro = اوه -notFoundPageDescription = صفحه پیدا نشد. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = عکس صفحه: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = خطا در ذخیره‌ی تاریخ انقضا -shotPageAlertErrorDeletingShot = خطا در حذف تصویر -shotPageAlertErrorUpdatingTitle = خطا در ذخیره عنوان -shotPageConfirmDelete = آیا مطمئن هستید که می‌خواهید این عکس را به صورت دائمی حذف کنید؟ -shotPageShareButton = - .title = هم‌رسانی -shotPageCopyButton = - .title = رونشت عکس به کلیپ‌بورد -shotPageCopyActionLabel = برداشت -shotPageCopied = رونوشت شد -shotPageShareFacebook = - .title = هم‌رسانی در فیسبوک -shotPageShareTwitter = - .title = هم‌رسانی در توییتر -shotPageSharePinterest = - .title = هم‌رسانی در پینترست -shotPageShareEmail = - .title = هم‌رسانی پیوند از طریق ایمیل -shotPageShareLink = یک پیوند قابل هم‌رسانی برای این عکس دریافت کنید: -shotPagePrivacyMessage = هر کسی با این پیوند می‌تواند این عکس را ببیند. -shotPageCopyImageText = - .label = رونوشت از متنِ عکس -shotPageConfirmDeletion = آیا مطمئن هستید که می‌خواهید این عکس را به صورت دائمی حذف کنید؟ -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = اگر کاری انجام ندهید، این عکس به صورت دائمی حذف خواهد شد. -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = بازگرداندن تا { $date } -shotPageExpiredMessage = این عکس منقضی شده است. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = این صفحه‌ای است که از روی آن ساخته شده بود: -shotPageDeleteButton = - .title = حذف این عکس -shotPageDownloadShot = - .title = دریافت -shotPageEditButton = - .title = ویرایش این تصویر -shotPagefavoriteButton = - .title = این عکس را محبوب کنید -shotPageBackToHomeButton = - .title = صفحه خانگی -shotPageAllShotsButton = - .title = همه عکس‌ها -shotPageScreenshotsDescriptionServerless = از صفحه برنامه های خود به آسانی تصویر بگیرید. گرفتن تصویر و دریافت آن بدون ترک فایرفاکس. -shotPageDMCAMessage = این عکس به دلیل درخواست مالکیت معنوی یک شخص ثالث، دیگر در دسترس نیست. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = لطفا برای درخواست اطلاعات بیشتر به { $dmca } ایمیل بزنید. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = اگر عکس شما موضوع ادعاهای متعدد شود، ممکن است دسترسی شما به Firefox Screenshots را باطل کنیم. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = لطفا نشانی این عکس را در ایمیل خود قید کنید: { $url } -shotPageKeepFor = چه مدت این عکس باید حفظ شود؟ -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = انتخاب زمان -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = نامحدود ∞ -shotPageKeepTenMinutes = ‏‏۱۰ دقیقه -shotPageKeepOneHour = ۱ ساعت -shotPageKeepOneDay = ‏‏۱ روز -shotPageKeepOneWeek = ‏‏۱ هفته -shotPageKeepTwoWeeks = ‏‏۲ هفته -shotPageKeepOneMonth = ‏‏۱ ماه -shotPageSaveExpiration = ذخیره -shotPageCancelExpiration = لغو -shotPageDoesNotExpire = منقضی نمی‌شود -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = منقضی می‌شود -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = منقضی شده -timeDiffJustNow = هم‌اکنون -timeDiffMinutesAgo = - { $number -> - [one] ۱ دقیقه پیش - *[other] { $number } دقیقه پیش - } -timeDiffHoursAgo = - { $number -> - [one] ۱ ساعت پیش - *[other] { $number } ساعت پیش - } -timeDiffDaysAgo = - { $number -> - [one] دیروز - *[other] { $number } روز پیش - } -timeDiffFutureSeconds = چند ثانیه پیش -timeDiffFutureMinutes = - { $number -> - [one] در یک دقیقه - *[other] در { $number } دقیقه - } -timeDiffFutureHours = - { $number -> - [one] در یک ساعت - *[other] در { $number } ساعت - } -timeDiffFutureDays = - { $number -> - [one] فردا - *[other] در { $number } روز - } -errorThirdPartyCookiesEnabled = اگر شما این عکس را گرفته‌اید و نمی‌تواند آن را حذف کنید، ممکن است لازم باشد به طور موقت کوکی‌های شخص ثالث را از تنظیمات مرورگر خود فعال کنید. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = برداشتن یادداشت! -promoMessage = ابزار ویرایش‌ کردن که به شما اجازه بریدن،‌ برجسته سازی و حتی اضافه کردن متن به تصاویر گرفته شده را می‌دهد به روزرسانی شد. -promoLink = ‌آن ها را امتحان کنید -promoCloseButton = - .title = بستن هشدار - -## Annotations - -annotationPenButton = - .title = خودکار -annotationHighlighterButton = - .title = برجسته‌ساز -annotationUndoButton = - .title = برگردان -annotationRedoButton = - .title = بازآوری -annotationTextButton = - .title = اضافه کردن متن -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = پاک کردن -annotationCropButton = - .title = بُرش -annotationSaveEditButton = ذخیره - .title = ذخیره ویرایش -annotationCancelEditButton = لغو - .title = لغو ویرایش -annotationCropConfirmButton = تایید - .title = تایید موارد انتخابی -annotationCropCancelButton = لغو - .title = لغو موارد انتخابی -annotationColorWhite = - .title = سفید -annotationColorBlack = - .title = سیاه -annotationColorRed = - .title = قرمز -annotationColorGreen = - .title = سبز -annotationColorBlue = - .title = آبی -annotationColorYellow = - .title = زرد -annotationColorPurple = - .title = بنفش -annotationColorSeaGreen = - .title = سبز دریایی -annotationColorGrey = - .title = خاکستری -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = اندازه متن -# Values shown in text size selection dropdown -textSizeSmall = کوچک -textSizeMedium = متوسط -textSizeLarge = بزرگ -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = تایید - .title = تایید -textToolCancelButton = لغو - .title = لغو -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = سلام - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = خطایی رخ داد -copyImageErrorMessage = امکان برداشت یک نسخه از تصویر شما در داخل کلیپ بورد وجود ندارد. - -## Settings Page - -settingsDisconnectButton = قطع اتصال - .title = قطع اتصال -settingsGuestAccountMessage = حساب مهمان -settingsSignInButton = ورود - .title = ورود -SettingsPageHeader = تنظیمات نماگرفتِ فایرفاکس -settingsFirefoxAccountSubHeader = حساب فایرفاکس -settingsClosePreferences = - .title = بستن ترجیحات -settingsFxaDisconnectAlertMessage = آیا مطمئن هستید که می‌خواهید این دستگاه را از حساب فایرفاکس خود جدا کنید؟ -settingsFxaDisconnectDescription = اگر از سیستم خارج شوید، مجددا باید وارد سیستم شوید تا دوباره به تصاویر خود دسترسی داشته باشید. -settingsFxaConnectDescription = می‌توانید برای دسترسی به عکس‌هایتان در تمام دستگاه‌ها، وارد شوید. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = خطا هنگام پاک کردن عکس: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = عکس‌های من : جستجو کن برای { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = خطا هنگام پردازش کردن صفحه: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = جستجو در عکس‌های من -shotIndexPageNoShotsMessage = عکس ذخیره شده‌ای وجود ندارد. -shotIndexPageNoShotsInvitation = ادامه بده، چندتا بساز. -shotIndexPageLookingForShots = در حال گشتن برای عکس‌های شما… -shotIndexPageNoSearchResultsIntro = همم -shotIndexPageNoSearchResults = نمی‌توانیم هیچ عکسی مطابق با آنچه جستحو کردید بیابیم. -shotIndexPageMyShotsButton = - .title = عکس‌های من -shotIndexPageClearSearchButton = - .title = پاک کردن جستجو -shotIndexPageConfirmShotDelete = حذف این عکس؟ -shotIndexPagePreviousPage = - .title = صفحه قبل -shotIndexPageNextPage = - .title = صفحه بعد -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = این عکس در فهرست موردعلاقه‌های شما قرار ندارد و منقضی خواهد شد -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = این عکس در فهرست موردعلاقه‌های شما قرار دارد و منقضی نخواهد شد -shotIndexSyncedShot = - .title = عکس گرفته شده در دستگاه دیگر -shotIndexAlertErrorFavoriteShot = خطا در هنگام بروزرسانی وضعیت تصویر مورد علاقتون - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = آیا مطمئنید که می‌خواهید این نما را حذف کنید؟ -shotDeleteCancel = لغو - .title = لغو -shotDeleteConfirm = حذف - .title = حذف - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = برای گرفتن خروجی: به بخش File > Save Page As… رفته و سپس می‌توانید تصاویر گرفته شده را در پوشه { $folder } پیدا کنید - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = معیار‌های Firefox Screenshots -metricsPageTotalsQueryTitle = مجموع -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = یک نگاه کلی به Screenshots -metricsPageTotalsQueryDevices = مجموع دستگاه‌های ثبت شده -metricsPageTotalsQueryActiveShots = عکس‌های فعال -metricsPageTotalsQueryExpiredShots = منقضی شده (اما قابل بازیابی) -metricsPageTotalsQueryExpiredDeletedShots = منقضی شده (و حذف شده) -metricsPageShotsQueryTitle = عکس‌های روز -metricsPageShotsQueryDescription = تعداد عکس‌هایی که در هر روز ایجاد شده (در ۳۰ روز گذشته) -metricsPageShotsQueryCount = تعداد عکس‌ها -metricsPageShotsQueryDay = روز -metricsPageUsersQueryTitle = کاربران هر روز -metricsPageUsersQueryDescription = تعداد کاربرانی که حداقل یک عکس ایجاد کرده‌اند، روزانه (در ۳۰ روز گذشته) -metricsPageUsersQueryCount = تعداد کاربران -metricsPageUsersQueryDay = روز -metricsPageUserShotsQueryTitle = تعداد عکس‌ها برای هر کاربر -metricsPageUserShotsQueryDescription = تعداد کاربرانی که در مجموع حدود N عکس دارند -metricsPageUserShotsQueryCount = تعداد کاربران -metricsPageUserShotsQueryShots = تعداد تقریبی عکس‌های فعال (منقضی نشده) -metricsPageRetentionQueryTitle = نگه‌داری بر اساس هفته -metricsPageRetentionQueryDescription = تعداد روز‌ها از نخستین عکس کاربر تا آخرین عکس، گروه بندی‌شده بر اساس هفته آغازین -metricsPageRetentionQueryUsers = تعداد کاربران -metricsPageRetentionQueryDays = فاصله روزهای بین نخستین تا آخرین عکس کاربر -metricsPageRetentionQueryFirstWeek = هفته‌ای که کاربر اول عکس خود را ایجاد کرده است -metricsPageTotalRetentionQueryTitle = زمان کلی نگه‌داری -metricsPageTotalRetentionQueryDescription = مدت زمانی که کاربر در حال ایجاد عکس بوده است، گروه‌بندی شده بر اساس هفته -metricsPageTotalRetentionQueryUsers = تعداد کاربران -metricsPageTotalRetentionQueryDays = روز‌هایی که کاربر عکس ایجاد کرده است -metricsPageVersionQueryTitle = نسخه افزونه -metricsPageVersionQueryDescription = نسخه افزونه مورد استفاده در هنگام ورود، در 1۴ روز گذشته -metricsPageVersionQueryUsers = تعداد کاربران در حال ورود -metricsPageVersionQueryVersion = نسخه افزونه -metricsPageVersionQueryLastSeen = روز -metricsPageHeader = معیارها -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = تولید شده در: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (زمان پایگاه‌داده: { $time }ms) diff --git a/locales/ff/server.ftl b/locales/ff/server.ftl deleted file mode 100644 index 93e019a3fc..0000000000 --- a/locales/ff/server.ftl +++ /dev/null @@ -1,232 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Natte am -gHomeLink = Jaɓɓorgo -gNoShots = - .alt = Alaa natte njiytaa - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Sarɗiiji -footerLinkPrivacy = Tintinol Suturo -footerLinkFaqs = FAQs -footerLinkDMCA = Siimtu nguyka IP -footerLinkDiscourse = Hokku duttinal -footerLinkRemoveAllData = Momtu Keɓe Fof - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Cosgol { $tiitoonde } -creatingPageTitleDefault = hello -creatingPageWaitMessage = Danndugol natte maa... - -## Home page - -homePageButtonMyShots = Yah To Natte Am -homePageTeaser = Ina ara Jooni... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Gaawtol Alla meho -homePageGetStarted = Fuɗɗo -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = No Leƴƴanɗe Kuurgal Firefox Gollortoo -homePageGetStartedTitle = Fuɗɗo -homePageCaptureRegion = Nokkito Diiwaan -homePageCapturePage = Nokkito Hello -homePageSaveShare = Danndu etee Lollin -homePageLegalLink = Laawol -homePagePrivacyLink = Suturo -homePageTermsLink = Sarɗiiji -homePageCookiesLink = Kuukiije - -## Leave Screenshots page - -leavePageRemoveAllData = Momtu Keɓe Fof -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAddonRequired = Aɗa foti jogaade Leƴƴanɗe Kuurgal loowaaɗe ngam momtude konte maa -leavePageErrorGeneric = Juumre waɗii -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Ɗum ɗoo maa jokku momtude keɓe leƴƴanɗe kuurgal Firefox maa. -leavePageButtonProceed = Fuɗɗo -leavePageButtonCancel = Haaytu -leavePageDeleted = Leƴƴanɗe kuurgal ma fof momtaama! - -## Not Found page - -notFoundPageTitle = Hello ngoo yiytaaka -notFoundPageIntro = Oops. -notFoundPageDescription = Hello ngoo yiytaaka - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Leƴƴannde kuurgal: { $Tiitoondeiwdiire } -shotPageAlertErrorUpdatingExpirationTime = Juumre danndugol buntugol -shotPageAlertErrorDeletingShot = Juumre momtugol nattal -shotPageAlertErrorUpdatingTitle = Juumre danndugol tiitoonde -shotPageConfirmDelete = Aɗa yananaa tiɗde momtude ngal nattal daañaa? -shotPageShareButton = - .title = Lollin -shotPageCopy = Natto -shotPageCopied = Nattaama -shotPageShareFacebook = - .title = Lollin e Facebook -shotPageShareTwitter = - .title = Lollin e Twitter -shotPageSharePinterest = - .title = Lollin e Pinterest -shotPageShareEmail = - .title = Lollin jokkol rewrude e iimeel -shotPageShareLink = Heɓ jokkol baawngol lollineede e ngal nattal: -shotPagePrivacyMessage = Kala gonnduɗo e jokkol ngol ina waawi yiyde ngal nattal. -shotPageCopyImageText = - .label = Natto binndol natal ngal -shotPageConfirmDeletion = Aɗa yananaa tiɗde momtude ngal nattal daañaa? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = So tawii a waɗaani hay dara, ndee nattannde momtoyte haa abadaa . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = Artir haa { $date } -shotPageExpiredMessage = Ndee nattannde buntii. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Hello ngo ɗum sosaa e iwdi mum ngoo nani: -shotPageDeleteButton = - .title = Momtu ndee nattannde -shotPageAbuseButton = - .title = Siimto ndee nattannde sabu bonannde, spam, wall caɗeele goɗɗe -shotPageDownloadShot = - .title = Aawto -shotPageDownload = Aawto -shotPageScreenshotsDescription = Leƴƴanɗe kuurgal mbeeɓtinaama. Ƴettu, danndu, etee lollin leƴƴanɗe kuurgal tawi a ummaaki e Firefox. -shotPageUpsellFirefox = Heɓ Firefox jooni -shotPageDMCAMessage = Ndee nattannde nattii heɓaade sabu won naamniiɗo ganndal mum keeringal. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Tiiɗno neldu iimeel { $dmca } ngam ɗaɓɓude humpito ɓurngo heewde. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = So tawii natte maa ina naamnitee ko heewi, ina gasa min riiwtude keɓgol maa Leƴƴanɗe kuurgal Firefox. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Tiiɗno naatnu URL nattannde ndee e iimeel maa: { $url } -shotPageKeepFor = Haa hol ndeen ndee ɗoo nattannde nanngatee? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Suɓo sahaa -shotPageKeepTenMinutes = Hojomaaji 10 -shotPageKeepOneHour = Waktu 1 -shotPageKeepOneDay = Ñalawma 1 -shotPageKeepOneWeek = Yontere 1 -shotPageKeepTwoWeeks = Jonte 2 -shotPageKeepOneMonth = Lewru 1 -shotPageSaveExpiration = Danndu -shotPageCancelExpiration = Haaytu -shotPageDoesNotExpire = buntaani -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = Ina bunta -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = Buntii -timeDiffJustNow = Jooni -timeDiffMinutesAgo = - { $number -> - *[one] gila hojom 1 - } -timeDiffHoursAgo = - { $number -> - *[one] gila waktu 1 - } -timeDiffDaysAgo = - { $number -> - *[one] haŋki - } -timeDiffFutureSeconds = nder leƴƴanɗe seeɗa -timeDiffFutureMinutes = - { $number -> - *[one] nder hojom 1 - } -timeDiffFutureHours = - { $number -> - *[one] nder waktu 1 - } -timeDiffFutureDays = - { $number -> - *[one] janngo - } -errorThirdPartyCookiesEnabled = So tawii a ƴettii ndee nattannde kadi a roŋkii momtude nde, aɗa waawi hatojinde e hurminde dumunna seeɗa kuukiije janane e cuɓoraaɗe wanngorde maa. - -## Annotations - -annotationPenButton = - .title = Kuɗol -annotationHighlighterButton = - .title = Jalbinoowo -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Momtu - -## Settings Page - - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Juumre e momtugol nattannde: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Natte am: yiylo sabu { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Juumre e jaltingol hello: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Yiylo natte am -shotIndexPageSearchButton = - .title = Yiylo -shotIndexPageNoShotsMessage = Alaa natte danndaaɗe. -shotIndexPageNoShotsInvitation = Jokku, sos won heen. -shotIndexPageLookingForShots = Ngonɗaa ko e yiylaade natte maa... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageClearSearchButton = - .title = Momtu njiilaw -shotIndexPageConfirmShotDelete = Momtu ndee nattannde? -shotIndexPagePreviousPage = - .title = Hello ɓennungo -shotIndexPageNextPage = - .title = Hello aroowo - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - -metricsPageTotalsQueryTitle = Kuuɓe -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Sifannde Leƴƴanɗe kuurgal -metricsPageTotalsQueryDevices = Kuuɓal kaɓirɗe keftinaaɗe -metricsPageTotalsQueryActiveShots = Natte caasɗe -metricsPageTotalsQueryExpiredShots = Buntii (kono ina artiroo) -metricsPageTotalsQueryExpiredDeletedShots = Buntii (etee momtaama) -metricsPageShotsQueryTitle = Natte kala Ñalawma -metricsPageShotsQueryDescription = Limoore natte cosaaɗe ñande kala (e balɗe 30 jawtuɗe ɗee) -metricsPageShotsQueryCount = Limoore natte -metricsPageShotsQueryDay = Ñalawma -metricsPageUsersQueryTitle = Huutorɓe kala Ñalawma -metricsPageUsersQueryDescription = Limoore huutorɓe sosɓe ko famɗi fof nattannde wootere, kala ñalawma (balɗe 30 jawtuɗe) -metricsPageUsersQueryCount = Limoore huutorɓe -metricsPageUsersQueryDay = Ñalawma -metricsPageUserShotsQueryTitle = Limoore Natte ɗe Kuutoro kala waɗi -metricsPageUserShotsQueryDescription = Limoore huutorɓe waɗ-ɓe ko ina fota e N kuuɓal natte -metricsPageUserShotsQueryCount = Limoore huutorɓe -metricsPageUserShotsQueryShots = Limoore tolno natte caasɗe (ɗe mbuntaani) -metricsPageRetentionQueryTitle = Jaggugol yontere kala -metricsPageRetentionQueryUsers = Limoore huutorɓe -metricsPageTotalRetentionQueryUsers = Limoore huutorɓe -metricsPageVersionQueryTitle = Yamre jokkel -metricsPageVersionQueryDescription = Yamre jokkel kuutorongel saanga ceŋogol, e balɗe 14 jawtuɗe ɗee. -metricsPageVersionQueryUsers = Limoore huutorɓe seŋotooɓe -metricsPageVersionQueryVersion = Yamre jokkel -metricsPageVersionQueryLastSeen = Ñalawma diff --git a/locales/fi/server.ftl b/locales/fi/server.ftl deleted file mode 100644 index c7fe51afae..0000000000 --- a/locales/fi/server.ftl +++ /dev/null @@ -1,386 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Omat kaappaukset -gHomeLink = Etusivu -gNoShots = - .alt = Kaappauksia ei löytynyt -gScreenshotsDescriptionServerless = Kuvakaappaukset helposti. Ota ja lataa kuvakaappauksia poistumatta Firefoxista. - -## Header - -buttonSettings = - .title = Asetukset -buttonSignIn = - .title = Kirjaudu sisään -screenshotsLogo = - .title = Screenshots-etusivu -bannerUpsell = { gScreenshotsDescription } Hanki Firefox nyt -shutdownPageTitle = Screenshots on muuttumassa -shutdownPageDescription = Alkaen kesäkuusta Screenshots ei enää tarjoa tallentamista verkkoon. Haluatko pitää omat kaappauksesi? Voit ladata kaappaukset yksitellen tai pakettina. Kiitos, että käytit ominaisuutta. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Mitä uutta Firefox Screenshots -palvelussa? -onboardingPromoMessageListItem2 = Tallenna suosikkikuvasi ikuisesti -onboardingPromoDismissButton = Hylkää - .title = Hylkää -onboardingPromoSigninButton = Kirjaudu sisään - .title = Kirjaudu sisään - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Käyttöehdot -footerLinkPrivacy = Tietosuojakäytäntö -footerReportShot = Ilmoita kaappaus - .title = Ilmoita tämä kaappaus väärinkäytön, roskauksen tai muun ongelman takia -footerLinkFaqs = UKK -footerLinkDMCA = Ilmoita immateriaalioikeuksien loukkauksesta -footerLinkDiscourse = Anna palautetta -footerLinkRemoveAllData = Poista kaikki tiedot - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Luodaan: { $title } -creatingPageTitleDefault = sivu -creatingPageWaitMessage = Tallennetaan kaappausta… - -## Home page - -homePageDescription = - .content = Kuvien kaappaminen intuitiivisesti, suoraan selaimessasi. Kaappaa, tallenna ja jaa kuvakaappauksia selatessasi verkkoa Firefoxilla. -homePageButtonMyShots = Siirry omiin kaappauksiini -homePageTeaser = Tulossa pian… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Lataa ilmaiseksi -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Miten Firefox Screenshots toimii -homePageGetStartedTitle = Aloitetaan -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Valitse Screenshots-kuvake osoitepalkissa olevasta Sivun toiminnot -valikosta, niin Screenshots-valikko avautuu selainikkunan päälle. -homePageCaptureRegion = Kaappaa alue -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Valitse kaapattava alue napsauttamalla ja vetämällä. Tai pidä hiirtä sen päällä ja napsauta – Screenshots valitsee alueen puolestasi. PIdätkö näkemästäsi? Valitse Tallenna, niin voit katsella kuvakaappaustasi verkossa, tai alas osoittava nuoli, niin voit ladata sen tietokoneellesi. -homePageCapturePage = Kaappaa sivu -homePageCapturePageDescription = Kaappaa kokonaisia sivuja käyttämällä yläoikean kulman painikkeita. Tallenna näkyvä alue -painike kaappaa alueen, jonka voit nähdä vierittämättä sivua, ja Tallenna koko sivu -painike tallentaa kaiken sivulla olevan. -homePageDownloadCopy = Lataa tai kopioi -homePageLegalLink = Lakiteksti -homePagePrivacyLink = Tietosuoja -homePageTermsLink = Käyttöehdot -homePageCookiesLink = Evästeet - -## Leave Screenshots page - -leavePageRemoveAllData = Poista kaikki tiedot -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Sinulla tulee olla Firefox Screenshots asennettuna tai kirjautuneena Firefox-tilillesi, jos haluat poistaa tilisi -leavePageErrorGeneric = Tapahtui virhe -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Tämä poistaa kaikki Firefox Screenshots -palvelun tietosi pysyvästi. -leavePageButtonProceed = Jatka -leavePageButtonCancel = Peruuta -leavePageDeleted = Kaikki kuvakaappauksesi on poistettu! - -## Not Found page - -notFoundPageTitle = Sivua ei löydy -notFoundPageIntro = Oho. -notFoundPageDescription = Sivua ei löydy. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Kuvakaappaus: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Vanhentumisen tallennus epäonnistui -shotPageAlertErrorDeletingShot = Kaappauksen poisto epäonnistui -shotPageAlertErrorUpdatingTitle = Nimen tallennus epäonnistui -shotPageConfirmDelete = Haluatko varmasti poistaa tämän kaappauksen pysyvästi? -shotPageShareButton = - .title = Jaa -shotPageCopyButton = - .title = Kopioi kuva leikepöydälle -shotPageCopyActionLabel = Kopioi -shotPageCopied = Kopioitu -shotPageShareFacebook = - .title = Jaa Facebookissa -shotPageShareTwitter = - .title = Jaa Twitterissä -shotPageSharePinterest = - .title = Jaa Pinterestissä -shotPageShareEmail = - .title = Jaa linkki sähköpostitse -shotPageShareLink = Saa jaettava linkki tähän kaappaukseen: -shotPagePrivacyMessage = Kaikki linkin haltijat voivat katsoa tätä kaappausta. -shotPageCopyImageText = - .label = Kopioi kuvateksti -shotPageConfirmDeletion = Haluatko varmasti poistaa tämän kaappauksen pysyvästi? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Jos et tee mitään, kaappaus poistetaan pysyvästi . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = palauta { $date } saakka -shotPageExpiredMessage = Tämä kaappaus on vanhentunut. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Tässä on sivu, josta kaappaus alun perin luotiin: -shotPageDeleteButton = - .title = Poista tämä kaappaus -shotPageDownloadShot = - .title = Lataa -shotPageEditButton = - .title = Muokkaa tätä kuvaa -shotPagefavoriteButton = - .title = Merkitse tämä kaappaus suosikiksi -shotPageBackToHomeButton = - .title = Etusivu -shotPageAllShotsButton = - .title = Kaikki kaappaukset -shotPageDMCAMessage = Tämä kaappaus ei ole enää saatavissa, koska kolmas osapuoli teki immateriaalioikeusvaatimuksen. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Pyydä lisätietoja lähettämällä sähköpostia osoitteeseen { $dmca }. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Jos kaappauksiisi kohdistuu useita vaatimuksia, voimme perua käyttöoikeutesi Firefox Screenshots -palveluun. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Liitä sähköpostiisi tämän kaappauksen verkko-osoite: { $url } -shotPageKeepFor = Kuinka kauan tämä kaappaus tulisi säilyttää? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Valitse aika -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Toistaiseksi ∞ -shotPageKeepTenMinutes = 10 minuuttia -shotPageKeepOneHour = 1 tunti -shotPageKeepOneDay = 1 päivä -shotPageKeepOneWeek = 1 viikko -shotPageKeepTwoWeeks = 2 viikkoa -shotPageKeepOneMonth = 1 kuukausi -shotPageSaveExpiration = tallenna -shotPageCancelExpiration = peruuta -shotPageDoesNotExpire = ei vanhene -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = vanhenee -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = vanheni -timeDiffJustNow = juuri nyt -timeDiffMinutesAgo = - { $number -> - [one] 1 minuutti sitten - *[other] { $number } minuuttia sitten - } -timeDiffHoursAgo = - { $number -> - [one] 1 tunti sitten - *[other] { $number } tuntia sitten - } -timeDiffDaysAgo = - { $number -> - [one] eilen - *[other] { $number } päivää sitten - } -timeDiffFutureSeconds = muutaman sekunnin kuluttua -timeDiffFutureMinutes = - { $number -> - [one] 1 minuutin kuluttua - *[other] { $number } minuutin kuluttua - } -timeDiffFutureHours = - { $number -> - [one] 1 tunnin kuluttua - *[other] { $number } tunnin kuluttua - } -timeDiffFutureDays = - { $number -> - [one] huomenna - *[other] { $number } päivän kuluttua - } -errorThirdPartyCookiesEnabled = Jos otit tämän kaappauksen etkä pysty poistamaan sitä, voit joutua sallimaan kolmannen osapuolen evästeet väliaikaisesti selaimen asetuksista. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Huomio! -promoMessage = Päivitetyillä muokkaustyökaluilla voit rajata ja korostaa kuvaasi sekä lisätä tekstiä. -promoLink = Kokeile niitä -promoCloseButton = - .title = Sulje ilmoitus - -## Annotations - -annotationPenButton = - .title = Kynä -annotationHighlighterButton = - .title = Korostus -annotationUndoButton = - .title = Kumoa -annotationRedoButton = - .title = Tee uudelleen -annotationTextButton = - .title = Lisää tekstiä -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Pyyhi -annotationCropButton = - .title = Rajaa -annotationSaveEditButton = Tallenna - .title = Tallenna muokkaus -annotationCancelEditButton = Peruuta - .title = Peruuta muokkaus -annotationCropConfirmButton = Vahvista - .title = Vahvista valinta -annotationCropCancelButton = Peruuta - .title = Peruuta valinta -annotationColorWhite = - .title = Valkoinen -annotationColorBlack = - .title = Musta -annotationColorRed = - .title = Punainen -annotationColorGreen = - .title = Vihreä -annotationColorBlue = - .title = Sininen -annotationColorYellow = - .title = Keltainen -annotationColorPurple = - .title = Violetti -annotationColorSeaGreen = - .title = Merenvihreä -annotationColorGrey = - .title = Harmaa -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tekstin koko -# Values shown in text size selection dropdown -textSizeSmall = Pieni -textSizeMedium = Keskikokoinen -textSizeLarge = Suuri -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Vahvista - .title = Vahvista -textToolCancelButton = Peruuta - .title = Peruuta -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hei - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Jokin meni pieleen -copyImageErrorMessage = Kuvakaappausta ei voitu kopioida leikepöydälle. - -## Settings Page - -settingsDisconnectButton = Katkaise yhteys - .title = Katkaise yhteys -settingsGuestAccountMessage = Vierastili -settingsSignInButton = Kirjaudu sisään - .title = Kirjaudu sisään -SettingsPageHeader = Firefox Screenshots -asetukset -settingsFirefoxAccountSubHeader = Firefox-tili -settingsClosePreferences = - .title = Sulje asetukset -settingsFxaDisconnectAlertMessage = Haluatko varmasti katkaista tämän laitteen yhteyden Firefox-tiliisi? - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Kaappauksen poisto epäonnistui: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Omat kaappaukset: haku sanoilla { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Sivun näyttäminen epäonnistui: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Hae kaappauksista -shotIndexPageNoShotsMessage = Ei tallennettuja kaappauksia. -shotIndexPageNoShotsInvitation = Ryhdytäänpä luomaan sellaisia. -shotIndexPageLookingForShots = Etsitään kaappauksia… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Haulla ei löytynyt yhtään kaappausta. -shotIndexPageMyShotsButton = - .title = Omat kaappaukset -shotIndexPageClearSearchButton = - .title = Tyhjennä haku -shotIndexPageConfirmShotDelete = Poistetaanko tämä kaappaus? -shotIndexPagePreviousPage = - .title = Edellinen sivu -shotIndexPageNextPage = - .title = Seuraava sivu -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Tämä ei ole suosikkikaappaus, se vanhenee -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Tämä on suosikkikaappaus eikä vanhene -shotIndexSyncedShot = - .title = Kuvakaappaus otettu toisella laitteella - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Haluatko varmasti poistaa tämän kaappauksen? -shotDeleteCancel = Peruuta - .title = Peruuta -shotDeleteConfirm = Poista - .title = Poista - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Kuvien vienti: napsauta Tiedosto > Tallenna sivu nimellä… ja löydät kuvakaappauksesi kansiosta { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots Metrics -metricsPageTotalsQueryTitle = Totals -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = An overview of Screenshots -metricsPageTotalsQueryDevices = Total devices registered -metricsPageTotalsQueryActiveShots = Active shots -metricsPageTotalsQueryExpiredShots = Expired (but recoverable) -metricsPageTotalsQueryExpiredDeletedShots = Expired (and deleted) -metricsPageShotsQueryTitle = Shots by Day -metricsPageShotsQueryDescription = Number of shots created each day (for the last 30 days) -metricsPageShotsQueryCount = Number of shots -metricsPageShotsQueryDay = Day -metricsPageUsersQueryTitle = Users by Day -metricsPageUsersQueryDescription = Number of users who created at least one shot, by day (last 30 days) -metricsPageUsersQueryCount = Number of users -metricsPageUsersQueryDay = Day -metricsPageUserShotsQueryTitle = Number of Shots per User -metricsPageUserShotsQueryDescription = The number of users who have about N total shots -metricsPageUserShotsQueryCount = Number of users -metricsPageUserShotsQueryShots = Approximate number of active (unexpired) shots -metricsPageRetentionQueryTitle = Retention by Week -metricsPageRetentionQueryDescription = Number of days from a userʼs first shot to most recent shot, grouped by starting week -metricsPageRetentionQueryUsers = Number of users -metricsPageRetentionQueryDays = Days from the userʼs first to most recent shot -metricsPageRetentionQueryFirstWeek = Week the user first created a shot -metricsPageTotalRetentionQueryTitle = Total Retention -metricsPageTotalRetentionQueryDescription = Length of time users have been creating shots, grouped by week -metricsPageTotalRetentionQueryUsers = Number of users -metricsPageTotalRetentionQueryDays = Days the user has been creating shots -metricsPageVersionQueryTitle = Add-on Version -metricsPageVersionQueryDescription = The version of the add-on used during login, in the last 14 days -metricsPageVersionQueryUsers = Number of users logging in -metricsPageVersionQueryVersion = Add-on version -metricsPageVersionQueryLastSeen = Day -metricsPageHeader = Metrics -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generated at: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (database time: { $time }ms) diff --git a/locales/fr/server.ftl b/locales/fr/server.ftl deleted file mode 100644 index 6f4cdd4dd4..0000000000 --- a/locales/fr/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mes captures d’écran -gHomeLink = Accueil -gNoShots = - .alt = Aucune capture trouvée -gScreenshotsDescriptionServerless = Les captures d’écran en toute simplicité. Réalisez et téléchargez des captures d’écran sans quitter Firefox. - -## Header - -buttonSettings = - .title = Paramètres -buttonSignIn = - .title = Connexion -screenshotsLogo = - .title = Accueil de Screenshots -bannerSignIn = Connectez-vous ou inscrivez-vous pour accéder à vos captures depuis tous vos appareils et conserver vos préférées durablement. -bannerUpsell = { gScreenshotsDescription } Télécharger Firefox -shutdownWarning = Les captures d’écran enregistrées seront bientôt supprimées. À partir de juin, Screenshots ne proposera plus de stockage en ligne. Vous souhaitez conserver des captures de votre bibliothèque ? Téléchargez-les sur votre ordinateur. -shutdownPageTitle = Changements apportés à Screenshots -shutdownPageDescription = À partir de juin, Screenshots ne proposera plus de stockage en ligne. Vous souhaitez conserver les captures de votre bibliothèque ? Téléchargez les captures individuellement ou par lot. Nous vous remercions d’utiliser cette fonctionnalité et nous excusons pour la gêne occasionnée. -shutdownPageContinue = Nous espérons que vous continuerez à utiliser Screenshots pour capturer, copier et télécharger des captures d’écran. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Nouveautés de Firefox Screenshots -onboardingPromoMessage = Désormais, vous pouvez vous connecter à Screenshots avec un compte Firefox et bénéficier de plus de possibilités : -onboardingPromoMessageListItem1 = Accéder à votre galerie de captures depuis tous vos appareils -onboardingPromoMessageListItem2 = Conserver indéfiniment vos photos préférées -onboardingPromoDismissButton = Ignorer - .title = Ignorer -onboardingPromoSigninButton = Se connecter - .title = Se connecter - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Conditions -footerLinkPrivacy = Politique de confidentialité -footerReportShot = Signaler cette capture - .title = Signaler cette capture comme abusive, du spam ou autre -footerLinkFaqs = Questions fréquentes -footerLinkDMCA = Signaler une violation de la p.i. -footerLinkDiscourse = Donner son avis -footerLinkRemoveAllData = Supprimer toutes les données - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Capture de { $title } -creatingPageTitleDefault = page -creatingPageWaitMessage = Enregistrement de votre capture… - -## Home page - -homePageDescription = - .content = Des captures d’écran directement dans votre navigateur. Cadrez, enregistrez et partagez vos captures d’écran en naviguant sur le Web avec Firefox. -homePageButtonMyShots = Afficher mes captures -homePageTeaser = Bientôt disponible… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Téléchargement gratuit -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Principes de fonctionnement de Firefox Screenshots -homePageGetStartedTitle = Pour bien commencer -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Cliquez sur l’icône Screenshots depuis le menu des actions de la page dans la barre d’adresse, puis le menu Screenshots s’affichera en haut de votre fenêtre de navigation. -homePageCaptureRegion = Capturez une zone de la page -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Sélectionnez une zone de la page par cliquer-glisser ou bien survolez un élément et Screenshots sélectionnera la zone pour vous. Lorsque cela vous convient, cliquez sur « Enregistrer » pour accéder à votre capture d’écran en ligne ou sur le bouton représentant une flèche vers le bas pour la télécharger sur votre ordinateur. -homePageCapturePage = Capturez une page -homePageCapturePageDescription = Utilisez les boutons en haut à droite pour capturer des pages complètes. Le bouton « Capturer la zone visible » permet de capturer la zone que vous pouvez afficher sans faire défiler la page, et le bouton « Capturer la page complète » capturera l’ensemble de la page. -homePageDownloadCopy = Téléchargez ou copiez -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Faites votre plus belle capture : Screenshots vous permet de la télécharger ou de la copier dans le presse-papiers. -homePageLegalLink = Mentions légales -homePagePrivacyLink = Confidentialité -homePageTermsLink = Conditions d’utilisation -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Supprimer toutes les données -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Firefox Screenshots doit être installé ou connecté à un compte Firefox pour supprimer votre compte -leavePageErrorGeneric = Une erreur s’est produite -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Cette action supprimera définitivement l’ensemble de vos données Firefox Screenshots. -leavePageButtonProceed = Poursuivre -leavePageButtonCancel = Annuler -leavePageDeleted = Toutes vos captures ont été supprimées. - -## Not Found page - -notFoundPageTitle = Page introuvable -notFoundPageIntro = Oups. -notFoundPageDescription = Page introuvable. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Capture d’écran : { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Erreur lors de l’enregistrement de l’expiration -shotPageAlertErrorDeletingShot = Erreur lors de la suppression de la capture -shotPageAlertErrorUpdatingTitle = Erreur lors de l’enregistrement du titre -shotPageConfirmDelete = Voulez-vous vraiment supprimer cette capture de façon définitive ? -shotPageShareButton = - .title = Partager -shotPageCopyButton = - .title = Copier l’image dans le presse-papiers -shotPageCopyActionLabel = Copier -shotPageCopied = Copié -shotPageShareFacebook = - .title = Partager sur Facebook -shotPageShareTwitter = - .title = Partager sur Twitter -shotPageSharePinterest = - .title = Partager sur Pinterest -shotPageShareEmail = - .title = Partager le lien par courriel -shotPageShareLink = Obtenir un lien pour partager cette capture : -shotPagePrivacyMessage = Toute personne disposant du lien peut voir cette capture. -shotPageCopyImageText = - .label = Copier le texte de l’image -shotPageConfirmDeletion = Voulez-vous vraiment supprimer définitivement cette capture ? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Si vous ne faites rien, cette capture sera supprimée de façon définitive . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaurer jusqu’au { $date } -shotPageExpiredMessage = Cette capture a expiré. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Voici la page depuis laquelle elle a été créée : -shotPageDeleteButton = - .title = Supprimer cette capture -shotPageDownloadShot = - .title = Télécharger -shotPageEditButton = - .title = Modifier cette image -shotPagefavoriteButton = - .title = Ajouter à vos captures favorites -shotPageBackToHomeButton = - .title = Page d’accueil -shotPageAllShotsButton = - .title = Toutes les captures -shotPageScreenshotsDescriptionServerless = Les captures d’écran en toute simplicité. Réalisez et téléchargez des captures d’écran sans quitter Firefox. -shotPageDMCAMessage = Cette capture n’est plus disponible, car un tiers a signalé une atteinte aux droits de la propriété intellectuelle. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Veuillez contacter { $dmca } pour demander plus d’informations. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Si vos captures font l’objet de multiples réclamations, nous pouvons révoquer votre accès à Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Veuillez inclure l’URL vers cette capture dans votre message : { $url } -shotPageKeepFor = Combien de temps cette capture doit-elle être conservée ? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Sélectionner une durée -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indéfiniment ∞ -shotPageKeepTenMinutes = 10 minutes -shotPageKeepOneHour = 1 heure -shotPageKeepOneDay = 1 jour -shotPageKeepOneWeek = 1 semaine -shotPageKeepTwoWeeks = 2 semaines -shotPageKeepOneMonth = 1 mois -shotPageSaveExpiration = enregistrer -shotPageCancelExpiration = annuler -shotPageDoesNotExpire = n’expire jamais -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expire -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = a expiré -timeDiffJustNow = à l’instant -timeDiffMinutesAgo = - { $number -> - [one] il y a 1 minute - *[other] il y a { $number } minutes - } -timeDiffHoursAgo = - { $number -> - [one] il y a 1 heure - *[other] il y a { $number } heures - } -timeDiffDaysAgo = - { $number -> - [one] hier - *[other] il y a { $number } jours - } -timeDiffFutureSeconds = dans quelques secondes -timeDiffFutureMinutes = - { $number -> - [one] dans 1 minute - *[other] dans { $number } minutes - } -timeDiffFutureHours = - { $number -> - [one] dans 1 heure - *[other] dans { $number } heures - } -timeDiffFutureDays = - { $number -> - [one] demain - *[other] dans { $number } jours - } -errorThirdPartyCookiesEnabled = Si vous avez effectué cette capture et que vous ne pouvez pas la supprimer, vous devrez peut-être activer temporairement les cookies tiers depuis les préférences de votre navigateur. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Prenez des notes ! -promoMessage = La nouvelle version des outils d’édition vous permet de recadrer, surligner et même ajouter du texte à vos captures. -promoLink = Essayez-les -promoCloseButton = - .title = Fermer la notification - -## Annotations - -annotationPenButton = - .title = Stylo -annotationHighlighterButton = - .title = Surligneur -annotationUndoButton = - .title = Annuler -annotationRedoButton = - .title = Rétablir -annotationTextButton = - .title = Ajouter du texte -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Réinitialiser -annotationCropButton = - .title = Rogner -annotationSaveEditButton = Enregistrer - .title = Enregistrer les modifications -annotationCancelEditButton = Annuler - .title = Annuler les modifications -annotationCropConfirmButton = Confirmer - .title = Confirmer la sélection -annotationCropCancelButton = Annuler - .title = Annuler la sélection -annotationColorWhite = - .title = Blanc -annotationColorBlack = - .title = Noir -annotationColorRed = - .title = Rouge -annotationColorGreen = - .title = Vert -annotationColorBlue = - .title = Bleu -annotationColorYellow = - .title = Jaune -annotationColorPurple = - .title = Violet -annotationColorSeaGreen = - .title = Bleu-vert -annotationColorGrey = - .title = Gris -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Taille du texte -# Values shown in text size selection dropdown -textSizeSmall = Petite -textSizeMedium = Moyenne -textSizeLarge = Grande -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirmer - .title = Confirmer -textToolCancelButton = Annuler - .title = Annuler -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Bonjour - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Une erreur s’est produite -copyImageErrorMessage = Impossible de copier votre capture dans le presse-papiers. - -## Settings Page - -settingsDisconnectButton = Se déconnecter - .title = Se déconnecter -settingsGuestAccountMessage = Compte invité -settingsSignInButton = Se connecter - .title = Se connecter -SettingsPageHeader = Paramètres de Firefox Screenshots -settingsFirefoxAccountSubHeader = Compte Firefox -settingsClosePreferences = - .title = Fermer les préférences -settingsFxaDisconnectAlertMessage = Voulez-vous vraiment déconnecter cet appareil de votre compte Firefox ? -settingsFxaDisconnectDescription = Si vous vous déconnectez, vous devrez vous reconnecter pour accéder à nouveau à vos captures d’écran. -settingsFxaConnectDescription = Vous pouvez vous connecter pour accéder à vos captures d’écran sur tous vos appareils. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Erreur lors de la suppression de la capture : { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mes captures : rechercher { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Erreur lors du rendu de la page : { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Rechercher mes captures -shotIndexPageNoShotsMessage = Aucune capture enregistrée. -shotIndexPageNoShotsInvitation = Comment ça fonctionne ? Allez-y, faites une capture. -shotIndexPageLookingForShots = Nous recherchons vos captures… -shotIndexPageNoSearchResultsIntro = Hum… -shotIndexPageNoSearchResults = Nous n’avons trouvé aucune capture correspondant à votre recherche. -shotIndexPageMyShotsButton = - .title = Mes captures d’écran -shotIndexPageClearSearchButton = - .title = Effacer la recherche -shotIndexPageConfirmShotDelete = Supprimer cette capture ? -shotIndexPagePreviousPage = - .title = Page précédente -shotIndexPageNextPage = - .title = Page suivante -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Cette capture ne figure pas parmi les préférées et ne sera bientôt plus disponible -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Cette capture d’écran n’expirera jamais, car elle fait partie de vos captures favorites -shotIndexSyncedShot = - .title = Capture effectuée sur un autre appareil -shotIndexAlertErrorFavoriteShot = Erreur lors de la modification du statut de la capture favorite - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Voulez-vous vraiment supprimer cette capture ? -shotDeleteCancel = Annuler - .title = Annuler -shotDeleteConfirm = Supprimer - .title = Supprimer - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Pour exporter : utilisez Fichier > Enregistrer sous… et vous trouverez vos captures d’écran dans le dossier { $folder }. - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Statistiques de Firefox Screenshots -metricsPageTotalsQueryTitle = Totaux -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Vue d’ensemble de Screenshots -metricsPageTotalsQueryDevices = Total des appareils enregistrés -metricsPageTotalsQueryActiveShots = Captures actives -metricsPageTotalsQueryExpiredShots = Expiré (mais récupérable) -metricsPageTotalsQueryExpiredDeletedShots = Expiré (et supprimé) -metricsPageShotsQueryTitle = Captures par jour -metricsPageShotsQueryDescription = Nombre de captures prises chaque jour (au cours des 30 derniers jours) -metricsPageShotsQueryCount = Nombre de captures -metricsPageShotsQueryDay = Jour -metricsPageUsersQueryTitle = Utilisateurs par jour -metricsPageUsersQueryDescription = Nombre d’utilisateurs ayant pris au moins une capture (au cours des 30 derniers jours) -metricsPageUsersQueryCount = Nombre d’utilisateurs -metricsPageUsersQueryDay = Jour -metricsPageUserShotsQueryTitle = Nombre de captures par utilisateur -metricsPageUserShotsQueryDescription = Nombre d’utilisateurs possédant N captures au total -metricsPageUserShotsQueryCount = Nombre d’utilisateurs -metricsPageUserShotsQueryShots = Nombre approximatif de captures actives (n’ayant pas expiré) -metricsPageRetentionQueryTitle = Conservation par semaines -metricsPageRetentionQueryDescription = Nombre de jours entre la première et la dernière capture d’un utilisateur, groupés selon la semaine de départ -metricsPageRetentionQueryUsers = Nombre d’utilisateurs -metricsPageRetentionQueryDays = Nombre de jours entre la première et la dernière capture d’un utilisateur -metricsPageRetentionQueryFirstWeek = Semaine durant laquelle un utilisateur a effectué une capture pour la première fois -metricsPageTotalRetentionQueryTitle = Conservation totale -metricsPageTotalRetentionQueryDescription = Durées au cours desquelles des utilisateurs ont effectué des captures, groupées par semaine -metricsPageTotalRetentionQueryUsers = Nombre d’utilisateurs -metricsPageTotalRetentionQueryDays = Nombre de jours où l’utilisateur a effectué des captures -metricsPageVersionQueryTitle = Version du module -metricsPageVersionQueryDescription = La version du module au moment de la connexion, au cours des 14 derniers jours -metricsPageVersionQueryUsers = Nombre d’utilisateurs connectés -metricsPageVersionQueryVersion = Version du module -metricsPageVersionQueryLastSeen = Jour -metricsPageHeader = Statistiques -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Généré le : { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (durée d’utilisation de la base de données : { $time } ms) diff --git a/locales/fy-NL/server.ftl b/locales/fy-NL/server.ftl deleted file mode 100644 index bd616f8a0b..0000000000 --- a/locales/fy-NL/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Myn ôfbyldingen -gHomeLink = Startside -gNoShots = - .alt = Gjin ôfbyldingen fûn -gScreenshotsDescriptionServerless = Skermôfbyldingen op in ienfâldige manier. Lis skermôfbyldingen fêst en download se sûnder Firefox te ferlitten. - -## Header - -buttonSettings = - .title = Ynstellingen -buttonSignIn = - .title = Oanmelde -screenshotsLogo = - .title = Startside fan Screenshots -bannerSignIn = Meld jo oan of registrearje om jo ôfbyldingen op mear apparaten te benaderjen en jo favoriten foar altyd te bewarjen. -bannerUpsell = { gScreenshotsDescription } Firefox no downloade -shutdownWarning = De bewarre skermôfbyldingen ferrinne ynkoarten. Fan juny ôf biedt Screenshots gjin online ûnthâld mear oan. Wolle jo ôfbyldingen út jo biblioteek bewarje? Download se dan nei jo kompjûter. -shutdownPageTitle = Screenshots giet feroarje -shutdownPageDescription = Fan juny ôf biedt Screenshots gjin offlineûnthâld mear. Wolle jo ôfbyldingen út jo biblioteek behâlde? Download se apart of bondele. Tank foar it gebrûk fan dizze funksje, en ekskús foar it eventuele ûngemak. -shutdownPageContinue = Wy hoopje dat jo Screenshots brûke bliuwe foar it fêstlizzen, kopiearjen en downloaden fan ôfbyldingen. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Wat is der nij by Firefox Screenshots? -onboardingPromoMessage = Jo kinne jo no oanmelde by Screenshots mei in Firefox-account en mear dwaan: -onboardingPromoMessageListItem1 = Jo biblioteek benaderje op al jo apparaten -onboardingPromoMessageListItem2 = Jo favorite ôfbyldingen foar altyd bewarje -onboardingPromoDismissButton = Slute - .title = Slute -onboardingPromoSigninButton = Oanmelde - .title = Oanmelde - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Betingsten -footerLinkPrivacy = Privacyferklearring -footerReportShot = Ofbylding rapportearje - .title = Dizze ôfbylding rapportearje fanwegen misbrûk, spam of oare problemen -footerLinkFaqs = FAQ's -footerLinkDMCA = IP-misbrûk rapportearje -footerLinkDiscourse = Kommentaar jaan -footerLinkRemoveAllData = Alle gegevens fuortsmite - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } wurdt makke -creatingPageTitleDefault = side -creatingPageWaitMessage = Jo ôfbylding bewarje… - -## Home page - -homePageDescription = - .content = Yntuïtive skermôfbyldingen, streekrjocht yn de browser. Wylst jo mei Firefox op it web surfe, kinne jo skermôfbyldingen meitsje, bewarje en diele. -homePageButtonMyShots = Nei myn ôfbyldingen -homePageTeaser = Ynkoarten beskikber... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Fergees downloade -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Hoe Firefox Screenshots wurket -homePageGetStartedTitle = Oan de slach -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Selektearje it Screenshots-piktogram fan it menu Pagina-aksjes yn de adresbalke út, en it Screenshots-menu ferskynt boppe yn jo browserfinster. -homePageCaptureRegion = In gebiet fêstlizze -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klik en sleep om it gebiet dat jo fêstlizze wolle te ferslepen. Of wiis oan en klik – Screenshots selektearret it gebiet foar jo. Tefreden mei wat jo sjogge? Selektearje Bewarje om jo skermôfbylding online te benaderjen, of it pylkje nei ûnder om dizze nei jo kompjûter te bewarjen. -homePageCapturePage = In side fêstlizze -homePageCapturePageDescription = Brûk de knoppen yn de rjochter boppehoek om folsleine siden fêst te lizzen. De knop Sichtber gebiet bewarje leit it gebied fêst dat jo sûnder skowen sjen kinne, en Folsleine side bewarje leit alles op de side fêst. -homePageDownloadCopy = Downloade of kopiearje -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Mei Screenshots kinne jo jo seleksje downloade of dizze streekrjocht nei jo klamboerd kopiearje. -homePageLegalLink = Juridysk -homePagePrivacyLink = Privacy -homePageTermsLink = Betingsten -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Alle gegevens fuortsmite -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Jo moatte Firefox Screenshots ynstallearre hawwe of by jo Firefox-account oanmeld wêze om jo account fuort te smiten -leavePageErrorGeneric = Der is in flater bard -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Hjirtroch wurde al jo Firefox Screenshots-gegevens definityf fuortsmiten. -leavePageButtonProceed = Fierdergean -leavePageButtonCancel = Annulearje -leavePageDeleted = Al jo skermôfbyldingen binne wiske! - -## Not Found page - -notFoundPageTitle = Side net fûn -notFoundPageIntro = Oeps. -notFoundPageDescription = Side net fûn. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Skermôfbylding: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Flater by bewarjen fan ferrindatum -shotPageAlertErrorDeletingShot = Flater by bewarjen fan ôfbylding -shotPageAlertErrorUpdatingTitle = Flater by bewarjen fan titel -shotPageConfirmDelete = Binne jo wis dat jo dizze ôfbylding definityf fuortsmite wolle? -shotPageShareButton = - .title = Diele -shotPageCopyButton = - .title = Ofbylding nei klamboerd kopiearje -shotPageCopyActionLabel = Kopiearje -shotPageCopied = Kopiearre -shotPageShareFacebook = - .title = Diele op Facebook -shotPageShareTwitter = - .title = Diele op Twitter -shotPageSharePinterest = - .title = Diele op Pinterest -shotPageShareEmail = - .title = Keppeling diele fia e-mail -shotPageShareLink = In dielbere keppeling nei dizze ôfbylding krije: -shotPagePrivacyMessage = Elkenien mei de keppeling kin dizze ôfbylding besjen. -shotPageCopyImageText = - .label = Ofbyldingstekst kopiearje -shotPageConfirmDeletion = Binne jo wis dat jo dizze ôfbylding definityf fuortsmite wolle? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = As jo neat dogge, wurdt dizze ôfbylding definityf fuortsmiten. -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = tebeksette oant { $date } -shotPageExpiredMessage = Dizze ôfbylding is ferfallen. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Dit is de side fan wêrôf dizze oarspronklik makke is: -shotPageDeleteButton = - .title = Dizze ôfbylding fuortsmite -shotPageDownloadShot = - .title = Downloade -shotPageEditButton = - .title = Dizze ôfbylding bewurkje -shotPagefavoriteButton = - .title = Dizze ôfbylding favoryt meitsje -shotPageBackToHomeButton = - .title = Startside -shotPageAllShotsButton = - .title = Alle ôfbyldingen -shotPageScreenshotsDescriptionServerless = Skermôfbyldingen op in ienfâldige manier. Lis skermôfbyldingen fêst en download se sûnder Firefox te ferlitten. -shotPageDMCAMessage = Dizze ôfbylding is fanwegen in claim op yntellektueel eigendom troch in eksterne partij net mear beskikber. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Stjoer in e-mail nei { $dmca } om mear ynformaasje op te freegjen. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = As jo ôfbyldingen oan mear claims oanhelle binne, kinne wy jo tagong ta Firefox Screenshots ynlûke. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Foegje de URL fan dizze ôfbylding ta oan jo e-mail: { $url } -shotPageKeepFor = Hoe lang moat dizze ôfbylding bewarre wurde? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Tiid selektearje -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Uneinich ∞ -shotPageKeepTenMinutes = 10 minuten -shotPageKeepOneHour = 1 oer -shotPageKeepOneDay = 1 dei -shotPageKeepOneWeek = 1 wike -shotPageKeepTwoWeeks = 2 wiken -shotPageKeepOneMonth = 1 moanne -shotPageSaveExpiration = bewarje -shotPageCancelExpiration = annulearje -shotPageDoesNotExpire = ferrint net -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = ferrint -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = ferrûn -timeDiffJustNow = sa krekt -timeDiffMinutesAgo = - { $number -> - [one] 1 minút lyn - *[other] { $number } minuten lyn - } -timeDiffHoursAgo = - { $number -> - [one] 1 oer lyn - *[other] { $number } oeren lyn - } -timeDiffDaysAgo = - { $number -> - [one] juster - *[other] { $number } dagen lyn - } -timeDiffFutureSeconds = oer inkelde sekonden -timeDiffFutureMinutes = - { $number -> - [one] oer 1 minút - *[other] oer { $number } minuten - } -timeDiffFutureHours = - timeDiffFutureHours = { $number -> - [one] oer 1 oer - *[other] oer { $number } oeren - } -timeDiffFutureDays = - { $number -> - [one] moarn - *[other] oer { $number } dagen - } -errorThirdPartyCookiesEnabled = As jo dizze ôfbylding makke hawwe en net fuortsmite kinne, moatte jo miskien tydlik cookies fan tredden ynskeakelje fan de foarkarren fan jo browser út. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Let op! -promoMessage = Mei bywurke helpmiddelen foar bewurking kinne jo in skermôfbylding bysnije, markearje, en der sels tekst oan tafoegje. -promoLink = Probearje se ris -promoCloseButton = - .title = Melding slute - -## Annotations - -annotationPenButton = - .title = Pen -annotationHighlighterButton = - .title = Markearstift -annotationUndoButton = - .title = Ungedien meitsje -annotationRedoButton = - .title = Opnij útfiere -annotationTextButton = - .title = Tekst tafoegje -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Wiskje -annotationCropButton = - .title = Bysnije -annotationSaveEditButton = Bewarje - .title = Bewurking bewarje -annotationCancelEditButton = Annulearje - .title = Bewurkjen annulearje -annotationCropConfirmButton = Befêstiging - .title = Seleksje befêstigje -annotationCropCancelButton = Annulearje - .title = Seleksje annulearje -annotationColorWhite = - .title = Wyt -annotationColorBlack = - .title = Swart -annotationColorRed = - .title = Read -annotationColorGreen = - .title = Grien -annotationColorBlue = - .title = Blau -annotationColorYellow = - .title = Giel -annotationColorPurple = - .title = Pears -annotationColorSeaGreen = - .title = Seegrien -annotationColorGrey = - .title = Griis -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tekstgrutte -# Values shown in text size selection dropdown -textSizeSmall = Lyts -textSizeMedium = Gemiddeld -textSizeLarge = Grut -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Befêstigje - .title = Befêstigje -textToolCancelButton = Annulearje - .title = Annulearje -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hallo - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Der is wat misgien -copyImageErrorMessage = Kin jo ôfbylding net nei it klamboard kopiearje. - -## Settings Page - -settingsDisconnectButton = Ferbrekke - .title = Ferbrekke -settingsGuestAccountMessage = Gastaccount -settingsSignInButton = Oanmelde - .title = Oanmelde -SettingsPageHeader = Ynstellingen fan Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox-account -settingsClosePreferences = - .title = Foarkarren slute -settingsFxaDisconnectAlertMessage = Binne jo wis dat jo dit apparaat fan jo Firefox-account loskeppelje wolle? -settingsFxaDisconnectDescription = As jo jo ôfmelde, moatte jo jo opnij oanmelde om wer tagong ta jo skermôfbyldingen te krijen. -settingsFxaConnectDescription = Jo kinne jo oanmelde om jo skermôfbyldingen op mear apparaten te benaderjen. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Flater by fuortsmiten fan dizze ôfbylding: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Myn ôfbyldingen: sykje nei { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Flater by werjaan fan side: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Myn ôfbyldingen trochsykje -shotIndexPageNoShotsMessage = Gjin bewarre ôfbyldingen. -shotIndexPageNoShotsInvitation = Toe mar, meitsje der in pear. -shotIndexPageLookingForShots = Sykje nei jo ôfbyldingen… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Wy kinne gjin ôfbyldingen finen dy't oan jo sykopdracht foldocht. -shotIndexPageMyShotsButton = - .title = Myn ôfbyldingen -shotIndexPageClearSearchButton = - .title = Sykopdracht wiskje -shotIndexPageConfirmShotDelete = Dizze ôfbylding fuortsmite? -shotIndexPagePreviousPage = - .title = Foarige side -shotIndexPageNextPage = - .title = Folgjende side -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Dizze ôfbylding is gjin favoryt en sil ferrinne -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Dizze skermôfdruk is in favoryt en ferrint net -shotIndexSyncedShot = - .title = Op oar apparaat makke ôfbylding -shotIndexAlertErrorFavoriteShot = Flater by bywurkjen fan favorytsteat - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Binne jo wis dat jo dizze skermôfdruk fuortsmite wolle? -shotDeleteCancel = Annulearje - .title = Annulearje -shotDeleteConfirm = Fuortsmite - .title = Fuortsmite - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Om te eksportearjen: brûk Bestân > Side bewarje as… en jo fine jo skermôfbyldingen yn de map { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metryske gegevens fan Firefox Screenshots -metricsPageTotalsQueryTitle = Totalen -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = In oersjoch fan Screenshots -metricsPageTotalsQueryDevices = Totaal registrearre apparaten -metricsPageTotalsQueryActiveShots = Aktive ôfbyldingen -metricsPageTotalsQueryExpiredShots = Ferrûn (mar werstelber) -metricsPageTotalsQueryExpiredDeletedShots = Ferrûn (en fuortsmiten) -metricsPageShotsQueryTitle = Ofbyldingen op dei -metricsPageShotsQueryDescription = Oantal ôfbyldingen dat elke dei makke is (foar de ôfrûne 30 dagen) -metricsPageShotsQueryCount = Oantal ôfbyldingen -metricsPageShotsQueryDay = Dei -metricsPageUsersQueryTitle = Brûkers op dei -metricsPageUsersQueryDescription = Oantal brûkers dat op syn minst ien ôfbylding makke hat, op dei (ôfrûne 30 dagen) -metricsPageUsersQueryCount = Oantal brûkers -metricsPageUsersQueryDay = Dei -metricsPageUserShotsQueryTitle = Oantal ôfbyldingen per brûker -metricsPageUserShotsQueryDescription = It oantal brûkers dy't ûngefear N ôfbyldingen hawwe -metricsPageUserShotsQueryCount = Oantal brûkers -metricsPageUserShotsQueryShots = Skat oantal aktive (net-ferrûne) ôfbyldingen -metricsPageRetentionQueryTitle = Retinsje op wike -metricsPageRetentionQueryDescription = Oantal dagen fan earste ôfbylding fan in brûker ta meast resinte ôfbylding, groepearre op begjinwike -metricsPageRetentionQueryUsers = Oantal brûkers -metricsPageRetentionQueryDays = Dagen fan earste ôfbylding fan in brûker ôf ta meast resinte ôfbylding -metricsPageRetentionQueryFirstWeek = Wike wêryn de brûker foar it earst in ôfbylding makke hat -metricsPageTotalRetentionQueryTitle = Totale retinsje -metricsPageTotalRetentionQueryDescription = Lingte fan tiid dat brûkers ôfbyldingen makke hawwe, groepearre op wike -metricsPageTotalRetentionQueryUsers = Oantal brûkers -metricsPageTotalRetentionQueryDays = Dagen dat de brûker ôfbylding makke hat -metricsPageVersionQueryTitle = Add-onferzje -metricsPageVersionQueryDescription = De ferzje fan de wylst oanmelding brûkte add-on, yn de ôfrûne 14 dagen -metricsPageVersionQueryUsers = Oantal oanmelde brûkers -metricsPageVersionQueryVersion = Add-onferzje -metricsPageVersionQueryLastSeen = Dei -metricsPageHeader = Metryske gegevens -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generearre: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (databasetiid: { $time }ms) diff --git a/locales/ga-IE/server.ftl b/locales/ga-IE/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/ga-IE/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/gd/server.ftl b/locales/gd/server.ftl deleted file mode 100644 index 57a774c546..0000000000 --- a/locales/gd/server.ftl +++ /dev/null @@ -1,405 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Na dealbhan agam -gHomeLink = Dhachaigh -gNoShots = - .alt = Cha deach glacadh a lorg -gScreenshotsDescription = Glacaidhean-sgrìn gun duilgheadas sam bith. Tog, sàbhail is co-roinn iad gun Firefox fhàgail idir. - -## Header - -buttonSettings = - .title = Roghainnean -buttonSignIn = - .title = Clàraich a-steach -screenshotsLogo = - .title = Dachaidh nan glacadh-sgrìn -bannerSignIn = Clàraich leinn no clàraich a-steach a dh’fhaighinn greim air glacaidhean-sgrìn air feadh nan uidheaman agad is sàbhail an fheadhainn chudromach gu buan. -bannerUpsell = { gScreenshotsDescription } Faigh Firefox an-dràsta -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Dè tha ùr ann an gleus nan glacaidhean-sgrìn aig Firefox? -onboardingPromoMessage = Clàraich a-steach le cunntas Firefox is bidh cothrom agam air barrachd ghleusan: -onboardingPromoMessageListItem1 = Faigh cothrom air an leabhar-lann agad air feadh nan uidheaman agad -onboardingPromoMessageListItem2 = Cum na glacaidhean as fhearr leat gu buan -onboardingPromoDismissButton = Leig seachad - .title = Leig seachad -onboardingPromoSigninButton = Clàraich a-steach - .title = Clàraich a-steach - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Na teirmichean -footerLinkPrivacy = Aithris na prìobhaideachd -footerReportShot = Dèan aithris air a’ ghlacadh - .title = Dèan aithris air an’ ghlacadh is e ’na mhì-ghnàthachaidh, spama no air adhbhar eile -footerLinkFaqs = CÀBHA -footerLinkDMCA = Dèan aithris air briseadh IP -footerLinkDiscourse = Dè do bheachd? -footerLinkRemoveAllData = Thoir air falbh an dàta air fad - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = A’ cruthachadh { $title } -creatingPageTitleDefault = na duilleige -creatingPageWaitMessage = A’ sàbhaladh a’ ghlacaidh... - -## Home page - -homePageDescription = - .content = Glacaidhean-sgrìn furasta am broinn a’ bhrabhsair fhèin. Tog, sàbhail is co-roinn glacaidhean-sgrìn ’s tu a’ siubhal an lìn le Firefox. -homePageButtonMyShots = Tadhail air na glacaidhean agam -homePageTeaser = A’ tighinn a dh’aithghearr... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Luchdadh a-nuas an-asgaidh -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Mar a dh’obraicheas glacaidhean-sgrìn Firefox -homePageGetStartedTitle = Toiseach tòiseachaidh -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescription = Thoir sùil airson ìomhaigheag ùr nan glacaidhean-sgrìn air bàr nan inneal agad. Tagh e ’s nochdaidh clàr-taice nan glacaidhean-sgrìn aig barr uinneag a’ bhrabhsair agad. -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Tagh ìomhaigheag nan glacaidhean-sgrìn ann an clàr-taice gnìomhan na duilleige ann am bàr an t-seòlaidh is nochdaidh clàr-taice nan glacaidhean-sgrìn aig barr uinneag a’ bhrabhsair agad. -homePageCaptureRegion = Glac raon -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Dèan briogadh is slaodadh airson an raon a tha ri ghlacadh a thaghadh. No fan os a chionn is dèan briogadh agus taghaidh an gleus againn an raon dhut. Dìreach na bha a dhìth ort? Tagh “Sàbhail” airson cothrom fhaighinn air air loidhne no an t-saighead sìos airson a luchdadh a-nuas dhan choimpiutair agad. -homePageCapturePage = Glac duilleag -homePageCapturePageDescription = Cleachd na putanan air an taobh deas gu h-àrd airson duilleag shlàn a ghlacadh. Glacaidh am putan “Sàbhail na tha ri fhaicinn” gach rud a chì thu gun a bhith a’ sgroladh agus glacaidh “Sàbhail an duilleag shlàn” gach rud air an duilleag. -homePageSaveShare = Sàbhail is co-roinn -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageShaveShareFavoriteDescription = Tog glacadh agus sàbhail e ann an leabhar-lann nan glacaidhean-sgrìn air loidhne agad. Cuiridh Firefox lethbhreac dhen cheangal air an stòr-bhòrd agad airson ’s gum bi e furasta a cho-roinneadh. Falbhaidh an ùine air glacaidhean-sgrìn san leabhar-lann gu fèin-obrachail an dèidh cola-deug ach is urrainn dhut an sguabadh às uair sam bith no an cumail nas fhaide na sin. -homePageSignInTitle = Thoir leat na glacaidhean-sgrìn agad -homePageSignInDescription = Clàraich a-steach gu gleus nan glacaidhean-sgrìn leis a’ chunntas Firefox a dh’fhaighinn greim air na glacaidhean-sgrìn agad àite sam bith a chleachdas tu Firefox. Agus is urrainn dhut an fheadhainn chudromach a shàbhaladh gu buan. -homePageLegalLink = Nòtaichean laghail -homePagePrivacyLink = Prìobhaideachd -homePageTermsLink = Na teirmichean -homePageCookiesLink = Briosgaidean - -## Leave Screenshots page - -leavePageRemoveAllData = Thoir air falbh an dàta air fad -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Feumaidh gleus nan glacaidhean-sgrìn aig Firefox a bhith stàlaichte agad no feumaidh tu a bhith clàraichte a-staigh sa chunntas Firefox agad mus urrainn dhut an cunntas agad a sguabadh às -leavePageErrorGeneric = Thachair mearachd -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Sguabaidh seo an dàta air fad agad ann an gleus glacaidhean-sgrìn Firefox agad gu buan. -leavePageButtonProceed = Lean air adhart -leavePageButtonCancel = Sguir dheth -leavePageDeleted = Chaidh na glacaidhean-sgrìn air fad agad a sguabadh às! - -## Not Found page - -notFoundPageTitle = Cha deach an duilleag a lorg -notFoundPageIntro = Oich. -notFoundPageDescription = Cha deach an duilleag a lorg. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Glacadh-sgrìn: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Mearachd a’ sàbhaladh a’ chinn-là -shotPageAlertErrorDeletingShot = Mearachd a’ sguabadh às a’ ghlacaidh -shotPageAlertErrorUpdatingTitle = Mearachd a’ sàbhaladh an tiotail -shotPageConfirmDelete = A bheil thu cinnteach gu bheil thu airson an glacadh seo a sguabadh às gu buan? -shotPageShareButton = - .title = Co-roinn -shotPageCopyButton = - .title = Cuir lethbhreac dhen dealbh air an stòr-bhòrd -shotPageCopyActionLabel = Dèan lethbhreac -shotPageCopied = Lethbhreac air a dhèanamh -shotPageShareFacebook = - .title = Co-roinn air Facebook -shotPageShareTwitter = - .title = Co-roinn air Twitter -shotPageSharePinterest = - .title = Co-roinn air Pinterest -shotPageShareEmail = - .title = Co-roinn an ceangal air post-d -shotPageShareLink = Faigh ceangal ris a’ ghlacadh seo as urrainn dhut co-roinneadh: -shotPagePrivacyMessage = Chì duine sam bith aig a bheil an ceangal an glacadh seo. -shotPageCopyImageText = - .label = Dèan lethbhreac de theacsa an deilbh -shotPageConfirmDeletion = A bheil thu cinnteach gu bheil thu airson an glacadh seo a sguabadh às gu buan? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Mur an dèan thu dad, thèid an glacadh seo a sguabadh às gu buan . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = aisig gu ruige { $date } -shotPageExpiredMessage = Dh’fhalbh an ùine air a’ ghlacadh seo. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Seo an duilleag air an deach a thogail ann: -shotPageDeleteButton = - .title = Sguab an glacadh seo às -shotPageDownloadShot = - .title = Luchdaich a-nuas -shotPageEditButton = - .title = Deasaich an dealbh seo -shotPagefavoriteButton = - .title = Dèan annsachd dhen ghlacadh seo -shotPageBackToHomeButton = - .title = Duilleag-dhachaigh -shotPageAllShotsButton = - .title = A h-uile glacadh -shotPageScreenshotsDescription = Glacaidhean-sgrìn gun duilgheadas sam bith. Tog, sàbhail is co-roinn iad gun Firefox fhàgail idir. -shotPageDMCAMessage = Chan eil an glacadh seo ri fhaighinn tuilleadh air sgàth tagradh an aghaidh briseadh IP a rinn cuideigin. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Cuir post-d gu { $dmca } airson barrachd fiosrachaidh. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ma thèid iomadh tagradh a thogail an aghaidh nan glacaidhean agad, dh’fhaoidte gun doir sinn air falbh do chothrom air gleus glacaidhean-sgrìn Firefox. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Gabh a-staigh URL a’ ghlacaidh sa phost-d agad: { $url } -shotPageKeepFor = Dè cho fad ’s a chumas sinn an glacadh seo dhut? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Tagh àm -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Gu buan ∞ -shotPageKeepTenMinutes = 10 mionaidean -shotPageKeepOneHour = Uair a thìde -shotPageKeepOneDay = Latha -shotPageKeepOneWeek = Seachdain -shotPageKeepTwoWeeks = 2 sheachdain -shotPageKeepOneMonth = Mìos -shotPageSaveExpiration = sàbhail -shotPageCancelExpiration = sguir dheth -shotPageDoesNotExpire = chan fhalbh an ùine air -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = falbhaidh an ùine air -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = dh’fhalbh an ùine air -timeDiffJustNow = an-dràsta fhèin -timeDiffMinutesAgo = - { $number -> - [one] { $number } mhionaid air ais - [two] { $number } mhionaid air ais - [few] { $number } mionaidean air ais - *[other] { $number } mionaid air ais - } -timeDiffHoursAgo = - { $number -> - [one] { $number } uair a thìde ais ais - [two] { $number } uair a thìde ais ais - [few] { $number } uairean a thìde ais ais - *[other] { $number } uair a thìde ais ais - } -timeDiffDaysAgo = - { $number -> - [one] { $number } latha air ais - [two] { $number } latha air ais - [few] { $number } làithean air ais - *[other] { $number } latha air ais - } -timeDiffFutureSeconds = ann an diog no dhà -timeDiffFutureMinutes = - { $number -> - [one] ann an { $number } mhionaid - [two] ann an { $number } mhionaid - [few] ann an { $number } mionaidean - *[other] ann an { $number } mionaid - } -timeDiffFutureHours = - { $number -> - [one] ann an { $number } uair a thìde - [two] ann an { $number } uair a thìde - [few] ann an { $number } uairean a thìde - *[other] ann an { $number } uair a thìde - } -timeDiffFutureDays = - { $number -> - [one] ann an { $number } latha - [two] ann an { $number } latha - [few] ann an { $number } làithean - *[other] ann an { $number } latha - } -errorThirdPartyCookiesEnabled = Ma thog thusa an glacadh seo ’s mur urrainn dhut a sguabadh às, dh’fhaoidte gum bi agad ri briosgaidean threas-phàrtaidhean a chur an comas gu sealach ann an roghainnean a’ bhrabhsair agad. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = An aire! -promoMessage = Leis na h-innealan deasachaidh ùra, ’s urrainn dhut na dealbhan a bhearradh, a chomharradh no fiù teacsa a chur riutha. -promoLink = Feuch e -promoCloseButton = - .title = Dùin an teachdaireachd - -## Annotations - -annotationPenButton = - .title = Peann -annotationHighlighterButton = - .title = Soillsichear -annotationUndoButton = - .title = Neo-dhèan -annotationRedoButton = - .title = Ath-dhèan -annotationTextButton = - .title = Cuir teacsa ris -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Falamhaich -annotationCropButton = - .title = Bearr -annotationSaveEditButton = Sàbhail - .title = Sàbhail an deasachadh -annotationCancelEditButton = Sguir dheth - .title = Sguir dhen deasachadh -annotationCropConfirmButton = Dearbh - .title = Dearbh an taghadh -annotationCropCancelButton = Sguir dheth - .title = Sguir dhen taghadh -annotationColorWhite = - .title = Geal -annotationColorBlack = - .title = Dubh -annotationColorRed = - .title = Dearg -annotationColorGreen = - .title = Uaine -annotationColorBlue = - .title = Gorm -annotationColorYellow = - .title = Buidhe -annotationColorPurple = - .title = Purpaidh -annotationColorSeaGreen = - .title = Glas -annotationColorGrey = - .title = Liath -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Meud an teacsa -# Values shown in text size selection dropdown -textSizeSmall = Beag -textSizeMedium = Meadhanach -textSizeLarge = Mòr -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Dearbh - .title = Dearbh -textToolCancelButton = Sguir dheth - .title = Sguir dheth -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Boí rí amrae for Laignib - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Chaidh rudeigin cearr -copyImageErrorMessage = Chan urrainn dhuinn an glacadh a chur air an stòr-bhòrd. - -## Settings Page - -settingsDisconnectButton = Dì-cheangail - .title = Dì-cheangail -settingsGuestAccountMessage = Cunntas aoigh -settingsSignInInvite = Clàraich a-steach airson sioncronachadh air feadh uidheaman a dhèanamh -settingsSignInButton = Clàraich a-steach - .title = Clàraich a-steach -SettingsPageHeader = Roghainnean ghlacaidhean-sgrìn Firefox -settingsDescription = ’S urrainn dhut clàradh a-steach gu cunntasan Firefox airson na glacaidhean-sgrìn agad a shioncronachadh air feadh nan uidheaman agad is cothrom fhaighinn orra gu prìobhaideach. -settingsFirefoxAccountSubHeader = Cunntas Firefox -settingsClosePreferences = - .title = Dùin na roghainnean -settingsFxaDisconnectAlertMessage = A bheil thu cinnteach gu bheil thu airson an t-uidheam seo a dhì-cheangal on chunntas Firefox agad? -settingsFxaDisconnectDescription = Ma chlàraicheas tu a-mach, bidh agad ri clàradh a-steach a-rithist mus fhaigh thu cothrom air na glacaidhean-sgrìn agad. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Mearachd a’ sguabadh às a’ ghlacaidh: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Na glacaidhean agam: lorg airson { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Mearachd a’ reandaradh na duilleige: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Lorg sna glacaidhean agam -shotIndexPageNoShotsMessage = Cha deach glacadh sam bith a shàbhaladh. -shotIndexPageNoShotsInvitation = Siuthad, tog feadhainn. -shotIndexPageLookingForShots = A’ lorg nan glacaidhean agad... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Chan urrainn dhuinn glacadh sam bith a lorg a fhreagras ris na dh’iarr thu. -shotIndexPageMyShotsButton = - .title = Na glacaidhean agam -shotIndexPageClearSearchButton = - .title = Falamhaich an lorg -shotIndexPageConfirmShotDelete = A bheil thu airson an glacadh seo a sguabadh às? -shotIndexPagePreviousPage = - .title = An duilleag roimhe -shotIndexPageNextPage = - .title = An ath-dhuilleag -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Chan e annsachd a tha sa ghlacadh seo agus falbhaidh an ùine air -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Tha an glacadh seo ’na annsachd agad agus chan fhalbh an ùine air -shotIndexSyncedShot = - .title = Chaidh a ghlacadh air uidheam eile -shotIndexAlertErrorFavoriteShot = Cha b’ urrainn dhuinn annsachd a dhèanamh dhen ghlacadh - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = A bheil thu cinnteach gu bheil thu airson an glacadh seo a sguabadh às? -shotDeleteCancel = Sguir dheth - .title = Sguir dheth -shotDeleteConfirm = Sguab às - .title = Sguab às - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Stats glacaidhean-sgrìn Firefox -metricsPageTotalsQueryTitle = Iomlain -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Foir-shealladh nan glacaidhean-sgrìn -metricsPageTotalsQueryDevices = Uidheaman air an clàradh gu h-iomlan -metricsPageTotalsQueryActiveShots = Glacaidhean gnìomhach -metricsPageTotalsQueryExpiredShots = Na dh’fhalbh an ùine air (ach gabhaidh an aiseag) -metricsPageTotalsQueryExpiredDeletedShots = Na dh’fhalbh an ùine air (is a chaidh a sguabadh às) -metricsPageShotsQueryTitle = Glacaidhean a-rèir latha -metricsPageShotsQueryDescription = Co mheud glacadh a thogadh gach latha (rè nan 30 latha seo chaidh) -metricsPageShotsQueryCount = Co mheud glacadh -metricsPageShotsQueryDay = Latha -metricsPageUsersQueryTitle = Cleachdaichean a-rèir latha -metricsPageUsersQueryDescription = Co mheud cleachdaiche a chruthaich co-dhiù aon ghlacadh, a-rèir latha (na 30 latha seo chaidh) -metricsPageUsersQueryCount = Co mheud cleachdaiche -metricsPageUsersQueryDay = Latha -metricsPageUserShotsQueryTitle = Co mheud glacadh an cleachdaiche -metricsPageUserShotsQueryDescription = Co mheud cleachdaiche aig a bheil mu N glacadh uile gu lèir -metricsPageUserShotsQueryCount = Co mheud cleachdaiche -metricsPageUserShotsQueryShots = Co mheud glacadh gnìomhach (nach fhalbh an ùine orra) mu thuaiream -metricsPageRetentionQueryTitle = Glèidheadh a-rèir seachdain -metricsPageRetentionQueryDescription = Na làithean eadar ciad ghlacadh cleachdaidh is am fear as ùire, ann am buidhnean a-rèir seachdain tòiseachaidh -metricsPageRetentionQueryUsers = Co mheud cleachdaiche -metricsPageRetentionQueryDays = Làithean eadar ciad ghlacadh aig cleachdaiche ’s am fear as ùire -metricsPageRetentionQueryFirstWeek = An t-seachdain a rinn cleachdaiche a’ chiad ghlacadh aca -metricsPageTotalRetentionQueryTitle = Glèidheadh uile gu lèir -metricsPageTotalRetentionQueryDescription = Dè cho fada ’s a tha cleachdaichean air glacaidhean a chruthachadh, ann am buidhnean a-rèir seachdain -metricsPageTotalRetentionQueryUsers = Co mheud cleachdaiche -metricsPageTotalRetentionQueryDays = Co mheud latha a tha an cleachdaiche air a bhith a’ cruthachadh glacaidhean -metricsPageVersionQueryTitle = Tionndadh an tuilleadain -metricsPageVersionQueryDescription = Tionndadh an tuilleadain air an do chlàradh a-steach, sa chola-deug seo chaidh -metricsPageVersionQueryUsers = Co mheud cleachdaiche a tha a’ clàradh a-steach -metricsPageVersionQueryVersion = Tionndadh an tuilleadain -metricsPageVersionQueryLastSeen = Latha -metricsPageHeader = Stats -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Air a chruthachadh: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (àm an stòir-dhàta: { $time }ms) diff --git a/locales/gl/server.ftl b/locales/gl/server.ftl deleted file mode 100644 index cda940f5b2..0000000000 --- a/locales/gl/server.ftl +++ /dev/null @@ -1,257 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = As miñas capturas -gHomeLink = Inicio -gNoShots = - .alt = Non se atoparon capturas -gScreenshotsDescription = Capturas de pantalla sinxelas. Faga, garde e comparta capturas de pantalla sen saír do Firefox. - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Termos -footerLinkPrivacy = Política de privacidade -footerLinkFaqs = FAQ -footerLinkDiscourse = Dar opinión -footerLinkRemoveAllData = Retirar todos os datos - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creando { $title } -creatingPageTitleDefault = páxina -creatingPageWaitMessage = Gardando a súa captura… - -## Home page - -homePageDescription = - .content = Capturas de pantalla intuitivas directamente desde o navegador. Capture, garde e comparta capturas de pantalla mentres navega pola web co Firefox. -homePageButtonMyShots = Ir as miñas capturas -homePageTeaser = Proximamente… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Descarga de balde -homePageGetStarted = Comezar -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Como funciona Firefox Screenshots -homePageGetStartedTitle = Comezar -homePageCaptureRegion = Capturar unha rexión -homePageCapturePage = Capturar unha páxina -homePageSaveShare = Gardar e compartir -homePageLegalLink = Legal -homePagePrivacyLink = Privacidade -homePageTermsLink = Termos -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Retirar todos os datos -leavePageErrorGeneric = Produciuse un erro -leavePageButtonProceed = Continuar -leavePageButtonCancel = Cancelar -leavePageDeleted = Borráronse todas as súas capturas de pantalla! - -## Not Found page - -notFoundPageTitle = Non se atopou a páxina -notFoundPageIntro = Vaites. -notFoundPageDescription = Non se atopou a páxina. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Captura de pantalla: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Produciuse un erro ao gardar a caducidade -shotPageAlertErrorDeletingShot = Produciuse un erro ao eliminar a captura -shotPageAlertErrorUpdatingTitle = Produciuse un erro ao gardar o título -shotPageConfirmDelete = Confirma que quere eliminar esta captura de forma permanente? -shotPageShareButton = - .title = Compartir -shotPageCopy = Copiar -shotPageCopied = Copiouse -shotPageShareFacebook = - .title = Compartir en Facebook -shotPageShareTwitter = - .title = Compartir en Twitter -shotPageSharePinterest = - .title = Compartir en Pinterest -shotPageShareEmail = - .title = Compartir a ligazón por correo electrónico -shotPageShareLink = Obter unha ligazón para compartir esta captura: -shotPagePrivacyMessage = Calquera que teña a ligazón pode ver a captura. -shotPageCopyImageText = - .label = Copiar o texto da imaxe -shotPageConfirmDeletion = Confirma que quere eliminar esta captura de forma permanente? -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaurar ata o { $date } -shotPageExpiredMessage = Esta captura caducou. -shotPageDeleteButton = - .title = Eliminar esta captura -shotPageDownloadShot = - .title = Descargar -shotPageEditButton = - .title = Editar esta imaxe -shotPageDownload = Descargar -shotPageUpsellFirefox = Obteña Firefox agora -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Seleccione unha duración -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinidamente ∞ -shotPageKeepTenMinutes = 10 minutos -shotPageKeepOneHour = 1 hora -shotPageKeepOneDay = 1 día -shotPageKeepOneWeek = 1 semana -shotPageKeepTwoWeeks = 2 semanas -shotPageKeepOneMonth = 1 mes -shotPageSaveExpiration = gardar -shotPageCancelExpiration = cancelar -shotPageDoesNotExpire = non caduca -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = caduca en -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = caducou fai -timeDiffJustNow = agora mesmo -timeDiffMinutesAgo = - { $number -> - [one] hai 1 minuto - *[other] hai { $number } minutos - } -timeDiffHoursAgo = - { $number -> - [one] hai 1 hora - *[other] hai { $number } horas - } -timeDiffDaysAgo = - { $number -> - [one] onte - *[other] hai { $number } días - } -timeDiffFutureSeconds = nuns segundos -timeDiffFutureMinutes = - { $number -> - [one] nun minuto - *[other] en { $number } minutos - } -timeDiffFutureHours = - { $number -> - [one] nunha hora - *[other] en { $number } horas - } -timeDiffFutureDays = - { $number -> - [one] mañá - *[other] en { $number } días - } -errorThirdPartyCookiesEnabled = Se fixo esta captura e non a pode eliminar, quizais deba activar temporalmente as cookies de terceiros nas preferencias do navegador. - -## Annotations - -annotationPenButton = - .title = Lapis -annotationHighlighterButton = - .title = Marcador -annotationUndoButton = - .title = Desfacer -annotationRedoButton = - .title = Refacer -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Borrar -annotationCropButton = - .title = Recortar -annotationSaveEditButton = Gardar - .title = Gardar as modificacións -annotationCancelEditButton = Cancelar - .title = Cancelar as modificacións -annotationCropConfirmButton = Confirmar - .title = Confirmar a selección -annotationCropCancelButton = Cancelar - .title = Cancelar a selección -annotationColorWhite = - .title = Branco -annotationColorBlack = - .title = Negro -annotationColorRed = - .title = Vermello -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Azul -annotationColorYellow = - .title = Amarelo -annotationColorPurple = - .title = Púrpura -annotationColorGrey = - .title = Gris - -## Settings Page - -settingsDisconnectButton = Desconectar - .title = Desconectar -settingsGuestAccountMessage = Conta de convidado -settingsSignInInvite = Identifíquese para sincronizar os dispositivos -settingsSignInButton = Identificarse - .title = Identificarse -SettingsPageHeader = Configuración de Firefox Screenshots -settingsPageSubHeader = Sync e contas -settingsClosePreferences = - .title = Pechar preferencias - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Produciuse un erro ao eliminar a captura: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = As miñas capturas: buscar { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Produciuse un erro ao representar a páxina: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Buscar nas capturas -shotIndexPageSearchButton = - .title = Buscar -shotIndexPageNoShotsMessage = Ningunha captura gardada. -shotIndexPageNoShotsInvitation = Continúe, cree algunha. -shotIndexPageLookingForShots = Buscando nas súas capturas... -shotIndexPageClearSearchButton = - .title = Borrar busca -shotIndexPageConfirmShotDelete = Eliminar esta captura? -shotIndexPagePreviousPage = - .title = Páxina anterior -shotIndexPageNextPage = - .title = Seguinte páxina -# This symbol is used in the lower right corner of the card for a shot on the -# My Shots page to indicate that the shot does not expire. It should be a -# single character (or simply nothing if no such symbol is available for a -# language/culture). -shotIndexNoExpirationSymbol = ∞ - .title = Esta captura non caduca - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Confirma que quere eliminar esta captura? -shotDeleteCancel = Cancelar - .title = Cancelar -shotDeleteConfirm = Eliminar - .title = Eliminar - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Métricas de Firefox Screenshots -metricsPageTotalsQueryTitle = Totais -metricsPageVersionQueryTitle = Versión do complemento -metricsPageVersionQueryVersion = Versión do complemento -metricsPageVersionQueryLastSeen = Día -metricsPageHeader = Métricas diff --git a/locales/gn/server.ftl b/locales/gn/server.ftl deleted file mode 100644 index 5a23d4323d..0000000000 --- a/locales/gn/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Che japyhypy -gHomeLink = Ñepyrũ -gNoShots = - .alt = Ndojejuhúi japyhypy -gScreenshotsDescriptionServerless = Mba’erechaha momichĩmby japyhypyre. Ejapo ha emboguejy mba’erechaha japyhypyre esẽ’ỹre Firefox-gui. - -## Header - -buttonSettings = - .title = Ñemboheko -buttonSignIn = - .title = Jeike -screenshotsLogo = - .title = Screenshots kuatiarogue ñepyrũ -bannerSignIn = Emoñepyrũ tembiapo térã eñemboheraguapy ehecha hag̃ua ne ra’anga opaite mba’e’okápe ha eñongatuete umi eguerohoryvéva. -bannerUpsell = { gScreenshotsDescription } Eguereko Firefox ko'ág̃a -shutdownWarning = Umi mba’erechaha japyhypy ñongatupyre oñemboguétama vokoiete. Jasypoteĩ guive, Screenshots noñongatumo’ãvéima ñandutípe. ¿Eguerekosépa nde japypyhypyre ne arandukarendápe? Emboguejy ne mohendahápe. -shutdownPageTitle = Screenshots iñambuehína -shutdownPageDescription = Jasypoteĩ guive, Screenshots noñongatumo’ãvéima ñandutípe. ¿Eguerekosépa nde japypyhypyre ne arandukarendápe? Emboguejy ha’eñomínte térã hetaháicha. Aguyje eipuru haguére ko tembiapoite ha rombyasy pe atõivai. -shutdownPageContinue = Hi’ã oréve eipurumeme Screenshots ejapo, embokuatia ha emboguejy hag̃ua mba’erechaha japyhypyre. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = ¿Mba’e ipyahúva ejuhukuaa Firefox Screenshots-pe? -onboardingPromoMessage = Ko’ág̃a, emoñepyrũ tembiapo Screenshots-pe Firefox mba’ete ndive ha ndepya’eve hag̃ua: -onboardingPromoMessageListItem1 = Eike ne arandukarendápe opaite ne mba’e’oka guive. -onboardingPromoMessageListItem2 = Eñongatu ne ra’ãnga opa árape g̃uarã -onboardingPromoDismissButton = Mboyke - .title = Mboyke -onboardingPromoSigninButton = Emoñepyrũ tembiapo - .title = Emoñepyrũ tembiapo - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Jejapopy -footerLinkPrivacy = Mombe'u ñeñomipy -footerReportShot = Emomarandu japyhypy rehegua - .title = Emomarandu ko ta'anga imarãha, spam ha ambue apañuãi -footerLinkFaqs = Porandu py'ỹi -footerLinkDMCA = Emombe’u IP-pe oĩvaíva -footerLinkDiscourse = Ñe'ẽte ñemondo -footerLinkRemoveAllData = Emboguete opaite mba’ekuaarã - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Omoheñoihína { $title } -creatingPageTitleDefault = kuatiarogue -creatingPageWaitMessage = Oñongatuhína japyhypy... - -## Home page - -homePageDescription = - .content = Mba’erechaha japyhypy oñandúva kundaha ryepýpe. Ejapyhy, eñongatu ha emoherakuã mba’erechaha japyhypy eikundahakuévo ñandutípe eipurúvo Firefox. -homePageButtonMyShots = Eho che japyhypýpe -homePageTeaser = Namombyryvéima… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Emboguejy reiete -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Mba’éicha omba’apo Firefox Screenshots -homePageGetStartedTitle = Jeguata ñepyrũ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Embosa’y Screenshots ra’anga’i poravorã oku’éva tembipuru rendápe ha ehecháta pe poravorã kundaha rovetã yvate gotyo. -homePageCaptureRegion = Ejapyhy peteĩ tendaguasu -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Ehesakutu ha embosyryry eiporavo hag̃ua umi rejapyhyséva. Térã ehasánte hi’ári ha eikutu — Screenshots oiporavóta pe korá ndéve g̃uarã. ¿Emoneĩpa pe ehecháva? Eiporavo Ñongatu eike hag̃ua nde japyhypy ñandutiguáva térã pe votõ hu’y yvy gotyogua eñongatu hag̃ua ne mohendahápe. -homePageCapturePage = Peteĩ kuatiarogue jejapyhy -homePageCapturePageDescription = Eipuru umi votõ yvategua akatúvape oĩva ejapyhy hag̃ua kuatiarogue tuichaháicha. Pe votõ Ñongatu Jehecháva ojapyhýta pe kora ikatúva rehecha eku’e’ỹre ha Kuatiarogue Tuichaháicha Ñongatu ojapyhypáta kuatiaroguépe. -homePageDownloadCopy = Emboguejy térã embokuatia -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Ejapo mba’erechaha japyhypy iporãvéva. Screenshots omoneĩ emboguejývo nde poravopy térã embohasávo nde kuatiajokohapetevoi. -homePageLegalLink = Añetegua -homePagePrivacyLink = Ñemigua -homePageTermsLink = Jejapopy -homePageCookiesLink = Kookie - -## Leave Screenshots page - -leavePageRemoveAllData = Emboguete opaite mba’ekuaarã -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Eguerekova’erã Firefox Screenshots mohendapyre térã Firefox mba’etépe tembiapo emboguete hag̃ua mba’ete -leavePageErrorGeneric = Oiko peteĩ jejavy -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Póva omboguéta tapiaiterã opaite ne mba’ekuaarã Firefox Screenshots-gui. -leavePageButtonProceed = Ku’ejey -leavePageButtonCancel = Heja -leavePageDeleted = Opaite nde japyhypy oñemboguepáma - -## Not Found page - -notFoundPageTitle = Kuatiarogue ojejuhu’ỹva -notFoundPageIntro = Oops. -notFoundPageDescription = Kuatiarogue ojejuhu’ỹva. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Japyhypy { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Jejavy eñongatúvo arange opaha -shotPageAlertErrorDeletingShot = Jejavy emboguetévo japyhypy -shotPageAlertErrorUpdatingTitle = Jejavy eñongatukuévo teratee -shotPageConfirmDelete = ¿Emboguesetépa ko japyhypy opa árape g̃uarã? -shotPageShareButton = - .title = Moherakuã -shotPageCopyButton = - .title = Embohasa ta'anga kuatiajokohápe -shotPageCopyActionLabel = Monguatia -shotPageCopied = Monguatiapyre -shotPageShareFacebook = - .title = Emoherakuã Facebook-pe -shotPageShareTwitter = - .title = Emoherakuã Twitter-pe -shotPageSharePinterest = - .title = Emoherakuã Pinterest-pe -shotPageShareEmail = - .title = Emoherakuã juajuha ñanduti veve rupive -shotPageShareLink = Egueru juajuha emoherakuã hag̃ua ko japyhypy: -shotPagePrivacyMessage = Oimeraẽva juajuha ndive ikatukuaa ohecha ko japyhypy. -shotPageCopyImageText = - .label = Emonguatia ta’anga moñe’ẽrã -shotPageConfirmDeletion = ¿Emboguesépa ko japyhypy opa árape g̃uarã? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Nderejapóiramo mba’eve, pe japyhypy oguéta opa árape g̃uarã pe. -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = embojevy { $date } peve -shotPageExpiredMessage = Ko japyhypy ndoikovéima. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Kóva ha’e kuatiarogue oñemoheñói hague: -shotPageDeleteButton = - .title = Embogue ko japyhypy -shotPageDownloadShot = - .title = Mboguejy -shotPageEditButton = - .title = Embosako’i ko ta’anga -shotPagefavoriteButton = - .title = Emongurusu ko japyhypyre techaramovévarõ -shotPageBackToHomeButton = - .title = Kuatiarogue ñepyrũ -shotPageAllShotsButton = - .title = Opaite japyhypy -shotPageScreenshotsDescriptionServerless = Mba’erechaha momichĩmby japyhypyre. Ejapo ha emboguejy mba’erechaha japyhypyre esẽ’ỹre Firefox-gui. -shotPageDMCAMessage = Ko japyhypy ndojepurukuaái peteĩ tapicha akaguai rupi ha'eha ijára. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Eguerahauka peteĩ ñanduti veve { $dmca }-pe ejerure hag̃ua maranduve. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Umi nde japyhypy orekóramö jerurepy, ikatu ojepe'a ndehegui Firefox Screenshots-pe jeike. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Emoinge pe URL ko japyhypy pegua nde ñanduti vevépe: { $url } -shotPageKeepFor = ¿Mboy aravópa opytaveva’erã ko japyhypy? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Eiporavo aravo -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Opa’ỹva ∞ -shotPageKeepTenMinutes = 10 aravo’i -shotPageKeepOneHour = 1 aravo -shotPageKeepOneDay = 1 ára -shotPageKeepOneWeek = 1 arapokõindy -shotPageKeepTwoWeeks = 2 arapokõindy -shotPageKeepOneMonth = 1 jasy -shotPageSaveExpiration = ñongatu -shotPageCancelExpiration = heja -shotPageDoesNotExpire = ndopái gueteri -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = opáma -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = opáma -timeDiffJustNow = ko'ag̃aite -timeDiffMinutesAgo = - { $number -> - [one] ojapo 1 aravo’i - *[other] { $number } aravo'i tapykuegua - } -timeDiffHoursAgo = - { $number -> - [one] 1 aravo ojapo - *[other] { $number } aravo ojapo - } -timeDiffDaysAgo = - { $number -> - [one] kuyhe - *[other] { $number } heta ára - } -timeDiffFutureSeconds = opa’íntema -timeDiffFutureMinutes = - { $number -> - [one] 1 aravo'ípe - *[other] { $number } aravo'ípe - } -timeDiffFutureHours = - { $number -> - [one] 1 aravópe - *[other] { $number } aravópe - } -timeDiffFutureDays = - { $number -> - [one] ko'ẽrõ - *[other] { $number } oĩyama - } -errorThirdPartyCookiesEnabled = Ojejap ko japyhypy ha ndaikatúi oñembogue, ikatu hína oĩ tekotevẽ ijurujávo sapy’aitemi kookie mbohapyháva kundaha oguerohoryvévape. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = ¡Ehai kuatiápe! -promoMessage = Umi tembipuru ñembosako’i hekopyahúva ikatu omombyky, ohechauka ha avei ombojuapy moñe’ẽrã nemba’ére. -promoLink = Eipurúke -promoCloseButton = - .title = Emboty momarandu - -## Annotations - -annotationPenButton = - .title = Haiha -annotationHighlighterButton = - .title = Hechaukaveha -annotationUndoButton = - .title = Mboguevi -annotationRedoButton = - .title = Motenonde -annotationTextButton = - .title = Embojuapy moñe’ẽrã -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Mopotĩ -annotationCropButton = - .title = Ñekytĩ -annotationSaveEditButton = Ñongatu - .title = Ñongatu -annotationCancelEditButton = Heja - .title = Heja -annotationCropConfirmButton = Moneĩ - .title = Moneĩ -annotationCropCancelButton = Heja - .title = Heja -annotationColorWhite = - .title = Morotĩ -annotationColorBlack = - .title = Hũ -annotationColorRed = - .title = Pytã -annotationColorGreen = - .title = Hovyũ -annotationColorBlue = - .title = Hovy -annotationColorYellow = - .title = Sa’yju -annotationColorPurple = - .title = Pytaũ -annotationColorSeaGreen = - .title = Hovyũ para -annotationColorGrey = - .title = Hũngy -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Moñe’ẽrã tuichakue -# Values shown in text size selection dropdown -textSizeSmall = Michĩva -textSizeMedium = Mbyteguáva -textSizeLarge = Tuicháva -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Moneĩ - .title = Moneĩ -textToolCancelButton = Heja - .title = Heja -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Mba'éichapa - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Oĩ osẽvaíva -copyImageErrorMessage = Ndaikatúi embohasa nde japyhykue kuatiajokohápe. - -## Settings Page - -settingsDisconnectButton = Ñesẽte - .title = Ñesẽte -settingsGuestAccountMessage = Pepirũva mba’ete -settingsSignInButton = Eñepyrũ tembiapo - .title = Eñepyrũ tembiapo -SettingsPageHeader = Firefox Screenshots ñemboheko -settingsFirefoxAccountSubHeader = Firefox Account -settingsClosePreferences = - .title = Jeguerohoryvéva moheñói -settingsFxaDisconnectAlertMessage = ¿Eipe’asépa ko mba’e’oka ne mba’ete Firefox peguágui? -settingsFxaDisconnectDescription = Embotýramo tembiapo, emoñepyrũjeyva’erã eikekuaa jey hag̃ua ne mba’erechaha jejapyhýpe. -settingsFxaConnectDescription = Ikatu emoñepyrũ tembiapo eikekuaa hag̃ua nde mba’erechaha japyhypyrépe mba’e’oka rupive. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Jejavy oguekuévo japyhypy: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Che japyhypy: eheka { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Jejavy emoha’angávo kuatiarogue: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Ahekáta che japyhypy -shotIndexPageNoShotsMessage = Ndaipóri japyhypy ñongatupyre. -shotIndexPageNoShotsInvitation = Eku’éna, emoheñóina peteĩ jepe. -shotIndexPageLookingForShots = Ohekahína nde japyhypy… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Ndaikatúi rojuhu japyhypy ojojoguáva rehekáva ndive. -shotIndexPageMyShotsButton = - .title = Che japyhypy -shotIndexPageClearSearchButton = - .title = Embogue jehekakue -shotIndexPageConfirmShotDelete = Embogue ko japyhypy -shotIndexPagePreviousPage = - .title = Kuatiarogue mboyveguáva -shotIndexPageNextPage = - .title = Kuatiarogue upeiguáva -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Kóva ndaha'éi japyhypy eguerohoryvéva ha oguerekóta hi'arange paha -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Kóva japyhypyre techaramovéva ha oñembyai'ỹva -shotIndexSyncedShot = - .title = Jejapyhy ojejapopyre ambue mba’e’okápe -shotIndexAlertErrorFavoriteShot = Ojavy embohekopyahúvo jejapyhy erohoryvéva reko - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = ¿Emboguesépa ko japyhypy? -shotDeleteCancel = Heja - .title = Heja -shotDeleteConfirm = Mbogue - .title = Mbogue - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Eguerahauka hag̃ua: eipuru Marandurenda> Eñongatu kuatiarogue pyahu... ha ejujhúta nde mba’erechaha japyhypyre { $folder } ñongatuhápe - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots ra’ãha -metricsPageTotalsQueryTitle = Opavavete -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Screenshots ohecháva tuichaháicha -metricsPageTotalsQueryDevices = Mba'e'oka heraguapypaitéma -metricsPageTotalsQueryActiveShots = Japyhypy hendýva -metricsPageTotalsQueryExpiredShots = Opámava (jeguerukuaa jeýva) -metricsPageTotalsQueryExpiredDeletedShots = Opámava (ha oguémava) -metricsPageShotsQueryTitle = Japyhypy ára ha aragua -metricsPageShotsQueryDescription = Japyhypy papapy heñóiva ko'ẽreíre (30 ára pukukue) -metricsPageShotsQueryCount = Japyhypy papapy -metricsPageShotsQueryDay = Ára -metricsPageUsersQueryTitle = Puruhára ára ha aragua -metricsPageUsersQueryDescription = Puruhára papapy omoheñóiva japyhypy ára ha ára peteĩ jepe (30 ára pukukue) -metricsPageUsersQueryCount = Puruhára papapy -metricsPageUsersQueryDay = Ára -metricsPageUserShotsQueryTitle = Puruhára japyhypy papapy -metricsPageUserShotsQueryDescription = Puruhára papapy oguerekóva N japyhypy guenohẽpyre -metricsPageUserShotsQueryCount = Puruhára papapy -metricsPageUserShotsQueryShots = Papapy ag̃uíva japyhypy hendývagui (oikóva gueteri) -metricsPageRetentionQueryTitle = Arapokõindýpe jejoko -metricsPageRetentionQueryDescription = Ára papapy pe puruhára japyhypy peteĩha pe ramovéva rõguáicha, oñembyatýva arapokõindy oñepyrũvo. -metricsPageRetentionQueryUsers = Puruhára papapy -metricsPageRetentionQueryDays = Ohasa ára pe puruhára japyhypy peteĩha pe ramovéva rõguáicha. -metricsPageRetentionQueryFirstWeek = Arapokõindy puruhára omoheñói hague japyhypy peteĩha -metricsPageTotalRetentionQueryTitle = Jejokopaite -metricsPageTotalRetentionQueryDescription = Aravo puruhára oipurúva ojapyhypy hag̃ua, oñemboatýva arapokõindýpe -metricsPageTotalRetentionQueryUsers = Puruhára papapy -metricsPageTotalRetentionQueryDays = Arakuéra puruhára omoheñói hague japyhypy -metricsPageVersionQueryTitle = Moimbaha peteĩchagua -metricsPageVersionQueryDescription = Moimbaha peteĩchagua eipurúva eikekuévo, 14 ára ahasaramóvape -metricsPageVersionQueryUsers = Puruhára papapy moingepyre -metricsPageVersionQueryVersion = Moimbaha peteĩchagua -metricsPageVersionQueryLastSeen = Ára -metricsPageHeader = Ta’ãha -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Oikóva pe: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (aravo mba’ekuarã renda: { $time }ms) diff --git a/locales/gu-IN/server.ftl b/locales/gu-IN/server.ftl deleted file mode 100644 index 1ece37e76d..0000000000 --- a/locales/gu-IN/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = મારા શોટ્સ -gHomeLink = મુખ્ય પૃષ્ઠ -gNoShots = - .alt = કોઈ શૉટ્સ મળ્યાં નથી -gScreenshotsDescriptionServerless = સ્ક્રીનશોટ ને સરળ બનાવ્યુ છે. Firefox છોડ્યાં વિના સ્ક્રીનશોટને કૅપ્ચર અને ડાઉનલોડ કરો. - -## Header - -buttonSettings = - .title = સેટિંગ્સ -buttonSignIn = - .title = સાઇન ઇન કરો -screenshotsLogo = - .title = સ્ક્રીનશૉટ્સ હોમ -bannerSignIn = તમારા ઉપકરણને તમારા ઉપકરણ પર ઍક્સેસ કરવા અને તમારા મનપસંદ્સને હંમેશાં સાચવવા માટેસાઇન ઇન કરો અથવા સાઇન અપ કરો. -bannerUpsell = { gScreenshotsDescription } હવે Firefox મેળવો -shutdownWarning = સાચવેલા સ્ક્રીનશૉટ્સ ટૂંક સમયમાં સમાપ્ત થાય છે. જૂનથી શરૂ થતાં, સ્ક્રીનશોટ્સ હવે ઑનલાઇન સ્ટોરેજ ઓફર કરશે નહીં. તમારી લાઇબ્રેરીમાંથી શોટ રાખવા માંગો છો?તેમને તમારા કમ્પ્યુટર પર ડાઉનલોડ કરો. -shutdownPageTitle = સ્ક્રીનશોટ બદલાતી રહે છે -shutdownPageDescription = જૂનથી શરૂ થતાં, સ્ક્રીનશોટ્સ હવે ઑનલાઇન સ્ટોરેજ ઓફર કરશે નહીં. તમારી લાઇબ્રેરીમાંથી શોટ રાખવા માંગો છો? વ્યક્તિગત રૂપે શોટ અથવા બેચમાં ડાઉનલોડ કરો. આ સુવિધાનો ઉપયોગ કરવા બદલ આભાર, અને કોઈપણ અસુવિધા બદલ અમને દિલગીર છે. -shutdownPageContinue = અમે આશા રાખીએ છીએ કે તમે શૉટ્સને કેપ્ચર, કૉપિ અને ડાઉનલોડ કરવા માટે સ્ક્રીનશોટનો ઉપયોગ કરવાનું ચાલુ રાખશો. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefox Screenshots સાથે નવું શું છે? -onboardingPromoMessage = હવે, Firefox એકાઉન્ટ સાથે Screenshots પર સાઇન ઇન કરો અને વધુ કરો: -onboardingPromoMessageListItem1 = તમારા બધા ઉપકરણો પર તમારી લાઇબ્રેરીને ઍક્સેસ કરો -onboardingPromoMessageListItem2 = તમારા મનપસંદ શોટ્સ કાયમ માટે સંગ્રહિત કરો -onboardingPromoDismissButton = રદ કરો - .title = રદ કરો -onboardingPromoSigninButton = સાઇન ઇન કરો - .title = સાઇન ઇન કરો - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = શરતો -footerLinkPrivacy = ગોપનીયતા સૂચના -footerReportShot = સ્ક્રીનશૉટ્ અહેવાલ - .title = દુરુપયોગ, સ્પામ અથવા અન્ય સમસ્યાઓ માટે આ સ્ક્રીનશૉટ્ની જાણ કરો -footerLinkFaqs = વારંવાર પૂછવામાં આવતા પ્રશ્ન -footerLinkDMCA = IP ઉલ્લંઘનની જાણ કરો -footerLinkDiscourse = અભીપ્રાય આપો -footerLinkRemoveAllData = તમામ ડેટાને દૂર કરો - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = બનાવી રહ્યા છે { $title } -creatingPageTitleDefault = પાનું -creatingPageWaitMessage = શોટ સચવાય છે... - -## Home page - -homePageDescription = - .content = બ્રાઉઝરમાં શેકવામાં આવેલ સાહજિક સ્ક્રીનશૉટ્સ. પકડો, તમે Firefox નો ઉપયોગ કરીને વેબ બ્રાઉઝ કરો ત્યારે સ્ક્રીનશૉટ્સને સાચવો અને વહેંચો. -homePageButtonMyShots = મારા શોટ્સ પર જાઓ -homePageTeaser = ટૂક સમયમાં આવી રહ્યું છે… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = મફત ડાઉનલોડ -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots કેવી રીતે કામ કરે છે -homePageGetStartedTitle = શરૂ કરો -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = સરનામાં બારમાં પૃષ્ઠ ક્રિયાઓ મેનૂમાંથી સ્ક્રીનશોટ્સ ચિહ્ન પસંદ કરો, અને સ્ક્રીનશોટ મેનૂ તમારા બ્રાઉઝર વિંડોની ટોચ પર દેખાશે. -homePageCaptureRegion = પ્રદેશને પકડો -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = તમે પકડવા માંગો છો તે ક્ષેત્રને પસંદ કરવા માટે ક્લિક કરો અને ખેંચો. અથવા માત્ર હૉવર કરો અને ક્લિક કરો - સ્ક્રીનશોટ તમારા માટે વિસ્તાર પસંદ કરશે. તમે શું જુઓ છો? તમારા કમ્પ્યુટર પર તેને ડાઉનલોડ કરવા માટે તમારા સ્ક્રીનશૉટ અથવા નીચે તીર બટનને ઍક્સેસ કરવા માટે સાચવો પસંદ કરો. -homePageCapturePage = પૃષ્ઠને પકડો -homePageCapturePageDescription = સંપૂર્ણ પૃષ્ઠોને પકડવા માટે ઉપલા જમણા બટન્સનો ઉપયોગ કરો. સાચવો દૃશ્યમાન બટન તે વિસ્તારને પકડવા કરશે જે તમે સ્ક્રોલિંગ વગર જોઈ શકો છો, અને પૂર્ણ પેજમાં સાચવો પૃષ્ઠ પર બધું પકડશે. -homePageDownloadCopy = ડાઉનલોડ કરો અથવા કૉપિ કરો -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = તમારું શ્રેષ્ઠ શૉટ લો. સ્ક્રીનશોટથી તમે તમારી પસંદગીને ડાઉનલોડ કરી શકો છો અથવા તેને તમારા ક્લિપબોર્ડ પર કૉપિ કરી શકો છો. -homePageLegalLink = કાયદાકીય -homePagePrivacyLink = ખાનગીપણું -homePageTermsLink = શરતો -homePageCookiesLink = કુકીઓ - -## Leave Screenshots page - -leavePageRemoveAllData = તમામ ડેટાને દૂર કરો -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = તમારું એકાઉન્ટ કાઢી નાખવા માટે તમારી પાસે Firefox સ્ક્રીનશોટ્સ ઇન્સ્ટોલ કરેલું અથવા Firefox એકાઉન્ટમાં સાઇન ઇન હોવું આવશ્યક છે -leavePageErrorGeneric = એક ભૂલ આવી -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = આ તમારા બધા Firefox સ્ક્રિનશોટ્સ ડેટાને કાયમી ધોરણે કાઢી નાખશે. -leavePageButtonProceed = આગળ વધો -leavePageButtonCancel = રદ કરો -leavePageDeleted = તમારા બધા સ્ક્રીનશૉટ્સ દૂર થઈ ગયા છે! - -## Not Found page - -notFoundPageTitle = પૃષ્ઠ મળ્યું નથી -notFoundPageIntro = અરર. -notFoundPageDescription = પૃષ્ઠ મળ્યું નથી. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = સ્ક્રીનશૉટ: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = સમાપ્તિ બચત કરવામાં ભૂલ -shotPageAlertErrorDeletingShot = શોટ કાઢવામાં ભૂલ -shotPageAlertErrorUpdatingTitle = શીર્ષક સાચવવામાં ભૂલ -shotPageConfirmDelete = શું તમે ખરેખર આ શોટને કાયમ માટે કાઢી નાખવા માંગો છો? -shotPageShareButton = - .title = વહેચો -shotPageCopyButton = - .title = ક્લિપબોર્ડ પર છબીની નકલ કરો -shotPageCopyActionLabel = નકલ કરો -shotPageCopied = નકલ કરેલું -shotPageShareFacebook = - .title = Facebook પર વહેચો -shotPageShareTwitter = - .title = Twitter પર વહેચો -shotPageSharePinterest = - .title = Pinterest પર વહેચો -shotPageShareEmail = - .title = ઇમેઇલ દ્વારા લિંક વહેંચો -shotPageShareLink = આ શૉટ પર વહેંચવા કરવા યોગ્ય લિંક મેળવો: -shotPagePrivacyMessage = લિંક ધરાવનાર કોઈપણ આ શોટને જોઈ શકે છે. -shotPageCopyImageText = - .label = છબી ટેક્સ્ટ નકલ કરો -shotPageConfirmDeletion = શું તમે ખરેખર આ શોટને કાયમ માટે કાઢી નાખવા માંગો છો? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = જો તમે કશું કરશો નહીં, આ શોટ કાયમી રૂપે કાઢી નાખવામાં આવશે . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = જ્યાં સુધી પુનઃસ્થાપિત કરો { $date } -shotPageExpiredMessage = આ શોટની સમયસીમા સમાપ્ત થઈ ગઈ છે. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = અહીં તે પૃષ્ઠ છે જે મૂળથી બનાવવામાં આવ્યું હતું: -shotPageDeleteButton = - .title = આ શોટ કાઢી નાખો -shotPageDownloadShot = - .title = ડાઉનલોડ કરો -shotPageEditButton = - .title = આ છબી સંપાદિત કરો -shotPagefavoriteButton = - .title = આ શોટ મનપસંદમાં ઉમેરો -shotPageBackToHomeButton = - .title = મુખ્યપૃષ્ઠ -shotPageAllShotsButton = - .title = બધા સ્ક્રીનશૉટ્સ -shotPageScreenshotsDescriptionServerless = સ્ક્રીનશોટ ને સરળ બનાવ્યુ છે. Firefox છોડ્યાં વિના સ્ક્રીનશોટને કૅપ્ચર અને ડાઉનલોડ કરો. -shotPageDMCAMessage = તૃતીય પક્ષ બૌદ્ધિક સંપદા દાવાને કારણે આ શોટ હવે ઉપલબ્ધ નથી. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = વધુ માહિતી માટે વિનંતી કરવા માટે { $dmca } ઇમેઇલ કરો. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = જો તમારા શોટ્સ બહુવિધ દાવાઓને આધીન છે, તો અમે Firefox સ્ક્રિનશોટ પર તમારી ઍક્સેસ રદ કરી શકીએ છીએ. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = કૃપા કરીને તમારા ઇમેઇલમાં આ શોટનાં URL શામેલ કરો: { $url } -shotPageKeepFor = આ શૉટને કેટલા સમય સુધી જાળવી રાખવો જોઈએ? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = સમય પસંદ કરો -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = અનિશ્ચિત ∞ -shotPageKeepTenMinutes = 10 મિનીટ -shotPageKeepOneHour = 1 કલાક -shotPageKeepOneDay = 1 દિવસ -shotPageKeepOneWeek = 1 અઠવાડિયું -shotPageKeepTwoWeeks = 2 અઠવાડિયા -shotPageKeepOneMonth = 1 મહિનો -shotPageSaveExpiration = સંગ્રહો -shotPageCancelExpiration = રદ કરો -shotPageDoesNotExpire = સમાપ્ત થતું નથી -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = સમાપ્ત થાય છે -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = સમાપ્ત થઈ -timeDiffJustNow = હમણાજ -timeDiffMinutesAgo = - { $number -> - [one] 1 મિનિટ પહેલા - *[other] { $number } મિનિટ પહેલા - } -timeDiffHoursAgo = - { $number -> - [one] 1 કલાક પહેલા - *[other] { $number } કલાક પહેલા - } -timeDiffDaysAgo = - { $number -> - [one] ગઇકાલે - *[other] { $number } દિવસ પહેલા - } -timeDiffFutureSeconds = થોડીવારમાં -timeDiffFutureMinutes = - { $number -> - [one] 1 મિનિટમાં - *[other] { $number } મિનિટમાં - } -timeDiffFutureHours = - { $number -> - [one] 1 કલાકમાં - *[other] { $number } કલાકમાં - } -timeDiffFutureDays = - { $number -> - [one] કાલે - *[other] { $number } દિવસમાં - } -errorThirdPartyCookiesEnabled = જો તમે આ શોટ લીધો છે અને તેને કાઢી શકતા નથી, તો તમારે અસ્થાયી રૂપે તમારા બ્રાઉઝરની પસંદગીઓમાંથી તૃતીય પક્ષ કૂકીઝને સક્ષમ કરવાની જરૂર પડી શકે છે. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = નોંધ લો! -promoMessage = નવા સંપાદન સાધનો સાથે તમે તમારા સ્ક્રીનશોટ ને કાપવું, પ્રકાશિત કરવું અને એમાં શબ્દો ઉમેરી શકો છો -promoLink = તેમને અજમાવી જુઓ -promoCloseButton = - .title = સૂચના બંધ કરો - -## Annotations - -annotationPenButton = - .title = કલમ -annotationHighlighterButton = - .title = પ્રકાશિત કરનાર -annotationUndoButton = - .title = પૂર્વવત્ કરો -annotationRedoButton = - .title = ફરીથી કરો -annotationTextButton = - .title = ટેક્સ્ટ ઉમેરો -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = સાફ -annotationCropButton = - .title = કાપો -annotationSaveEditButton = સાચવો - .title = સંપાદન સાચવો -annotationCancelEditButton = રદ કરો - .title = સંપાદન રદ કરો -annotationCropConfirmButton = ખાતરી - .title = પસંદગીની ખાતરી કરો -annotationCropCancelButton = રદ કરો - .title = પસંદગી રદ કરો -annotationColorWhite = - .title = સફેદ -annotationColorBlack = - .title = કાળો -annotationColorRed = - .title = લાલ -annotationColorGreen = - .title = લીલો -annotationColorBlue = - .title = વાદળી -annotationColorYellow = - .title = પીળો -annotationColorPurple = - .title = જાંબલી -annotationColorSeaGreen = - .title = સમુદ્ર લીલો -annotationColorGrey = - .title = રાખોડી -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = ટેક્સ્ટનું માપ -# Values shown in text size selection dropdown -textSizeSmall = નાનું -textSizeMedium = મધ્યમ -textSizeLarge = મોટા -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = પુષ્ટિ કરો - .title = પુષ્ટિ કરો -textToolCancelButton = રદ કરો - .title = રદ કરો -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = હેલો - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = કંઈક ખોટું થયું -copyImageErrorMessage = તમારા શોટને ક્લિપબોર્ડ પર નકલ કરવામાં અસમર્થ. - -## Settings Page - -settingsDisconnectButton = જોડાણ તોડો - .title = જોડાણ તોડો -settingsGuestAccountMessage = મહેમાન ખાતું -settingsSignInButton = સાઇન ઇન - .title = સાઇન ઇન -SettingsPageHeader = Firefox સ્ક્રીનશોટ સેટિંગ્સ -settingsFirefoxAccountSubHeader = FireFox ખાતું -settingsClosePreferences = - .title = પસંદગીઓ બંધ કરો -settingsFxaDisconnectAlertMessage = શું તમે ખરેખર આ ઉપકરણનો જોડાણ તમારા Firefox ખાતામાંથી દૂર કરવા માંગો છો? -settingsFxaDisconnectDescription = જો તમે સાઇન આઉટ કરો છો, તો તમારે તમારા સ્ક્રીનશૉટ્સની પરવાનગી ફરીથી મેળવવા માટે ફરીથી સાઇન ઇન કરવાની જરૂર પડશે. -settingsFxaConnectDescription = તમે સમગ્ર ઉપકરણો પર તમારા સ્ક્રીનશૉટ્સને ઍક્સેસ કરવા માટે સાઇન ઇન કરી શકો છો. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = શોટ કાઢી નાખવામાં ભૂલ: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = મારા શોટ્સ: માટે શોધો { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = પૃષ્ઠ પ્રસ્તુતિમાં ભૂલ: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = મારા શોટ શોધો -shotIndexPageNoShotsMessage = કોઈ સાચવેલા શોટ નથી -shotIndexPageNoShotsInvitation = જાઓ, કેટલાક બનાવો -shotIndexPageLookingForShots = તમારા શૉટ્સ શોધી રહ્યાં છે… -shotIndexPageNoSearchResultsIntro = હમમ -shotIndexPageNoSearchResults = અમે તમારી શોધ સાથે મેળ ખાતા કોઈપણ શોટ શોધી શકતા નથી. -shotIndexPageMyShotsButton = - .title = મારા સ્ક્રીનશૉટ્સ -shotIndexPageClearSearchButton = - .title = શોધ સાફ કરો -shotIndexPageConfirmShotDelete = આ શોટ કાઢી નાખીએ? -shotIndexPagePreviousPage = - .title = પાછળનું પાનું -shotIndexPageNextPage = - .title = પછીનું પાનું -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = આ કોઈ મનપસંદ સ્ક્રીનશૉટ્ નથી અને તે સમાપ્ત થશે -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = આ એક મનપસંદ શોટ છે અને તે સમાપ્ત થતો નથી -shotIndexSyncedShot = - .title = શોટ બીજા ઉપકરણ પર લેવામાં આવ્યો છે -shotIndexAlertErrorFavoriteShot = મનપસંદ શૉટ સ્થિતિ અપડેટ કરવામાં ભૂલ - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = શું તમે ખરેખર આ શોટને કાઢવા માંગો છો? -shotDeleteCancel = રદ કરો - .title = રદ કરો -shotDeleteConfirm = કાઢો - .title = કાઢો - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = નિકાસ કરવા માટે: ફાઇલનો ઉપયોગ કરો> આ તરીકે પૃષ્ઠ સાચવો... અને તમને ફોલ્ડરમાં { $folder } માં તમારા સ્ક્રીનશૉટ્સ મળશે - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox સ્ક્રીનશૉટ્સ માપદંડ -metricsPageTotalsQueryTitle = કુલ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = સ્ક્રીનશોટનું ઝાંખી -metricsPageTotalsQueryDevices = રજીસ્ટર થયેલ કુલ ઉપકરણો -metricsPageTotalsQueryActiveShots = સક્રિય શોટ્સ -metricsPageTotalsQueryExpiredShots = સમાપ્ત (પરંતુ પુનઃપ્રાપ્ત) -metricsPageTotalsQueryExpiredDeletedShots = સમાપ્ત (અને કાઢી નાખેલ) -metricsPageShotsQueryTitle = દિવસ દ્વારા શોટ્સ -metricsPageShotsQueryDescription = દરરોજ બનાવેલા શોટની સંખ્યા (છેલ્લા 30 દિવસ માટે) -metricsPageShotsQueryCount = શોટની સંખ્યા -metricsPageShotsQueryDay = દિવસ -metricsPageUsersQueryTitle = દિવસ દ્વારા વપરાશકર્તાઓ -metricsPageUsersQueryDescription = ઓછામાં ઓછા એક શોટ બનાવતા વપરાશકર્તાઓની સંખ્યા, દિવસે (છેલ્લા 30 દિવસ) -metricsPageUsersQueryCount = વપરાશકર્તાઓની સંખ્યા -metricsPageUsersQueryDay = દિવસ -metricsPageUserShotsQueryTitle = વપરાશકર્તા દીઠ શોટની સંખ્યા -metricsPageUserShotsQueryDescription = કુલ N શોટ વિશેના વપરાશકર્તાઓની સંખ્યા -metricsPageUserShotsQueryCount = વપરાશકર્તાઓની સંખ્યા -metricsPageUserShotsQueryShots = સક્રિય સંખ્યા (અસમાપ્ત) શોટ્સ -metricsPageRetentionQueryTitle = જાળવી રાખો સપ્તાહ દ્વારા -metricsPageRetentionQueryDescription = વપરાશકર્તાના પ્રથમ શૉટથી સૌથી વધુ શૉટ સુધીના દિવસોની સંખ્યા, અઠવાડિયાના પ્રારંભથી જૂથ થયેલ -metricsPageRetentionQueryUsers = વપરાશકર્તાઓની સંખ્યા -metricsPageRetentionQueryDays = વપરાશકર્તાના સૌથી તાજેતરના શૉટથી દિવસો -metricsPageRetentionQueryFirstWeek = અઠવાડિયે વપરાશકર્તાએ પ્રથમ શોટ બનાવ્યો -metricsPageTotalRetentionQueryTitle = કુલ અવરોધ -metricsPageTotalRetentionQueryDescription = સમય વપરાશકર્તાઓની લંબાઈ શોટ બનાવી રહ્યાં છે, જે અઠવાડિયામાં જૂથ થયેલ છે -metricsPageTotalRetentionQueryUsers = વપરાશકર્તાઓની સંખ્યા -metricsPageTotalRetentionQueryDays = તે દિવસો વપરાશકર્તાએ શોટ બનાવ્યાં છે -metricsPageVersionQueryTitle = એડ-ઑન સંસ્કરણ -metricsPageVersionQueryDescription = ઍડ-ઑનનું આવૃત્તિ લોગિન દરમિયાન વપરાયેલ, છેલ્લા 14 દિવસોમાં -metricsPageVersionQueryUsers = લૉગિન વપરાશકર્તાઓની સંખ્યા -metricsPageVersionQueryVersion = એડ-ઑન સંસ્કરણ -metricsPageVersionQueryLastSeen = દિવસ -metricsPageHeader = માપદંડ -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = આના પર ઉત્પન્ન કર્યું: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (ડેટાબેઝ સમય: { $time }ms) diff --git a/locales/he/server.ftl b/locales/he/server.ftl deleted file mode 100644 index f35bdd5443..0000000000 --- a/locales/he/server.ftl +++ /dev/null @@ -1,383 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = צילומי המסך שלי -gHomeLink = בית -gNoShots = - .alt = לא נמצאו צילומי מסך -gScreenshotsDescription = כעת קל יותר ללכוד צילומי מסך. ניתן לצלם, לשמור ולשתף צילומי מסך מבלי לעזוב את Firefox. - -## Header - -buttonSettings = - .title = הגדרות -buttonSignIn = - .title = כניסה -screenshotsLogo = - .title = דף הבית של Screenshots -bannerUpsell = { gScreenshotsDescription } קבלת Firefox כעת -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = מה חדש ב־Firefox Screenshots? -onboardingPromoDismissButton = סגירה - .title = סגירה -onboardingPromoSigninButton = כניסה - .title = כניסה - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = תנאים -footerLinkPrivacy = הצהרת פרטיות -footerReportShot = דיווח על צילום - .title = דיווח על הצילום הזה בכך שהוא פוגעני, ספאם או כל בעיה אחרת -footerLinkFaqs = שאלות נפוצות -footerLinkDMCA = דיווח על הפרת קניית רוחני -footerLinkDiscourse = מתן משוב -footerLinkRemoveAllData = הסרת כל הנתונים - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } נוצר -creatingPageTitleDefault = עמוד -creatingPageWaitMessage = שמירת צילום המסך שלך... - -## Home page - -homePageDescription = - .content = היכולת לצלם את המסך באופן שמותאם לדפדפן. ניתן לצלם, לשמור ולשתף צילומי מסך תוך גלישה באינטרנט בעזרת Firefox. -homePageButtonMyShots = מעבר לצילומי המסך שלי -homePageTeaser = בקרוב... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = הורדה חינמית -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = איך Firefox Screenshots עובד -homePageGetStartedTitle = תחילת עבודה -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = ניתן לבחור בסמל Screenshots מתפריט פעולות הדף שבשורת הכתובת, ותפריט ה־Screenshots יופיע מעל חלון הדפדפן שלך. -homePageCaptureRegion = לכידת אזור -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = יש ללחוץ ולגרור כדי לבחור את האזור לצילום. או לעבור מעל ואז ללחוץ - Screenshots יבחר את האזור בשבילך. אהבת את התוצאה? יש לבחור בשמירה כדי לגשת לצילומי המסך המקוונים שלך או בחץ כלפי מטה כדי להוריד אותו למחשב שלך. -homePageCapturePage = לכידת דף -homePageCapturePageDescription = ניתן להשתמש בכפתורים שבפינה השמאלית העליונה כדי לצלם עמודים שלמים. הכפתור לשמירת הגלוי יצלם את האיזור הגלוי מבלי לגלול לעומת שמירת העמוד במלואו שיצלם את כל העמוד. -homePageSaveShare = שמירה ושיתוף -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageShaveShareFavoriteDescription = אפשר לשמור את צילום המסך בספריה המקוונת. לאחר השמירה Firefox יעתיק קישור לתמונה, וכך ניתן לשתף את הצילום בקלות. הצילומים בספריה נשמרים אוטומטית למשך שבועיים, אבל ניתן למחוק אותם בכל עת, או לשמור לזמן ארוך יותר. -homePageSignInTitle = הצילומים שלך בכל מקום -homePageSignInDescription = אפשר להירשם ל-Screenshots עם חשבון Firefox, וכך לגשת לתמונות שלך מכל התקנה של Firefox. בונוס נוסף: משתמשים רשומים יכולים לשמור את התמונות המועדפות שלהם לנצח. -homePageLegalLink = מידע משפטי -homePagePrivacyLink = פרטיות -homePageTermsLink = תנאים -homePageCookiesLink = עוגיות - -## Leave Screenshots page - -leavePageRemoveAllData = הסרת כל הנתונים -leavePageErrorGeneric = אירעה שגיאה -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = פעולה זו תמחק לצמיתות את כל נתוני ה־Firefox Screenshots שלך. -leavePageButtonProceed = המשך -leavePageButtonCancel = ביטול -leavePageDeleted = כל צילומי המסך שלך נמחקו! - -## Not Found page - -notFoundPageTitle = העמוד לא נמצא -notFoundPageIntro = אוי. -notFoundPageDescription = העמוד לא נמצא. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = צילום מסך: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = שגיאה בשמירת תפוגה -shotPageAlertErrorDeletingShot = שגיאה במחיקת צילום המסך -shotPageAlertErrorUpdatingTitle = שגיאה בשמירת הכותרת -shotPageConfirmDelete = האם ברצונך למחוק צילום מסך זה לצמיתות? -shotPageShareButton = - .title = שיתוף -shotPageCopyButton = - .title = העתקת תמונה ללוח העריכה -shotPageCopyActionLabel = העתקה -shotPageCopied = הועתק -shotPageShareFacebook = - .title = שיתוף ב־Facebook -shotPageShareTwitter = - .title = שיתוף ב־Twitter -shotPageSharePinterest = - .title = שיתוף ב־Pinterest -shotPageShareEmail = - .title = שיתוף קישור באמצעות דוא״ל -shotPageShareLink = קבלת קישור לצילום מסך זה הניתן לשיתוף: -shotPagePrivacyMessage = לכל מי שיש את הקישור יש גישה לצילום מסך זה. -shotPageCopyImageText = - .label = העתקת הטקסט שבתמונה -shotPageConfirmDeletion = האם ברצונך למחוק צילום מסך זה לצמיתות? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = אם לא ייעשה דבר, צילום מסך זה יימחק לצמיתות . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = שחזור עד { $date } -shotPageExpiredMessage = פג תוקפו של צילום מסך זה. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = כאן העמוד ממנו זה נוצר במקור: -shotPageDeleteButton = - .title = מחיקת צילום מסך זה -shotPageDownloadShot = - .title = הורדה -shotPageEditButton = - .title = עריכת תמונה זו -shotPagefavoriteButton = - .title = סימון צילום המסך הזה כמועדף -shotPageBackToHomeButton = - .title = דף הבית -shotPageAllShotsButton = - .title = כל צילומי המסך -shotPageScreenshotsDescription = כעת קל יותר ללכוד צילומי מסך. ניתן לצלם, לשמור ולשתף צילומי מסך מבלי לעזוב את Firefox. -shotPageDMCAMessage = צילום מסך זה אינו זמין עוד עקב דרישת קניין רוחני על ידי גורם צד שלישי. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = נא לשלוח דוא״ל אל { $dmca } על מנת לבקש מידע נוסף. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = אם ה־Shots שלך כפופים למגוון דרישות אנו עשויים לשלול ממך את הגישה ל־Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = נא לכלול את הכתובת של צילום המסך הזה בהודעת הדוא״ל שלך: { $url } -shotPageKeepFor = לכמה זמן יש לשמור צילום מסך זה? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = בחירת זמן -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = ללא הגבלת זמן ∞ -shotPageKeepTenMinutes = 10 דקות -shotPageKeepOneHour = שעה -shotPageKeepOneDay = יום -shotPageKeepOneWeek = שבוע -shotPageKeepTwoWeeks = שבועיים -shotPageKeepOneMonth = חודש -shotPageSaveExpiration = שמירה -shotPageCancelExpiration = ביטול -shotPageDoesNotExpire = אין תפוגה -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = תפוגה -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = פג תוקפו -timeDiffJustNow = ממש עכשיו -timeDiffMinutesAgo = - { $number -> - [one] לפני דקה - *[other] לפני { $number } דקות - } -timeDiffHoursAgo = - { $number -> - [one] לפני שעה - [two] לפני שעתיים - *[other] לפני { $number } שעות - } -timeDiffDaysAgo = - { $number -> - [one] אתמול - [two] לפני יומיים - *[other] לפני { $number } ימים - } -timeDiffFutureSeconds = תוך מספר שניות -timeDiffFutureMinutes = - { $number -> - [one] בעוד דקה - *[other] בעוד { $number } דקות - } -timeDiffFutureHours = - { $number -> - [one] בעוד שעה - *[other] בעוד { $number } שעות - } -timeDiffFutureDays = - { $number -> - [one] מחר - *[other] בעוד { $number } ימים - } -errorThirdPartyCookiesEnabled = אם צילמת את התמונה הזאת ולא הצלחת למחוק אותה, כנראה שעליך להפעיל באופן זמני עוגיות צד־שלישי בהעדפות הדפדפן שלך. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = תרשמו לעצמכם! -promoMessage = כלי העריכה המעודכנים מאפשרים לך לחתוך, להדגיש ואפילו להוסיף טקסט לצילום המסך שלך. -promoLink = כדאי להתנסות -promoCloseButton = - .title = סגירת התרעה - -## Annotations - -annotationPenButton = - .title = עט -annotationHighlighterButton = - .title = מדגיש -annotationUndoButton = - .title = ביטול -annotationRedoButton = - .title = ביצוע חוזר -annotationTextButton = - .title = הוספת טקסט -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = ניקוי -annotationCropButton = - .title = חיתוך -annotationSaveEditButton = שמירה - .title = שמירת עריכה -annotationCancelEditButton = ביטול - .title = ביטול עריכה -annotationCropConfirmButton = אישור - .title = אישור הבחירה -annotationCropCancelButton = ביטול - .title = ביטול בחירה -annotationColorWhite = - .title = לבן -annotationColorBlack = - .title = שחור -annotationColorRed = - .title = אדום -annotationColorGreen = - .title = ירוק -annotationColorBlue = - .title = כחול -annotationColorYellow = - .title = צהוב -annotationColorPurple = - .title = סגול -annotationColorSeaGreen = - .title = ירוק־ים -annotationColorGrey = - .title = אפור -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = גודל טקסט -# Values shown in text size selection dropdown -textSizeSmall = קטן -textSizeMedium = בינוני -textSizeLarge = גדול -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = אישור - .title = אישור -textToolCancelButton = ביטול - .title = ביטול -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = שלום - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = משהו השתבש -copyImageErrorMessage = לא ניתן להעתיק את צילום המסך שלך ללוח העריכה. - -## Settings Page - -settingsDisconnectButton = ניתוק - .title = ניתוק -settingsGuestAccountMessage = חשבון אורח -settingsSignInButton = כניסה - .title = כניסה -SettingsPageHeader = הגדרות צילומי המסך של Firefox -settingsFirefoxAccountSubHeader = חשבון Firefox -settingsClosePreferences = - .title = סגירת העדפות - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = שגיאה במחיקת צילום מסך: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = צילומי המסך שלי: חיפוש עבור { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = שגיאה בעת עיבוד העמוד להצגה: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = חיפוש בצילומי המסך שלי -shotIndexPageNoShotsMessage = אין צילומי מסך שמורים. -shotIndexPageNoShotsInvitation = קדימה, הבה ניצור כמה. -shotIndexPageLookingForShots = מתבצע חיפוש אחר הצילומים שלך… -shotIndexPageNoSearchResultsIntro = הממ -shotIndexPageNoSearchResults = לא מצאנו שום צילומי מסך התואמים לחיפוש שלך. -shotIndexPageMyShotsButton = - .title = צילומי המסך שלי -shotIndexPageClearSearchButton = - .title = ניקוי חיפוש -shotIndexPageConfirmShotDelete = האם למחוק צילום מסך זה? -shotIndexPagePreviousPage = - .title = העמוד הקודם -shotIndexPageNextPage = - .title = העמוד הבא -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = זה אינו צילום מועדף והוא יפוג -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = זהו צילום מסך מועדף ואין לו מועד תפוגה -shotIndexSyncedShot = - .title = צולם בהתקן אחר -shotIndexAlertErrorFavoriteShot = שגיאה בעדכון מצב צילום מועדף - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = למחוק את הצילום הזה? -shotDeleteCancel = ביטול - .title = ביטול -shotDeleteConfirm = מחיקה - .title = מחיקה - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = מדדים של Firefox Screenshots -metricsPageTotalsQueryTitle = סיכומים -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = סקירה של Screenshots -metricsPageTotalsQueryDevices = סך כל ההתקנים הרשומים -metricsPageTotalsQueryActiveShots = צילומי מסך פעילים -metricsPageTotalsQueryExpiredShots = פג (אך ניתן לשחזור) -metricsPageTotalsQueryExpiredDeletedShots = פג (ונמחק) -metricsPageShotsQueryTitle = צילומי מסך לפי יום -metricsPageShotsQueryDescription = מספר צילומי המסך שנוצרו בכל יום (עבור 30 הימים האחרונים) -metricsPageShotsQueryCount = מספר צילומי המסך -metricsPageShotsQueryDay = יום -metricsPageUsersQueryTitle = משתמשים לפי יום -metricsPageUsersQueryDescription = מספר המשתמשים שיצרו לפחות צילום מסך אחד, לפי יום (ב־30 הימים האחרונים) -metricsPageUsersQueryCount = מספר המשתמשים -metricsPageUsersQueryDay = יום -metricsPageUserShotsQueryTitle = מספר התמונות לכל משתמש -metricsPageUserShotsQueryDescription = מספר המשתמשים שיש להם בערך N תמונות בסך הכול -metricsPageUserShotsQueryCount = מספר המשתמשים -metricsPageUserShotsQueryShots = מספר משוער של צילומי מסך פעילים (שלא פג תוקפם) -metricsPageRetentionQueryTitle = תפוגה לפי שבוע -metricsPageRetentionQueryDescription = מספר הימים מאז הצילום הראשון של המשתמש ועד לצילום העדכני ביותר, מקובץ לפי שבוע ההתחלה -metricsPageRetentionQueryUsers = מספר המשתמשים -metricsPageRetentionQueryDays = ימים מהצילום הראשון עד לצילום העדכני ביותר -metricsPageRetentionQueryFirstWeek = השבוע שבו המשתמש צילם לראשונה -metricsPageTotalRetentionQueryTitle = סך כל התפוגה -metricsPageTotalRetentionQueryDescription = משך הזמן שבו משתמשים צילמו, מקובץ לפי שבוע -metricsPageTotalRetentionQueryUsers = מספר המשתמשים -metricsPageTotalRetentionQueryDays = הימים בהם המשתמש יצר צילומי מסך -metricsPageVersionQueryTitle = גרסת תוספת -metricsPageVersionQueryDescription = גרסת התוספת בה נעשה שימוש במהלך הכניסה, ב־14 הימים האחרונים -metricsPageVersionQueryUsers = מספר המשתמשים המחוברים -metricsPageVersionQueryVersion = גרסת תוספת -metricsPageVersionQueryLastSeen = יום -metricsPageHeader = מדדים -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = מועד היצירה: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (זמן מסד נתונים: { $time }ms) diff --git a/locales/hi-IN/server.ftl b/locales/hi-IN/server.ftl deleted file mode 100644 index 146685ae78..0000000000 --- a/locales/hi-IN/server.ftl +++ /dev/null @@ -1,387 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = मेरे चित्र -gHomeLink = मुख्य -gNoShots = - .alt = कोई शॉट नहीं मिला - -## Header - -buttonSettings = - .title = सेटिंग्स -buttonSignIn = - .title = साइन इन करें -screenshotsLogo = - .title = स्क्रीनशॉट होम -bannerSignIn = अपने पसंदीदा स्क्रीनशॉट को हमेशा के लिए सहेजने और अन्य उपकरणों पर देखने के लिए साइन इन या साइन अप करें। -bannerUpsell = { gScreenshotsDescription } Firefox अभी पायें -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefox Screenshots के साथ नया क्या है? -onboardingPromoMessage = अब, Firefox खाते के साथ स्क्रीनशॉट में साइन इन करें और अधिक करें: -onboardingPromoMessageListItem1 = अपने सभी उपकरणों पर अपनी लाइब्रेरी तक पहुँचें -onboardingPromoMessageListItem2 = अपने पसंदीदा शॉट हमेशा के लिए संग्रहित करें -onboardingPromoDismissButton = निरस्त करें - .title = निरस्त करें -onboardingPromoSigninButton = साइन इन - .title = साइन इन - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = शर्तें -footerLinkPrivacy = गोपनीयता सूचना -footerReportShot = स्क्रीनशॉट की रिपोर्ट करें - .title = दुर्व्यवहार, स्पैम, या अन्य समस्याओं के लिए इस स्क्रीनशॉट की रिपोर्ट करें -footerLinkFaqs = अक्सर पूछे जाने वाले प्रश्न -footerLinkDMCA = रिपोर्ट IP उल्लंघन -footerLinkDiscourse = प्रतिक्रिया दें -footerLinkRemoveAllData = सभी डेटा हटाएँ - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } बनाना -creatingPageTitleDefault = पृष्ठ -creatingPageWaitMessage = आपका शॉट सहेजा जा रहा है ... - -## Home page - -homePageDescription = - .content = सहज ज्ञान युक्त सही ब्राउज़र में बेक्ड स्क्रीनशॉट । कैप्चर करें, सहेजें और शेयर स्क्रीनशॉट के रूप में आप Firefox का उपयोग कर वेब ब्राउज़ करें । -homePageButtonMyShots = मेरे शॉट्स पर जाएं -homePageTeaser = जल्द आ रहा है... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = मुफ्त डाउनलोड -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox स्क्रीनशॉट कैसे काम करता हैं -homePageGetStartedTitle = प्रारंभ करें -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = पता बार में पृष्ठ क्रिया मेनू से स्क्रीनशॉट आइकन का चयन करें, और स्क्रीनशॉट मेनू आपकी ब्राउज़र विंडो के शीर्ष पर दिखाई देगा। -homePageCaptureRegion = एक क्षेत्र कैप्चर करें -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = जिस क्षेत्र को आप कैप्चर करना चाहते हैं उसका चयन करने के लिए उस पर क्लिक करें और खींचें। या केवल क्लिक करें-स्क्रीनशॉट आप के लिए क्षेत्र का चयन करे लेगा। जैसे कि तुम देख सकते हो? अपने स्क्रीनशॉट को ऑनलाइन देकने के लिए सेव का चयन करें या अपने कंप्यूटर पर डाउनलोड करने के लिए नीचे तीर बटन का चयन करें। -homePageCapturePage = एक पृष्ठ कैप्चर करें -homePageCapturePageDescription = पूर्ण पृष्ठों को कैप्चर करने के लिए ऊपरी दाईं ओर के बटनों का उपयोग करें. दृश्य सहेजें बटन आप स्क्रॉल के बिना देख सकते हैं क्षेत्र पर कब्जा होगा, और पूरे पृष्ठ को बचाने के पृष्ठ पर सब कुछ कब्जा होगा. -homePageDownloadCopy = डाउनलोड या कॉपी करें -homePageLegalLink = वैध -homePagePrivacyLink = गोपनीयता -homePageTermsLink = शर्तें -homePageCookiesLink = कुकीज़ - -## Leave Screenshots page - -leavePageRemoveAllData = सभी डेटा मिटाये -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = अपने ख़ाते को मिटाने के लिए आपके पास Firefox Screenshot इनस्टॉल होना चाहिए या Firefox ख़ाते में साइन इन होना चाहिए -leavePageErrorGeneric = एक त्रुटि उत्पन्न हुई -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = यह आपके सभी firefox स्क्रीनशॉट डेटा को हमेशा के लिए मिटा देगा. -leavePageButtonProceed = आगे जाऐं -leavePageButtonCancel = रद्द करें -leavePageDeleted = आपके सभी स्क्रीनशॉट मिटा दिए गए हैं! - -## Not Found page - -notFoundPageTitle = पृष्ठ नहीं मिला -notFoundPageIntro = ओह -notFoundPageDescription = पृष्‍ठ नहीं मिला. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = स्क्रीनशॉट: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = समाप्ति की बचत करने में त्रुटि -shotPageAlertErrorDeletingShot = शॉट हटाने में त्रुटि -shotPageAlertErrorUpdatingTitle = शीर्षक को सहेजने में त्रुटि -shotPageConfirmDelete = क्या आप वाकई इस शॉट को स्थायी रूप से हटाना चाहते हैं? -shotPageShareButton = - .title = साझा -shotPageCopyButton = - .title = चित्र को क्लिपबोर्ड में कॉपी करें -shotPageCopyActionLabel = कॉपी -shotPageCopied = नक़ल की गयी -shotPageShareFacebook = - .title = firefox पर साझा करें -shotPageShareTwitter = - .title = Twitter पर साझा करें -shotPageSharePinterest = - .title = Pinterest पर साझा करें -shotPageShareEmail = - .title = ईमेल द्वारा कड़ी साझा करें -shotPageShareLink = इस शॉट के लिए एक साझा करने योग्य लिंक प्राप्त करें: -shotPagePrivacyMessage = लिंक के द्वारा कोई भी इस शॉट को देख सकता है. -shotPageCopyImageText = - .label = छवि पाठ की प्रतिलिपि बनाएँ -shotPageConfirmDeletion = क्या आपको यकीन हैं की आप इस शॉट को हमेशा के लिए मिटाना चाहते हैं? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = यदि आप कुछ नहीं करते हैं, तो यह शॉट स्थाई रूप से हटा दिया जाएगा । -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $Date } तक पुनर्स्थापित करें -shotPageExpiredMessage = इस शॉट की समय सीमा समाप्त हो गई है. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = यहां यह मूल रूप से बनाया गया था पृष्ठ है: -shotPageDeleteButton = - .title = यह शॉट हटाएँ -shotPageDownloadShot = - .title = डाउनलोड करें -shotPageEditButton = - .title = इस छवि को संपादित करें -shotPagefavoriteButton = - .title = इस शॉट को पसंदीदा करें -shotPageBackToHomeButton = - .title = मुख्यपृष्ठ -shotPageAllShotsButton = - .title = सभी स्क्रीनशॉट -shotPageDMCAMessage = तीसरे पक्ष के बौद्धिक संपदा दावे के कारण यह शॉट अब उपलब्ध नहीं है। -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = अधिक जानकारी का अनुरोध करने के लिए कृपया { $dmca } ईमेल करें -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = अगर आपके शॉट्स कई दावों के अधीन हैं, तो हम Firefox स्क्रीनशॉट्स पर आपकी पहुंच को रद्द कर सकते हैं। -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = कृपया अपने ईमेल में इस शॉट का यूआरएल शामिल करें: { $url } -shotPageKeepFor = कितने समय तक इस शॉट बनाए रखा जाना चाहिए? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = समय चुने -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = अनिश्चितकाल ∞ -shotPageKeepTenMinutes = 10 मिनट -shotPageKeepOneHour = 1 घंटा -shotPageKeepOneDay = 1 दिन -shotPageKeepOneWeek = 1 सप्ताह -shotPageKeepTwoWeeks = 2 सप्ताह -shotPageKeepOneMonth = 1 महीना -shotPageSaveExpiration = सहेजें -shotPageCancelExpiration = रद्द करें -shotPageDoesNotExpire = समाप्त नहीं होता है -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = समय सीमा समाप्त -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = समाप्त -timeDiffJustNow = बस अभी -timeDiffMinutesAgo = - { $number -> - [one] 1 मिनट पहले - *[other] { $number } मिनट पहले - } -timeDiffHoursAgo = - { $number -> - [one] 1 घंटे पहले - *[other] { $number } घंटे पहले - } -timeDiffDaysAgo = - { $number -> - [one] कल - *[other] { $number } दिन पहले - } -timeDiffFutureSeconds = कुछ ही समय में -timeDiffFutureMinutes = - { $number -> - [one] 1 मिनट में - *[other] { $number } मिनट में - } -timeDiffFutureHours = - { $number -> - [one] 1 घंटे में - *[other] { $number } घंटे में - } -timeDiffFutureDays = - { $number -> - [one] कल - *[other] { $number } दिनों में - } -errorThirdPartyCookiesEnabled = यदि आप ने शॉट लिया और delete नहीं कर पा रहे हैं, तो आपके बराउजर के preferences से अन्य पारटी cookies को अस्थायी रूप से enable करना होगा। - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = नोट करें! -promoMessage = अद्यतन संपादन उपकरण आपको काँट-छाँट करने, चमकाने, और यहां तक कि आपके स्क्रीनशॉट के लिए पाठ जोड़ देते हैं। -promoLink = उन्हें आज़माएँ -promoCloseButton = - .title = अधिसूचना बंद करें - -## Annotations - -annotationPenButton = - .title = पेन -annotationHighlighterButton = - .title = प्रमुखताएँ -annotationUndoButton = - .title = पूर्ववत् करें -annotationRedoButton = - .title = फिर से करें -annotationTextButton = - .title = पाठ जोड़ें -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = साफ करें -annotationCropButton = - .title = काट-छाँट करें -annotationSaveEditButton = सहेजें - .title = संपादन सहेजें -annotationCancelEditButton = रद्द करें - .title = संपादन रद्द करें -annotationCropConfirmButton = पुष्टि करें - .title = चयन की पुष्टि करें -annotationCropCancelButton = रद्द करें - .title = चयन रद्द करें -annotationColorWhite = - .title = सफेद -annotationColorBlack = - .title = काला -annotationColorRed = - .title = लाल -annotationColorGreen = - .title = हरा -annotationColorBlue = - .title = नीला -annotationColorYellow = - .title = पीला -annotationColorPurple = - .title = बैंगनी -annotationColorSeaGreen = - .title = श्याम हरित -annotationColorGrey = - .title = भूरा -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = मूलशब्द आकार -# Values shown in text size selection dropdown -textSizeSmall = छोटा -textSizeMedium = मध्यम -textSizeLarge = बड़ा -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = पुष्टि करें - .title = पुष्टि करें -textToolCancelButton = रद्द करें - .title = रद्द करें -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = नमस्ते - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = कुछ त्रुटी उत्पन्न हुयी है -copyImageErrorMessage = आपके स्क्रीनशॉट को क्लिपबोर्ड में कॉपी करने में असफलता हुयी। - -## Settings Page - -settingsDisconnectButton = असम्बद्ध करें - .title = असम्बद्ध करें -settingsGuestAccountMessage = अतिथि खाता -settingsSignInButton = साइन इन - .title = साइन इन -SettingsPageHeader = Firefox स्क्रीनशॉट सेटिंग -settingsFirefoxAccountSubHeader = Firefox खाता -settingsClosePreferences = - .title = प्राथमिकताएँ बंद करें -settingsFxaDisconnectAlertMessage = क्या आप निश्चित रूप से इस उपकरण को अपने Firefox खाते से असंबद्ध करना चाहते हैं? -settingsFxaDisconnectDescription = यदि आप साइन आउट करते हैं, तो आपको अपने स्क्रीनशॉट तक पहुँच प्राप्त करने के लिए फिर से साइन इन करना होगा। -settingsFxaConnectDescription = आप उपकरणों पर अपने स्क्रीनशॉट तक पहुँचने के लिए साइन इन कर सकते हैं। - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = शॉट हटाने में त्रुटि: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = मेरे शॉट्स: के लिए खोज करें{ $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = प्रतिपादन पृष्ठ त्रुटि: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = मेरे शॉट्स खोजें -shotIndexPageNoShotsMessage = कोई सहेजे गए शॉट नहीं -shotIndexPageNoShotsInvitation = चलें, कुछ बनाएँ -shotIndexPageLookingForShots = अपने शॉट्स की खोज... -shotIndexPageNoSearchResultsIntro = अच्छा -shotIndexPageNoSearchResults = हम आपकी खोज से मेल खाने वाले किसी भी शॉट को नहीं ढूंढ सकते. -shotIndexPageMyShotsButton = - .title = मेरे स्क्रीनशॉट -shotIndexPageClearSearchButton = - .title = स्पष्ट खोज -shotIndexPageConfirmShotDelete = इस शॉट को हटाएं? -shotIndexPagePreviousPage = - .title = पिछला पृष्ठ -shotIndexPageNextPage = - .title = अगला पृष्ठ -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = यह कोई पसंदीदा स्क्रीनशॉट नहीं है तथा ये नियमित समय के बाद मिट जाएगा -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = यह एक पसंदीदा शॉट है और यह समाप्त नहीं होता है -shotIndexSyncedShot = - .title = अन्य उपकरण पर लिए स्क्रीनशॉट -shotIndexAlertErrorFavoriteShot = पसंदीदा स्क्रीनशॉट स्थिति अपडेट करने में त्रुटि - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = क्या आप आश्वस्त हैं की आप इस शॉट को मिटाना चाहते हैं? -shotDeleteCancel = रद्द करें - .title = रद्द करें -shotDeleteConfirm = मिटाएँ - .title = मिटाएँ - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox स्क्रीनशॉट मेट्रिक्स -metricsPageTotalsQueryTitle = कुल -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = स्क्रीनशॉट का अवलोकन -metricsPageTotalsQueryDevices = कुल पंजीकृत डिवाइस -metricsPageTotalsQueryActiveShots = सक्रिय शॉट्स -metricsPageTotalsQueryExpiredShots = समय सीमा समाप्त (लेकिन वापस मिल सकने योग्य) -metricsPageTotalsQueryExpiredDeletedShots = समाप्त (और हटा दिया जा चूका ) -metricsPageShotsQueryTitle = दिन के शॉट्स -metricsPageShotsQueryDescription = प्रत्येक दिन बनाए गए शॉट्स की संख्या (पिछले 30 दिनों के लिए) -metricsPageShotsQueryCount = शॉट्स की संख्या -metricsPageShotsQueryDay = दिन -metricsPageUsersQueryTitle = दिन के अनुसार उपयोगकर्ता -metricsPageUsersQueryDescription = उपयोगकर्ताओं की संख्या जिसने कम से कम एक शॉट बनाया हो, एक दिन में (पिछले 30 दिन) -metricsPageUsersQueryCount = उपयोगकर्ताओं की संख्या -metricsPageUsersQueryDay = दिन -metricsPageUserShotsQueryTitle = उपयोगकर्ता की संख्या प्रति शॉट्स -metricsPageUserShotsQueryDescription = N कुल शॉट्स के बारे में उपयोगकर्ताओं की संख्या -metricsPageUserShotsQueryCount = उपयोगकर्ताओं की संख्या -metricsPageUserShotsQueryShots = लगभग सक्रिय शॉट्स (असमाप्त) की संख्या -metricsPageRetentionQueryTitle = सप्ताह से प्रतिधारण -metricsPageRetentionQueryDescription = प्रारंभिक सप्ताह द्वारा समूहीकृत, उपयोगकर्ता के पहले शॉट से सबसे हाल के शॉट पर दिनों की संख्या -metricsPageRetentionQueryUsers = उपयोगकर्ताओं की संख्या -metricsPageRetentionQueryDays = पयोगकर्ता के पहले से सबसे हाल के स्क्रीनशॉट -metricsPageRetentionQueryFirstWeek = एक सप्ताह उपयोगकर्ता ने पहला शॉट बनाया -metricsPageTotalRetentionQueryTitle = कुल प्रतिधारण -metricsPageTotalRetentionQueryDescription = समय अवधि जिसमे उपयोगकर्ता शॉट्स बना रहे हैं, सप्ताह के अनुसार समूहबद्ध की हुई -metricsPageTotalRetentionQueryUsers = उपयोगकर्ताओं की संख्या -metricsPageTotalRetentionQueryDays = दिन उपयोगकर्ता शॉट्स बना रहा है. -metricsPageVersionQueryTitle = ऐड-ऑन संस्करण -metricsPageVersionQueryDescription = पिचले 14 दिनो मे, लोग इन के दौरान इस्तमाल किए गए add-on का version -metricsPageVersionQueryUsers = प्रवेश करने वाले उपयोगकर्ताओं की संख्या -metricsPageVersionQueryVersion = एड-ऑन संस्करण -metricsPageVersionQueryLastSeen = दिन -metricsPageHeader = मैट्रिक्स -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = यहां उत्पन्न: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (डेटाबेस का समय: { $time }ms) diff --git a/locales/hr/server.ftl b/locales/hr/server.ftl deleted file mode 100644 index 494507ae22..0000000000 --- a/locales/hr/server.ftl +++ /dev/null @@ -1,403 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Moje snimke -gHomeLink = Početna -gNoShots = - .alt = Snimke nisu pronađene -gScreenshotsDescriptionServerless = Snimke zaslona pojednostavljene. Uhvatite i preuzmite snimke zaslona bez da napustite Firefox. - -## Header - -buttonSettings = - .title = Postavke -buttonSignIn = - .title = Prijava -screenshotsLogo = - .title = Snimke zaslona početna -bannerSignIn = Prijavite se ili registrirajte kako biste imali pristup svojim snimkama sa svih uređaja i spremili vaše omiljene zauvijek. -bannerUpsell = { gScreenshotsDescription }Preuzmite Fiirefox sada -shutdownWarning = Spremljene snimke uskoro istječu. Od lipnja, snimke zaslona neće više nuditi pohranu na mreži. Želite li zadržati svoju biblioteku? Preuzmite snimke na svoje računalo. -shutdownPageTitle = Snimke ekrana se mijenjaju -shutdownPageDescription = Počevši od lipnja, snimke ekrana neće više pružati mogućnost pohrane na mreži. Želite li zadržati snimke iz vaše zbirke? Preuzmite snimke pojedinačno ili grupno. Hvala vam što koristite ovu mogućnost i žao nam je zbog neugodnosti. -shutdownPageContinue = Nadamo se da ćete i dalje koristiti snimke zaslona za snimanje, kopiranje i preuzimanje snimaka. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Što je novo u Firefox snimkama zaslona? -onboardingPromoMessage = Prijavite se u snimke zaslona s Firefox računom i učinite više: -onboardingPromoMessageListItem1 = Pristupite svojoj biblioteci na svim svojim uređajima -onboardingPromoMessageListItem2 = Čuvajte svoje omiljene snimke zauvijek -onboardingPromoDismissButton = Odbaci - .title = Odbaci -onboardingPromoSigninButton = Prijavi se - .title = Prijavi se - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Uvjeti -footerLinkPrivacy = Politika privatnost -footerReportShot = Prijavi snimku - .title = Prijavi ovu snimku zbog kršenja pravila, neželjene pošte ili drugih problema -footerLinkFaqs = ČPP -footerLinkDMCA = Prijavite kršenje vlasničkih prava -footerLinkDiscourse = Pošaljite nam povratnu informaciju -footerLinkRemoveAllData = Uklonite sve podatke - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Stvaranje { $title } -creatingPageTitleDefault = stranica -creatingPageWaitMessage = Spremanje vaše snimke… - -## Home page - -homePageDescription = - .content = Intuitivne snimke zaslona ugrađene direktno u vaš pretraživač. Snimite, spremite i dijelite snimke zaslona dok pretražujete web koristeći Firefox. -homePageButtonMyShots = Idi na moje snimke -homePageTeaser = Dolazi uskoro… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Besplatno preuzimanje -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Kako rade Firefox Screenshots -homePageGetStartedTitle = Započnite -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Odaberite ikonu snimke ekrana iz izbornika radnji stranice u adresnoj traci i izbornik snimke ekrana će se pojaviti povrh prozora vašeg pretraživača. -homePageCaptureRegion = Uhvatite dio stranice -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Kliknite i vucite kako biste odabrali područje koje želite snimiti. Ili samo pređite mišem i kliknite — snimke zaslona će odabrati područje za vas. Sviđa vam se što vidite? Odaberite Spremi kako biste pristupili svojoj snimci na internetu ili gumb sa strelicom prema dolje kako biste je preuzeli na svoje računalo. -homePageCapturePage = Snimi stranicu -homePageCapturePageDescription = Koristite gumb gore desno kako biste snimili cijelu stranicu. Gumb Spremi vidljivo će snimiti područje koje možete vidjeti bez pomicanja stranice, a Spremi cijelu stranicu će snimiti sve na stranici. -homePageDownloadCopy = Preuzmi ili kopiraj -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Iskoristi svoju najbolju priliku. Snimke zaslona vam omogućuju da preuzmete vaš odabir ili kopirate ga u vaš međuspremnik. -homePageLegalLink = Pravne informacije -homePagePrivacyLink = Privatnost -homePageTermsLink = Uvjeti -homePageCookiesLink = Kolačići - -## Leave Screenshots page - -leavePageRemoveAllData = Ukloni sve podatke -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Morati imati Firefox snimke zaslona instalirane ili biti prijavljeni u vaš Firefox račun kako biste obrisali svoj račun. -leavePageErrorGeneric = Došlo je do greške -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Trajno ćete obrisati sve Firefox Screenshot podatke. -leavePageButtonProceed = Nastavi -leavePageButtonCancel = Otkaži -leavePageDeleted = Sve vaše slike su izbrisane! - -## Not Found page - -notFoundPageTitle = Stranica nije pronađena -notFoundPageIntro = Ups. -notFoundPageDescription = Stranica nije pronađena. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Snimka: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Greška pri spremanju vremena isticanja -shotPageAlertErrorDeletingShot = Greška pri brisanju slike -shotPageAlertErrorUpdatingTitle = Greška pri spremanju naslova -shotPageConfirmDelete = Jeste li sigurni da želite trajno obrisati ovu sliku? -shotPageShareButton = - .title = Dijeli -shotPageCopyButton = - .title = Kopiraj sliku u međuspremnik -shotPageCopyActionLabel = Kopiraj -shotPageCopied = Kopirano -shotPageShareFacebook = - .title = Dijeli na Facebooku -shotPageShareTwitter = - .title = Dijeli na Twitteru -shotPageSharePinterest = - .title = Dijeli na Pinterestu -shotPageShareEmail = - .title = Dijeli poveznicu putem e-pošte -shotPageShareLink = Dohvati poveznicu za dijeljenje za ovu sliku: -shotPagePrivacyMessage = Svi koji posjete ovu poveznicu će moći vidjeti sliku. -shotPageCopyImageText = - .label = Kopiraj tekst slike -shotPageConfirmDeletion = Jeste li sigurni da želite trajno obrisati ovu slike? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ukoliko ništa ne učinite ova slika će biti trajno obrisana . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = vrati do { $date } -shotPageExpiredMessage = Ova snimka je istekla. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Ovdje je stranica na kojoj je originalno uslikana: -shotPageDeleteButton = - .title = Obriši ovu snimku -shotPageDownloadShot = - .title = Preuzimanje -shotPageEditButton = - .title = Uredi ovu sliku -shotPagefavoriteButton = - .title = Označite snimak omiljenim -shotPageBackToHomeButton = - .title = Početna stranica -shotPageAllShotsButton = - .title = Sve snimke -shotPageScreenshotsDescriptionServerless = Snimke zaslona pojednostavljene. Snimite i preuzmite snimke zaslona bez napuštanja Firefoxa. -shotPageDMCAMessage = Ova snimka više nije dostupna zbog zahtjeva za intelektualnim vlasništvom treće strane. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Pošaljite e-poštu na { $dmca } kako biste zatražili više informacija. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ukoliko se pojavi više zahtjeva za kršenje intelektualnog vlasništva za vaše snimke, možemo vam ukinuti pristup usluzi Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Uključite URL na ovu snimku u vašoj poruci e-pošte: { $url } -shotPageKeepFor = Koliko dugo želite čuvati ovu snimku? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Odaberite vrijeme -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Na neodređeno vrijeme ∞ -shotPageKeepTenMinutes = 10 minuta -shotPageKeepOneHour = 1 sat -shotPageKeepOneDay = 1 dan -shotPageKeepOneWeek = 1 tjedan -shotPageKeepTwoWeeks = 2 tjedna -shotPageKeepOneMonth = 1 mjesec -shotPageSaveExpiration = spremi -shotPageCancelExpiration = otkaži -shotPageDoesNotExpire = ne ističe -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = ističe -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = isteklo -timeDiffJustNow = upravo sada -timeDiffMinutesAgo = - { $number -> - [one] prije { $number } minutu - [few] prije { $number } minute - *[other] prije { $number } minuta - } -timeDiffHoursAgo = - { $number -> - [one] prije { $number } sat - [few] prije { $number } sata - *[other] prije { $number } sati - } -timeDiffDaysAgo = - { $number -> - [one] prije { $number } dan - [few] prije { $number } dana - *[other] prije { $number } dana - } -timeDiffFutureSeconds = za nekolio sekundi -timeDiffFutureMinutes = - { $number -> - [one] za { $number } minutu - [few] za { $number } minute - *[other] za { $number } minuta - } -timeDiffFutureHours = - { $number -> - [one] za { $number } sat - [few] za { $number } sata - *[other] za { $number } sati - } -timeDiffFutureDays = - { $number -> - [one] za { $number } dan - [few] za { $number } dana - *[other] za { $number } dana - } -errorThirdPartyCookiesEnabled = Ako ste napravili snimak ekrana i ne možete ga izbrisati, možda trebate privremeno omogućiti kolačiće trećih strana u postavkama vašeg preglednika. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Na znanje! -promoMessage = Nadograđeni alati za uređivanje omogućuju vam da obrežete, istaknete i dodate tekst na vaše snimke. -promoLink = Pokušajte -promoCloseButton = - .title = Zatvorite obavijest - -## Annotations - -annotationPenButton = - .title = Olovka -annotationHighlighterButton = - .title = Isticanje -annotationUndoButton = - .title = Poništi -annotationRedoButton = - .title = Ponovi -annotationTextButton = - .title = Dodaj tekst -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Očisti -annotationCropButton = - .title = Izreži -annotationSaveEditButton = Spremi - .title = Spremi uređivanje -annotationCancelEditButton = Odustani - .title = Odustani od uređivanja -annotationCropConfirmButton = Potvrdi - .title = Potvrdi odabir -annotationCropCancelButton = Otkaži - .title = Otkaži odabir -annotationColorWhite = - .title = Bijela -annotationColorBlack = - .title = Crna -annotationColorRed = - .title = Crvena -annotationColorGreen = - .title = Zelena -annotationColorBlue = - .title = Plava -annotationColorYellow = - .title = Žuta -annotationColorPurple = - .title = Ljubičasta -annotationColorSeaGreen = - .title = Morsko zelena -annotationColorGrey = - .title = Siva -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Veličina teksta -# Values shown in text size selection dropdown -textSizeSmall = Mala -textSizeMedium = Srednja -textSizeLarge = Velika -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Potvrdi - .title = Potvrdi -textToolCancelButton = Otkaži - .title = Otkaži -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Pozdrav - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Nešto je pošlo po zlu -copyImageErrorMessage = Nije moguće kopirati vašu snimku u međuspremnik. - -## Settings Page - -settingsDisconnectButton = Prekini vezu - .title = Prekini vezu -settingsGuestAccountMessage = Gost račun -settingsSignInButton = Prijava - .title = Prijava -SettingsPageHeader = Postavke Firefox snimki zaslona -settingsFirefoxAccountSubHeader = Firefox račun -settingsClosePreferences = - .title = Zatvori postavke -settingsFxaDisconnectAlertMessage = Jeste li sigurni da želite prekinuti vezu ovog uređaja s Firefox računom? -settingsFxaDisconnectDescription = Ukoliko se odjavite, trebat ćete se ponovno prijaviti kako biste povratili pristup svojim snimkama zaslona. -settingsFxaConnectDescription = Možete se prijaviti kako biste pristupili snimkama zaslona na više uređaja. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Greška pri brisanju snimke: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Moje snimke: traži { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Greška pri crtanju stranice: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Pretraži moje snimke -shotIndexPageNoShotsMessage = Nema spremljenih snimki. -shotIndexPageNoShotsInvitation = Samo naprijed, napravite nekoliko. -shotIndexPageLookingForShots = Traženje vaših snimki… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Ne možemo pronaći niti jednu snimku koja odgovara vašem upitu. -shotIndexPageMyShotsButton = - .title = Moje snimke -shotIndexPageClearSearchButton = - .title = Očisti pretraživanje -shotIndexPageConfirmShotDelete = Obriši ovu snimku? -shotIndexPagePreviousPage = - .title = Prethodna stranica -shotIndexPageNextPage = - .title = Sljedeća stranica -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Ovo nije omiljeni snimak i isteći će -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Ovo je omiljeni snimak i ne istječe -shotIndexSyncedShot = - .title = Snimak snimljen na drugom uređaju -shotIndexAlertErrorFavoriteShot = Greška pri ažuriranju statusa omiljenih snimaka - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Jeste li sigurni da želite obrisati ovaj snimak? -shotDeleteCancel = Otkaži - .title = Otkaži -shotDeleteConfirm = Obriši - .title = Obriši - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Za izvoz: koristite Datoteka > Spremi stranicu kao… i pronaći ćete svoje snimke u mapi { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshot metrika -metricsPageTotalsQueryTitle = Ukupno -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Pregled snimki zaslona -metricsPageTotalsQueryDevices = Ukupno registrirano uređaja -metricsPageTotalsQueryActiveShots = Aktivnih snimki -metricsPageTotalsQueryExpiredShots = Isteklo (ali se može vratiti) -metricsPageTotalsQueryExpiredDeletedShots = Isteklo (i obrisano) -metricsPageShotsQueryTitle = Snimki po danu -metricsPageShotsQueryDescription = Broj snimki napravljen svaki dan (za zadnjih 30 dana) -metricsPageShotsQueryCount = Broj snimki -metricsPageShotsQueryDay = Dan -metricsPageUsersQueryTitle = Korisnika po danu -metricsPageUsersQueryDescription = Broj korisnika koji je napravio barem jednu snimku, po danu (zadnjih 30 dana) -metricsPageUsersQueryCount = Broj korisnika -metricsPageUsersQueryDay = Dan -metricsPageUserShotsQueryTitle = Broj snimki po korisniku -metricsPageUserShotsQueryDescription = Broj korisnika koji imaju oko N ukupno snimki -metricsPageUserShotsQueryCount = Broj korisnika -metricsPageUserShotsQueryShots = Približan broj aktivnih (koje nisu istekle) snimki -metricsPageRetentionQueryTitle = Zadržavanje po tjednu -metricsPageRetentionQueryDescription = Broj dana od korisnikove prve snimke do najnovije snimke, grupirano po početnom tjednu -metricsPageRetentionQueryUsers = Broj korisnika -metricsPageRetentionQueryDays = Dana od korisnikove prve do zadnje snimke -metricsPageRetentionQueryFirstWeek = Tjedan u kojem je korisnik napravio prvu snimku -metricsPageTotalRetentionQueryTitle = Ukupno zadržavanje -metricsPageTotalRetentionQueryDescription = Duljina vremena u kojem korisnici stvaraju snimke, grupirano po tjednu -metricsPageTotalRetentionQueryUsers = Broj korisnika -metricsPageTotalRetentionQueryDays = Dani u kojima korisnici rade snimke -metricsPageVersionQueryTitle = Inačica dodatka -metricsPageVersionQueryDescription = Inačica dodatka korištena prilikom prijave u zadnjih 14 dana -metricsPageVersionQueryUsers = Broj korisnika koji su se prijavili -metricsPageVersionQueryVersion = Inačica dodatka -metricsPageVersionQueryLastSeen = Dan -metricsPageHeader = Metrika -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Stvoreno: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (vrijeme baze podataka: { $time }ms) diff --git a/locales/hsb/server.ftl b/locales/hsb/server.ftl deleted file mode 100644 index 50f2826afe..0000000000 --- a/locales/hsb/server.ftl +++ /dev/null @@ -1,409 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Moje fota wobrazowki -gHomeLink = Startowa strona -gNoShots = - .alt = Žane fota wobrazowki namakane -gScreenshotsDescriptionServerless = Fota wobrazowki lochko wutworjene. Wutworće a sćehńće fota wobrazowki, bjeztoho zo byšće Firefox wopušćił. - -## Header - -buttonSettings = - .title = Nastajenja -buttonSignIn = - .title = Přizjewić -screenshotsLogo = - .title = Startowa strona Screenshots -bannerSignIn = Přizjewće so abo registrujće so, zo byšće přez graty přistup na waše fota wobrazowki měł a składujće swoje fawority na přeco. -bannerUpsell = { gScreenshotsDescription } Wobstarajće so Firefox nětko -shutdownWarning = Składowane fota wobrazowki bórze spadnu. Wot junija Screenshots žadyn składowak online njeposkići. Chceće fota wobrazowki ze swojeje biblioteki wobchować? Sćehńće je do swojeho ličaka. -shutdownPageTitle = Screenshots so změni -shutdownPageDescription = Wot junija Screenshots hižo składowak only njeposkići. Chceće fota wobrazowki ze swojeje biblioteki wobchować? Sćehńće fota wobrazowki jedne po jednym abo po skupinach. Dźakujemy so za wužiwanje tuteje funkcije a wodajće prošu njepřijomnosće. -shutdownPageContinue = Nadźijamy so, zo Screenshots dale wužiwaće, zo byšće fota wobrazowki wutworił, kopěrował a sćahnył. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Što je nowe w Firefox Screenshots? -onboardingPromoMessage = Přizjewće so z kontom Firefox pola Screenshots a čińće wjace: -onboardingPromoMessageListItem1 = Mějće přistup na swoju biblioteku na wšěch swojich gratach -onboardingPromoMessageListItem2 = Składujće swoje najlubše fota wobrazowki na přeco -onboardingPromoDismissButton = Zaćisnyć - .title = Zaćisnyć -onboardingPromoSigninButton = Přizjewić - .title = Přizjewić - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Wuměnjenja -footerLinkPrivacy = Zdźělenka priwatnosće -footerReportShot = Tute foto wobrazowki zdźělić - .title = Tute foto wobrazowki znjewužiwanja, spama abo druhich problemow dla zdźělić -footerLinkFaqs = Huste prašenja -footerLinkDMCA = Zranjenje duchowneho swójstwa zdźělić -footerLinkDiscourse = Waše měnjenje prajić -footerLinkRemoveAllData = Wšě daty wotstronić - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } so wutworja -creatingPageTitleDefault = strona -creatingPageWaitMessage = Waše foto wobrazowki so składuje… - -## Home page - -homePageDescription = - .content = Intuitiwne fota wobrazowki činjene direktnje we wobhladowaka. Čińće, składujće a dźělće fota wobrazowki, hdyž web z Firefox přehladujeće. -homePageButtonMyShots = K mojim fotam wobrazowki -homePageTeaser = Bórze k dispoziciji... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Darmotne sćehnjenje -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Kak Firefox Screenshots funguje -homePageGetStartedTitle = Prěnje kroki -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Wubjerće symbol Screenshots z menija akcijow strony w adresowym polu, a meni Screenshots zjewi so horjeka we woknje wobhladowaka. -homePageCaptureRegion = Wobłuk fotografować -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klikńće a ćehńće, zo byšće wobłuk wubrał, kotryž chceće natočić. Abo stajće prosće kursor nad tym a klikńće - Screenshots budźe wobłuk za was wuběrać. Spodoba so wam, štož widźiće? Wubjerće „Składować“ za přistup na swoje foto wobrazowki online abo tłóčatko ze šipkom dele, zo byšće jo na swój ličak sćahnył. -homePageCapturePage = Stronu fotografować -homePageCapturePageDescription = Wužiwajće tłóčatka horjeka naprawo, zo byšće cyłe strony fotografował. Tłóčatko "Wobłuk fotografować" tón wobłuk zapřijima, kotryž móžeće bjez kulenje strony widźeć a tłóčatko "Stronu fotografować" składuje cyłu stronu. -homePageDownloadCopy = Sćahnyć abo kopěrować -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Wutworće swoje najlěpše foto wobrazowki. Fota wobrazowki wam zmóžnja, waš wuběr sćahnyć abo jón direktnje do wašeho mjezyskłada kopěrować. -homePageLegalLink = Prawniske -homePagePrivacyLink = Priwatnosć -homePageTermsLink = Wuměnjenja -homePageCookiesLink = Placki - -## Leave Screenshots page - -leavePageRemoveAllData = Wšě daty wotstronić -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Dyrbiće Firefox Screenshots instalować abo so pola konta Firefox přizjewić, zo byšće swoje konto zhašał -leavePageErrorGeneric = Zmylk je wustupił -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = To wšě waše daty Firefox Screenshots na přeco zhaša. -leavePageButtonProceed = Pokročować -leavePageButtonCancel = Přetorhnyć -leavePageDeleted = Wšě waše fota wobrazowki su so zhašeli! - -## Not Found page - -notFoundPageTitle = Strona njeje so namakała -notFoundPageIntro = Hopla. -notFoundPageDescription = Strona njeje so namakała. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Foto wobrazowki: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Zmylk při spadnjenju -shotPageAlertErrorDeletingShot = Zmylk při hašenju fota wobrazowki -shotPageAlertErrorUpdatingTitle = Zmylk při składowanju titula -shotPageConfirmDelete = Chceće tute foto wobrazowki woprawdźe na přeco zhašeć? -shotPageShareButton = - .title = Dźělić -shotPageCopyButton = - .title = Wobraz do mjezyskłada kopěrować -shotPageCopyActionLabel = Kopěrować -shotPageCopied = Kopěrowany -shotPageShareFacebook = - .title = Na Facebooku dźělić -shotPageShareTwitter = - .title = Na Twitter dźělić -shotPageSharePinterest = - .title = Na Pinterest dźělić -shotPageShareEmail = - .title = Wotkaz přez e-mejl dźělić -shotPageShareLink = Wutworće wotkaz, zo byšće tute foto wobrazowki dźělił: -shotPagePrivacyMessage = Kóždy z tutym wotkazom móže sej tute foto wobrazowki wobhladać. -shotPageCopyImageText = - .label = Wobrazowy tekst kopěrować -shotPageConfirmDeletion = Chceće tute foto wobrazowki woprawdźe na přeco zhašeć? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Jeli ničo nječiniće, so tute foto wobrazowki na přeco zhaša . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = wobnowić hač do { $date } -shotPageExpiredMessage = Tute foto wobrazowki je spadnjene. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Tu je strona, z kotrejež je so prěnjotnje wutworiło: -shotPageDeleteButton = - .title = Tute foto wobrazowki zhašeć -shotPageDownloadShot = - .title = Sćahnyć -shotPageEditButton = - .title = Tutón wobraz wobdźěłać -shotPagefavoriteButton = - .title = Tute foto wobrazowki jako faworit woznamjenić -shotPageBackToHomeButton = - .title = Startowa strona -shotPageAllShotsButton = - .title = Wšě fota wobrazowki -shotPageScreenshotsDescriptionServerless = Fota wobrazowki lochko wutworjene. Wutworće a sćehńće fota wobrazowki, bjeztoho zo byšće Firefox wopušćił. -shotPageDMCAMessage = Tute foto wobrazowki dla prawow awtorstwa třećich hižo k dispoziciji njeje. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Dalše informacije přez e-mejl na { $dmca } dóstanjeće. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Jeli waše fota wobrazowki wjacorym narokam podleža, móžemy wašemu přistupej na Firefox Screenshots zadźěwać. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Prošu podajće URL tutoho fota wobrazowki w swojej e-mejlce: { $url } -shotPageKeepFor = Kak dołho ma so tute foto wobrazowki chować? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Čas wubrać -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Na přeco ∞ -shotPageKeepTenMinutes = 10 mjeńšin -shotPageKeepOneHour = 1 hodźina -shotPageKeepOneDay = 1 dźeń -shotPageKeepOneWeek = 1 tydźeń -shotPageKeepTwoWeeks = 2 njedźeli -shotPageKeepOneMonth = 1 měsac -shotPageSaveExpiration = składować -shotPageCancelExpiration = přetorhnyć -shotPageDoesNotExpire = njespadnje -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = spadnje -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = spadnjeny -timeDiffJustNow = runje -timeDiffMinutesAgo = - { $number -> - [one] před 1 mjeńšinu - [two] před { $number } mjeńšinomaj - [few] před { $number } mjeńšinami - *[other] před { $number } mjeńšinami - } -timeDiffHoursAgo = - { $number -> - [one] před 1 hodźinu - [two] před { $number } hodźinomaj - [few] před { $number } hodźinami - *[other] před { $number } hodźinami - } -timeDiffDaysAgo = - { $number -> - [one] wčera - [two] před { $number } dnjomaj - [few] před { $number } dnjemi - *[other] před { $number } dnjemi - } -timeDiffFutureSeconds = za mało sekundow -timeDiffFutureMinutes = - { $number -> - [one] za 1 mjeńšinu - [two] za { $number } mjeńšinje - [few] za { $number } mjeńšiny - *[other] za { $number } mjeńšin - } -timeDiffFutureHours = - { $number -> - [one] za 1 hodźinu - [two] za { $number } hodźinje - [few] za { $number } hodźiny - *[other] za { $number } hodźin - } -timeDiffFutureDays = - { $number -> - [one] jutře - [two] za { $number } dnjej - [few] za { $number } dny - *[other] za { $number } dnjow - } -errorThirdPartyCookiesEnabled = Jeli sće tute foto wobrazowki činił a njemóžeće jo zhašeć, dyrbiće nachwilu placki třećich poskićowarjow w nastajenjach swojeho wobhladowaka zmóžnić. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Kedźbu! -promoMessage = Z nowymi wobdźěłowanskimi nastrojemi móžeće w swojim foće wobrazowki tekst wutřihać, wuzběhnyć a samo přidać. -promoLink = Wupruwujće je! -promoCloseButton = - .title = Zdźělenku začinić - -## Annotations - -annotationPenButton = - .title = Pisak -annotationHighlighterButton = - .title = Tekstowy marker -annotationUndoButton = - .title = Cofnyć -annotationRedoButton = - .title = Wospjetować -annotationTextButton = - .title = Tekst přidać -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Wróćo stajić -annotationCropButton = - .title = Wutřihać -annotationSaveEditButton = Składować - .title = Změnu składować -annotationCancelEditButton = Přetorhnyć - .title = Wobdźěłanje přetorhnyć -annotationCropConfirmButton = Wobkrućić - .title = Wuběr wobkrućić -annotationCropCancelButton = Přetorhnyć - .title = Wuběr přetorhnyć -annotationColorWhite = - .title = Běły -annotationColorBlack = - .title = Čorny -annotationColorRed = - .title = Čerwjeny -annotationColorGreen = - .title = Zeleny -annotationColorBlue = - .title = Módry -annotationColorYellow = - .title = Žołty -annotationColorPurple = - .title = Purpurny -annotationColorSeaGreen = - .title = Mórskozeleny -annotationColorGrey = - .title = Šěry -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tekstowa wulkosć -# Values shown in text size selection dropdown -textSizeSmall = Mały -textSizeMedium = Srjedźny -textSizeLarge = Wulki -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Wobkrućić - .title = Wobkrućić -textToolCancelButton = Přetorhnyć - .title = Přetorhnyć -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Witaj - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Něšto je so nimokuliło -copyImageErrorMessage = Njeje móžno, waše foto wobrazowki do mjezyskłada kopěrować. - -## Settings Page - -settingsDisconnectButton = Zwisk dźělić - .title = Zwisk dźělić -settingsGuestAccountMessage = Hóstne konto -settingsSignInButton = Přizjewić - .title = Přizjewić -SettingsPageHeader = Nastajenja Firefox Screenshots -settingsFirefoxAccountSubHeader = Konto Firefox -settingsClosePreferences = - .title = Nastajenja začinić -settingsFxaDisconnectAlertMessage = Chceće tutón grat woprawdźe ze swojeho konta Firefox dźělić? -settingsFxaDisconnectDescription = Jeli so wozjwjeće, dyrbiće so znowa přizjewić, zo byšće přistup na swoje fota wobrazowki wróćo dóstał. -settingsFxaConnectDescription = Móžeće so přizjewić, zo byšće přistup na swoje fota wobrazowki přez graty měł. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Zmylk při hašenju fota wobrazowki: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Moje fota wobrazowki: Za { $searchTerm } pytać -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Zmylk při zwobraznjenju strony: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Moje fota wobrazowki přepytać -shotIndexPageNoShotsMessage = Žane składowane fota wobrazowki. -shotIndexPageNoShotsInvitation = Pójće, wutworće někajke. -shotIndexPageLookingForShots = Pyta so za wašimi fotami wobrazowki... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Njemóžemy fota wobrazowki namakać, kotrež wašemu pytanju wotpowěduja. -shotIndexPageMyShotsButton = - .title = Moje fota wobrazowki -shotIndexPageClearSearchButton = - .title = Pytanje zhašeć -shotIndexPageConfirmShotDelete = Tute foto wobrazowki zhašeć? -shotIndexPagePreviousPage = - .title = Předchadna strona -shotIndexPageNextPage = - .title = Přichodna strona -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = To woblubowane foto wobrazowki njeje a spadnje -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = To je woblubowane foto wobrazowki a njespadnje -shotIndexSyncedShot = - .title = Foto wobrazowki z druheho grata -shotIndexAlertErrorFavoriteShot = Zmylk při aktualizowanju statusa najlubšeho fota wobrazowki - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Chceće tute foto wobrazowki woprawdźe zhašeć? -shotDeleteCancel = Přetorhnyć - .title = Přetorhnyć -shotDeleteConfirm = Zhašeć - .title = Zhašeć - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Zo byšće eksportował, wužiwajće Dataja > Stronu składować jako… a namakaće swoje fota wobrazowki w rjadowaku { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metriki Firefox Screenshots -metricsPageTotalsQueryTitle = Dohromady -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Přehlad Screenshots -metricsPageTotalsQueryDevices = Zregistrowane graty w cyłku -metricsPageTotalsQueryActiveShots = Aktiwne fota wobrazowki -metricsPageTotalsQueryExpiredShots = Wotběžało (da so wšak wobnowić) -metricsPageTotalsQueryExpiredDeletedShots = Wotběžało (zhašane) -metricsPageShotsQueryTitle = Fota wobrazowki na dźeń -metricsPageShotsQueryDescription = Ličba fotow wobrazowki wutworjenych kóždy dźeń (za zańdźene 30 dnjow) -metricsPageShotsQueryCount = Ličba fotow wobrazowki -metricsPageShotsQueryDay = Dźeń -metricsPageUsersQueryTitle = Wužiwarjo po dnju -metricsPageUsersQueryDescription = Ličba wužiwarjow, kotřiž su znamjeńša jedne foto wobrazowki wutworili (zańdźene 30 dnjow) -metricsPageUsersQueryCount = Ličba wužiwarjow -metricsPageUsersQueryDay = Dźeń -metricsPageUserShotsQueryTitle = Ličba fotow wobrazowki na wužiwarja -metricsPageUserShotsQueryDescription = Ličba wužiwarjow, kotžiž maja w cyłku wokoło N fotow wobrazowki -metricsPageUserShotsQueryCount = Ličba wužiwarjow -metricsPageUserShotsQueryShots = Přibližna ličba aktiwnych (njespadnjenych) fotow wobrazowki -metricsPageRetentionQueryTitle = Dalewužiwanje po tydźenju -metricsPageRetentionQueryDescription = Ličba dnjow wot prěnjeho fota wobrazowki hač do najnowšeho wužiwarja zeskupjena po spočatnym tydźenju -metricsPageRetentionQueryUsers = Ličba wužiwarjow -metricsPageRetentionQueryDays = Dny wot prěnjeho hač do najnowšeho fota wobrazowki wužiwarja -metricsPageRetentionQueryFirstWeek = Tydźeń, hdyž wužiwar je prěnje foto wobrazowki wutworił -metricsPageTotalRetentionQueryTitle = Dalewužiwanje w cyłku -metricsPageTotalRetentionQueryDescription = Doba, w kotrejž su wužiwarjo fota wobrazowki wutworili, zeskupjene po tydźenju -metricsPageTotalRetentionQueryUsers = Ličba wužiwarjow -metricsPageTotalRetentionQueryDays = Dny, hdyž je wužiwar fota wobrazowki wutworił -metricsPageVersionQueryTitle = Wersija přidatka -metricsPageVersionQueryDescription = Wersija přidatka, kotraž je so za zańdźene 14 dnjow za přizjewjenje wužiwała -metricsPageVersionQueryUsers = Ličba přizjewjenych wužiwarjow -metricsPageVersionQueryVersion = Wersija přidatka -metricsPageVersionQueryLastSeen = Dźeń -metricsPageHeader = Metriki -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Wutworjene: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (čas datoweje banki: { $time }ms) diff --git a/locales/hu/server.ftl b/locales/hu/server.ftl deleted file mode 100644 index 7d65108456..0000000000 --- a/locales/hu/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Az Ön képei -gHomeLink = Kezdőlap -gNoShots = - .alt = Nem találhatóak képek -gScreenshotsDescriptionServerless = Képernyőképek, egyszerűen. Rögzítsen és töltsön le képernyőképeket a Firefox elhagyása nélkül. - -## Header - -buttonSettings = - .title = Beállítások -buttonSignIn = - .title = Bejelentkezés -screenshotsLogo = - .title = Screenshots kezdőlap -bannerSignIn = Jelentkezzen be vagy regisztráljon hogy elérje a képeit az összes eszközén, és végleg elmentse a kedvenceit. -bannerUpsell = { gScreenshotsDescription } Szerezze be a Firefoxot most -shutdownWarning = A mentett képernyőképek hamarosan lejárnak. Júniustól kezdődően, a Screenshots már nem fog online tárhelyet kínálni. Meg akarja tartani a képernyőképeit? Mentse le azokat a számítógépére. -shutdownPageTitle = A Screenshots megváltozik -shutdownPageDescription = Júniustól kezdve a Screenshots nem kínál online tárhelyet. Szeretne képeket megtartani a könyvtárából? Töltse le a képeket egyesével vagy csomagban. Köszönjük hogy használta a funkciót, és sajnáljuk a kellemetlenségeket. -shutdownPageContinue = Reméljük, hogy továbbra is használni fogja a Screenshots kiegészítőt a képernyőképek készítéséhez, másolásához és letöltéséhez. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Mik az újdonságok a Firefox Screenshotsban? -onboardingPromoMessage = Jelentkezzen be most a Screenshotsba egy Firefox fiókkal, és tegyen többet: -onboardingPromoMessageListItem1 = Érje el könyvtárát az összes eszközén -onboardingPromoMessageListItem2 = Örökre tárolja el a kedvenc képeit -onboardingPromoDismissButton = Eltüntetés - .title = Eltüntetés -onboardingPromoSigninButton = Bejelentkezés - .title = Bejelentkezés - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Feltételek -footerLinkPrivacy = Adatvédelmi nyilatkozat -footerReportShot = Kép jelentése - .title = A kép bejelentése visszaélés, spam vagy más problémák miatt -footerLinkFaqs = GYIK -footerLinkDMCA = Szellemi tulajdont érintő jogsértés jelentése -footerLinkDiscourse = Adjon visszajelzést -footerLinkRemoveAllData = Minden adat törlése - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Létrehozás: { $title } -creatingPageTitleDefault = oldal -creatingPageWaitMessage = Képernyőkép mentése… - -## Home page - -homePageDescription = - .content = Intuitív képernyőképek közvetlenül a böngészőjében. Készítsen, mentsen és osszon meg képernyőképeket, miközben böngészi a Webet a Firefoxszal. -homePageButtonMyShots = Ugrás a képekhez -homePageTeaser = Hamarosan elérhető... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Ingyenes letöltés -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Hogyan működik a Firefox képernyőképek -homePageGetStartedTitle = Kezdő lépések -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Válassza a Screenshots ikont a lapműveletek menüből a címsávban, és megjelenik a Screenshots menü a böngészőablak tetején. -homePageCaptureRegion = Terület befogása -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Kattintson és húzza a befogandó terület kiválasztásához. Vagy csak vigye fölé és kattintson – a Screenshots kijelöli a területet Ön helyett. Tetszik amit lát? Válassza a Mentést, hogy online is elérje a képernyőképeit, vagy a lefelé mutató nyilat a számítógépre letöltéshez. -homePageCapturePage = Lap befogása -homePageCapturePageDescription = Használja a jobb felső sarokban lévő gombokat a teljes lapok befogásához. A Láthatóak mentése gomb a görgetés nélkül látható területet fogja be, a Teljes lap mentése pedig mindent, ami a lapon található. -homePageDownloadCopy = Letöltés vagy másolása -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Vegye a legjobb képet. A Screenshots lehetővé teszi, hogy letöltse a kijelölést, vagy másolja közvetlenül a vágólapra. -homePageLegalLink = Jogi információk -homePagePrivacyLink = Adatvédelem -homePageTermsLink = Feltételek -homePageCookiesLink = Sütik - -## Leave Screenshots page - -leavePageRemoveAllData = Összes adat eltávolítása -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = A fiókja törléséhez telepítve kell legyen a Firefox Screenshots, vagy be kell jelentkeznie a Firefox fiókjába. -leavePageErrorGeneric = Hiba történt -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Ez véglegesen törli a Firefox képernyőképek összes adatát. -leavePageButtonProceed = Folytatás -leavePageButtonCancel = Mégse -leavePageDeleted = Minden képernyőkép törlésre került! - -## Not Found page - -notFoundPageTitle = Az oldal nem található -notFoundPageIntro = Hoppá! -notFoundPageDescription = Az oldal nem található. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Képernyőkép: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Hiba a lejárat mentésekor -shotPageAlertErrorDeletingShot = Hiba a kép törlésekor -shotPageAlertErrorUpdatingTitle = Hiba a cím mentésekor -shotPageConfirmDelete = Biztos, hogy véglegesen törölni szeretné ezt a képet? -shotPageShareButton = - .title = Megosztás -shotPageCopyButton = - .title = Kép vágólapra másolása -shotPageCopyActionLabel = Másolás -shotPageCopied = Átmásolva -shotPageShareFacebook = - .title = Megosztás Facebookon -shotPageShareTwitter = - .title = Megosztás Twitteren -shotPageSharePinterest = - .title = Megosztás Pinteresten -shotPageShareEmail = - .title = Hivatkozás megosztása e-mailben -shotPageShareLink = Megosztható hivatkozás kérése ehhez a képhez: -shotPagePrivacyMessage = Bárki megnézheti a képet, aki ismeri a hivatkozást. -shotPageCopyImageText = - .label = Kép szövegének másolása -shotPageConfirmDeletion = Biztos, hogy véglegesen törölni szeretné ezt a képet? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ha nem tesz semmit, a kép törlésre kerül . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = visszaállítás eddig: { $date } -shotPageExpiredMessage = Ez a képernyőkép lejárt. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Itt van az oldal, amelyről eredetileg készült: -shotPageDeleteButton = - .title = A képernyőkép törlése -shotPageDownloadShot = - .title = Letöltés -shotPageEditButton = - .title = Kép szerkesztése -shotPagefavoriteButton = - .title = A kép beállítása kedvencként -shotPageBackToHomeButton = - .title = Kezdőlap -shotPageAllShotsButton = - .title = Összes kép -shotPageScreenshotsDescriptionServerless = Képernyőképek, egyszerűen. Rögzítsen és töltsön le képernyőképeket a Firefox elhagyása nélkül. -shotPageDMCAMessage = A kép egy harmadik fél szerzői jogi követelése miatt már nem érhető el. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = További információ kéréséhez küldjön egy e-mailt ide: { $dmca } -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ha képeit több követelés is érinti, akkor megvonhatjuk a Firefox Screenshots hozzáférését. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Adja meg a kép URL-t az e-mailjében: { $url } -shotPageKeepFor = Meddig legyen ez a képernyőkép megtartva? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Időpont választása -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Végtelenségig ∞ -shotPageKeepTenMinutes = 10 percig -shotPageKeepOneHour = 1 óráig -shotPageKeepOneDay = 1 napig -shotPageKeepOneWeek = 1 hétig -shotPageKeepTwoWeeks = 2 hétig -shotPageKeepOneMonth = 1 hónap -shotPageSaveExpiration = mentés -shotPageCancelExpiration = mégse -shotPageDoesNotExpire = nem jár le -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = jár le -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = lejárt -timeDiffJustNow = épp most -timeDiffMinutesAgo = - { $number -> - [one] 1 perce - *[other] { $number } perce - } -timeDiffHoursAgo = - { $number -> - [one] 1 órája - *[other] { $number } órája - } -timeDiffDaysAgo = - { $number -> - [one] tegnap - *[other] { $number } napja - } -timeDiffFutureSeconds = néhány másodperc múlva -timeDiffFutureMinutes = - { $number -> - [one] 1 percen belül - *[other] { $number } percen belül - } -timeDiffFutureHours = - { $number -> - [one] 1 órán belül - *[other] { $number } órán belül - } -timeDiffFutureDays = - { $number -> - [one] holnap - *[other] { $number } nap múlva - } -errorThirdPartyCookiesEnabled = Ha Ön készítette ezt a képet, és nem tudja törölni, akkor lehet hogy ideiglenesen engedélyeznie kell a harmadik féltől származó sütiket a böngésző beállításaiban. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Figyelem! -promoMessage = Frissített szerkesztőeszközök, melyekkel vághat, kiemelhet, és szöveget adhat hozzá a képernyőképhez. -promoLink = Próbálja ki őket -promoCloseButton = - .title = Értesítés bezárása - -## Annotations - -annotationPenButton = - .title = Toll -annotationHighlighterButton = - .title = Kiemelő -annotationUndoButton = - .title = Visszavonás -annotationRedoButton = - .title = Mégis -annotationTextButton = - .title = Szöveg hozzáadása -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Törlés -annotationCropButton = - .title = Körülvágás -annotationSaveEditButton = Mentés - .title = Szerkesztés mentése -annotationCancelEditButton = Mégse - .title = Szerkesztés elvetése -annotationCropConfirmButton = Megerősítés - .title = Kiválasztás megerősítése -annotationCropCancelButton = Mégse - .title = Kiválasztás megszakítása -annotationColorWhite = - .title = Fehér -annotationColorBlack = - .title = Fekete -annotationColorRed = - .title = Vörös -annotationColorGreen = - .title = Zöld -annotationColorBlue = - .title = Kék -annotationColorYellow = - .title = Sárga -annotationColorPurple = - .title = Lila -annotationColorSeaGreen = - .title = Tengerzöld -annotationColorGrey = - .title = Szürke -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Betűméret -# Values shown in text size selection dropdown -textSizeSmall = Kicsi -textSizeMedium = Közepes -textSizeLarge = Nagy -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Megerősítés - .title = Megerősítés -textToolCancelButton = Mégse - .title = Mégse -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Helló - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Valami hiba történt -copyImageErrorMessage = Nem másolható a képernyőkép a vágólapra. - -## Settings Page - -settingsDisconnectButton = Kapcsolat bontása - .title = Kapcsolat bontása -settingsGuestAccountMessage = Vendégfiók -settingsSignInButton = Bejelentkezés - .title = Bejelentkezés -SettingsPageHeader = A Firefox Screenshots beállításai -settingsFirefoxAccountSubHeader = Firefox fiók -settingsClosePreferences = - .title = Beállítások bezárása -settingsFxaDisconnectAlertMessage = Biztosan le akarja választani ezt az eszközt a Firefox fiókjától? -settingsFxaDisconnectDescription = Ha kijelentkezik, akkor újra be kell jelentkeznie, hogy elérje a képernyőképeit. -settingsFxaConnectDescription = Bejelentkezhet, hogy hozzáférjen a képernyőképeihez az összes eszközén. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Hiba a képernyőkép törlésekor: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Saját képek: keresés erre: { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Hiba az oldal renderelésekor: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Saját képek keresése -shotIndexPageNoShotsMessage = Nincsenek mentett képek. -shotIndexPageNoShotsInvitation = Hajrá, készítsen néhányat. -shotIndexPageLookingForShots = Képek keresése… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Nem található a keresésnek megfelelő kép. -shotIndexPageMyShotsButton = - .title = Az Ön képei -shotIndexPageClearSearchButton = - .title = Keresés törlése -shotIndexPageConfirmShotDelete = Törli ezt a képet? -shotIndexPagePreviousPage = - .title = Előző oldal -shotIndexPageNextPage = - .title = Következő oldal -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Ez nem egy kedvenc kép, és el fog évülni -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Egy egy kedvenc képernyőkép, és nem jár le -shotIndexSyncedShot = - .title = Másik eszközön készült képernyőkép -shotIndexAlertErrorFavoriteShot = Hiba a kedvenc képernyőkép állapotának frissítésekor - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Biztos, hogy törölni szeretné ezt a képet? -shotDeleteCancel = Mégse - .title = Mégse -shotDeleteConfirm = Törlés - .title = Törlés - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Exportálás: használja a Fájl > Oldal mentése másként… lehetőséget, és a képernyőképeket a { $folder } mappában találja - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots metrikák -metricsPageTotalsQueryTitle = Összesen -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = A Screenshots áttekintése -metricsPageTotalsQueryDevices = Összes regisztrált eszköz -metricsPageTotalsQueryActiveShots = Aktív képek -metricsPageTotalsQueryExpiredShots = Lejárt (de helyreállítható) -metricsPageTotalsQueryExpiredDeletedShots = Lejárt (és törölt) -metricsPageShotsQueryTitle = Képek napok szerint -metricsPageShotsQueryDescription = Az egyes napokon készült képek száma (az elmúlt 30 napban) -metricsPageShotsQueryCount = Képek száma -metricsPageShotsQueryDay = Nap -metricsPageUsersQueryTitle = Felhasználók napi bontásban -metricsPageUsersQueryDescription = A felhasználók száma, akik legalább egy képet csináltak, napok szerint (elmúlt 30 nap) -metricsPageUsersQueryCount = Felhasználók száma -metricsPageUsersQueryDay = Nap -metricsPageUserShotsQueryTitle = Képek száma felhasználónként -metricsPageUserShotsQueryDescription = A felhasználók száma, akiknek összesen N képük van -metricsPageUserShotsQueryCount = Felhasználók száma -metricsPageUserShotsQueryShots = Az aktív (nem lejárt) képek közelítő száma -metricsPageRetentionQueryTitle = Megtartás hetenkénti bontásban -metricsPageRetentionQueryDescription = A napok száma a felhasználó első képétől a legfrissebb képig, kezdőhetek szerint -metricsPageRetentionQueryUsers = Felhasználók száma -metricsPageRetentionQueryDays = A napok száma a felhasználó első képétől a legfrissebbig -metricsPageRetentionQueryFirstWeek = A hét, amikor a felhasználó elkészítette az első képet -metricsPageTotalRetentionQueryTitle = Teljes megtartás -metricsPageTotalRetentionQueryDescription = A felhasználók mennyi ideje készítenek képeket, hetenkénti bontásban -metricsPageTotalRetentionQueryUsers = Felhasználók száma -metricsPageTotalRetentionQueryDays = A napok, amikor a felhasználók képeket készítettek -metricsPageVersionQueryTitle = Kiegészítő verziója -metricsPageVersionQueryDescription = A bejelentkezéskor használt kiegészítő verziója, az elmúlt 14 napban -metricsPageVersionQueryUsers = Bejelentkező felhasználók száma -metricsPageVersionQueryVersion = Kiegészítő verziója -metricsPageVersionQueryLastSeen = Nap -metricsPageHeader = Metrikák -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Létrehozva: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (adatbázis idő: { $time } ms) diff --git a/locales/hy-AM/server.ftl b/locales/hy-AM/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/hy-AM/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/ia/server.ftl b/locales/ia/server.ftl deleted file mode 100644 index 4525a36b07..0000000000 --- a/locales/ia/server.ftl +++ /dev/null @@ -1,396 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mi instantaneos -gHomeLink = Initio -gNoShots = - .alt = Nulle instantaneos trovate -gScreenshotsDescriptionServerless = Instantaneos rendite simple. Captura e discarga instantaneos de schermo sin lassar Firefox. - -## Header - -buttonSettings = - .title = Parametros -buttonSignIn = - .title = Apertura de session -screenshotsLogo = - .title = Pagina initial de Screenshots -bannerSignIn = Authentica te o registra te pro acceder tu instantaneos trans apparatos e salvar sempre tu favoritos. -bannerUpsell = { gScreenshotsDescription } Prende Firefox ora -shutdownWarning = Le instantaneos salvate expirara tosto. A initiar de junio, Screenshots non offerera plus magazinage online. Vole tu retener tu capturas ex tu bibliotheca? Discarga los in tu computator. -shutdownPageTitle = Screenshots cambia -shutdownPageContinue = Nos spera que vos continuara a usar Screenshots pro capturar, copiar e discargar instantaneos. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Que novas con Firefox Screenshots? -onboardingPromoMessage = Ora authentica te a Screenshots con un conto de Firefox e face plus: -onboardingPromoMessageListItem1 = Accede a tu bibliotheca sur tote tu apparatos -onboardingPromoMessageListItem2 = Reserva tu instantaneos favorite per sempre -onboardingPromoDismissButton = Dimitter - .title = Dimitter -onboardingPromoSigninButton = Authenticar se - .title = Authenticar se - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Terminos -footerLinkPrivacy = Notification de confidentialitate -footerReportShot = Reporto de instantaneo - .title = Reportar iste instantaneo pro abuso, spam o altere problemas -footerLinkFaqs = Questiones frequente -footerLinkDMCA = Denunciar un violation de proprietate intellectual -footerLinkDiscourse = Da tu opinion -footerLinkRemoveAllData = Remover tote le datos - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creante { $title } -creatingPageTitleDefault = pagina -creatingPageWaitMessage = Salvante le instantaneo… - -## Home page - -homePageDescription = - .content = Instantaneos intuitive es prendite intra tu navigator. Captura, salva e comparti le instantaneos de tu schermo durante que tu naviga le web usante Firefox. -homePageButtonMyShots = Ir a mi instantaneos -homePageTeaser = Veniente tosto… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Discargamento gratuito -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Como Firefox Screenshots functiona -homePageGetStartedTitle = Comenciar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Elige le icone de instantaneos ex le menu de actiones de pagina in le barra de adresses e le menu del instantaneos apparera al culmine de tu fenestra del navigator. -homePageCaptureRegion = Capturar un area de schermo -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Clicca e trahe pro seliger le area que tu vole capturar. O solo sur-vola e clicca - Screenshots eligera le area pro te. TU ama lo que tu vide? Elige Salvar pro acceder a tu instantaneos online o le flecha-a-basso pro lo discargar sur tu computator. -homePageCapturePage = Capturar un pagina -homePageCapturePageDescription = Usar le buttones in alto a dextra pro capturar le paginas integre. Le button Salvar lo visibile, capturara le area que tu pote vider sin rolar, e Salvar pagina integre, capturara tote le pagina. -homePageDownloadCopy = Discargar o copiar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Prende tu melior captura. Screenshots te permitte de discargar tu selection o de copiar lo in tu area de transferentia. -homePageLegalLink = Notas legal -homePagePrivacyLink = Confidentialitate -homePageTermsLink = Terminos -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Remover tote le datos -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Tu debe haber Firefox Screenshots installate o esser authenticate in un conto de Firefox pro deler tu proprie conto -leavePageErrorGeneric = Un error occurreva -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Isto cancellara permanentemente tote le datos de tu Firefox Screenshots. -leavePageButtonProceed = Proceder -leavePageButtonCancel = Cancellar -leavePageDeleted = Tote tu instantaneos de schermo cancellate! - -## Not Found page - -notFoundPageTitle = Pagina non trovate -notFoundPageIntro = Oops. -notFoundPageDescription = Pagina non trovate. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Instantaneo de schermo: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Error al salvamento del expiration -shotPageAlertErrorDeletingShot = Error a deler le instantaneo -shotPageAlertErrorUpdatingTitle = Error a salvar le titulo -shotPageConfirmDelete = Desira tu vermente deler permanentemente iste instantaneo? -shotPageShareButton = - .title = Compartir -shotPageCopyButton = - .title = Copiate imagine al area de transferentia! -shotPageCopyActionLabel = Copiar -shotPageCopied = Copiate -shotPageShareFacebook = - .title = Compartir in Facebook -shotPageShareTwitter = - .title = Compartir in Twitter -shotPageSharePinterest = - .title = Compartir sur Pinterest -shotPageShareEmail = - .title = Comparti un ligamine via email -shotPageShareLink = Obtene un ligamine compartibile a iste instantaneo: -shotPagePrivacyMessage = Totes pote vider iste instantaneo per iste ligamine. -shotPageCopyImageText = - .label = Copiar le texto del imagine -shotPageConfirmDeletion = Desira tu vermente deler iste captura permanentemente? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Si tu face nihil, iste instantaneo essera permanentemente delite . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restabilir usque { $date } -shotPageExpiredMessage = Iste instantaneo expirava -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Ecce le pagina ex le qual illo esseva originalmente create: -shotPageDeleteButton = - .title = Dele iste instantaneo -shotPageDownloadShot = - .title = Discargar -shotPageEditButton = - .title = Rediger iste imagine -shotPagefavoriteButton = - .title = Adder iste instantaneo al favoritos -shotPageBackToHomeButton = - .title = Pagina initial -shotPageAllShotsButton = - .title = Tote le instantaneos -shotPageScreenshotsDescriptionServerless = Instantaneos rendite simple. Captura e discarga instantaneos de schermo sin lassar Firefox. -shotPageDMCAMessage = Iste instantaneo non es plus disponibile per un reclamation de proprietate intellectual de tertie parte. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Per favor invia un email a { $dmca } pro querer altere informationes. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Si tu Instantaneos es subjecte a trop reclamationes, nos pote revocar tu accesso a Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Per favor include le URL del iste instantaneo in tu email: { $url } -shotPageKeepFor = Quante tempore debe ser reservate iste instantaneo? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Eliger le tempore -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinitemente ∞ -shotPageKeepTenMinutes = 10 minutas -shotPageKeepOneHour = 1 hora -shotPageKeepOneDay = 1 die -shotPageKeepOneWeek = 1 septimana -shotPageKeepTwoWeeks = 2 septimanas -shotPageKeepOneMonth = 1 mense -shotPageSaveExpiration = Salvar -shotPageCancelExpiration = Cancellar -shotPageDoesNotExpire = non expira -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expira a -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = expirate de -timeDiffJustNow = justo ora -timeDiffMinutesAgo = - { $number -> - [one] 1 minuta retro - *[other] { $number } minutas retro - } -timeDiffHoursAgo = - { $number -> - [one] 1 hora retro - *[other] { $number } horas retro - } -timeDiffDaysAgo = - { $number -> - [one] heri - *[other] { $number } dies retro - } -timeDiffFutureSeconds = in poc secundas -timeDiffFutureMinutes = - { $number -> - [one] in 1 minuta - *[other] in { $number } minutas - } -timeDiffFutureHours = - { $number -> - [one] in 1 hora - *[other] in { $number } horas - } -timeDiffFutureDays = - { $number -> - [one] deman - *[other] in { $number } dies - } -errorThirdPartyCookiesEnabled = Si tu ha prendite iste instantaneo e non pote lo deler, tu pote besoniar de activar temporarimente le cookies de tertie partes in le preferentias de tu navigator. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Prende nota! -promoMessage = Le utensiles de edition actual te consenti de retaliar, evidentiar e mesmo adder texto a tu instantaneos -promoLink = Prova los -promoCloseButton = - .title = Clauder notification - -## Annotations - -annotationPenButton = - .title = Penna -annotationHighlighterButton = - .title = Evidentiator -annotationUndoButton = - .title = Disfacer -annotationRedoButton = - .title = Refacer -annotationTextButton = - .title = Adder texto -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Clarar -annotationCropButton = - .title = Reducer -annotationSaveEditButton = Salvar - .title = Salvar le modification -annotationCancelEditButton = Cancellar - .title = Cancellar le redaction -annotationCropConfirmButton = Confirmar - .title = Confirmar le selection -annotationCropCancelButton = Cancellar - .title = Cancellar le selection -annotationColorWhite = - .title = blanc -annotationColorBlack = - .title = Nigre -annotationColorRed = - .title = Rubie -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Blau -annotationColorYellow = - .title = Jalne -annotationColorPurple = - .title = Violette -annotationColorSeaGreen = - .title = Verde mar -annotationColorGrey = - .title = Gris -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Dimension del texto -# Values shown in text size selection dropdown -textSizeSmall = Micre -textSizeMedium = Medie -textSizeLarge = Grande -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirmar - .title = Confirmar -textToolCancelButton = Cancellar - .title = Cancellar -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Holla - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Alco errate eveniva -copyImageErrorMessage = Impossibile copiar tu instantaneo al tabula de transferentia - -## Settings Page - -settingsDisconnectButton = Disconnecter - .title = Disconnecter -settingsGuestAccountMessage = Conto hospite -settingsSignInButton = Authenticar se - .title = Authenticar se -SettingsPageHeader = Configurationes de Firefox Screenshots -settingsFirefoxAccountSubHeader = Conto Firefox -settingsClosePreferences = - .title = Clauder le preferentias -settingsFxaDisconnectAlertMessage = Desira tu vermente disconnecter iste apparato ex tu conto Firefox? -settingsFxaDisconnectDescription = Si tu te disconnecte, pois tu besoniara de authenticar te de novo pro reganiar le accesso a tu instantaneos de schermo. -settingsFxaConnectDescription = Tu pote authenticar te pro acceder a tu instantaneos de schermo trans apparatos differente. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Error delente le instantaneo: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mi Instantaneos: recerca { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Error a generar un pagina: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Recercar mi instantaneos -shotIndexPageNoShotsMessage = Instantaneos non salvate -shotIndexPageNoShotsInvitation = Va, crea los. -shotIndexPageLookingForShots = Recerca de tu instantaneos... -shotIndexPageNoSearchResultsIntro = Hum… -shotIndexPageNoSearchResults = Nos non pote trovar ulle instantaneos que concorda con tu recerca. -shotIndexPageMyShotsButton = - .title = Mi instantaneos -shotIndexPageClearSearchButton = - .title = Clarar le recerca -shotIndexPageConfirmShotDelete = Deler iste instantaneo? -shotIndexPagePreviousPage = - .title = Pagina previe -shotIndexPageNextPage = - .title = Pagina sequente -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Isto non es un instantaneo favorite e expirara -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Isto es un instantaneo favorite e non expira -shotIndexSyncedShot = - .title = Instantaneo capturate sur un altere apparato -shotIndexAlertErrorFavoriteShot = Error durante le actualisation del statos del instantaneos preferite - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Desira tu vermente deler iste instantaneo? -shotDeleteCancel = Cancellar - .title = Cancellar -shotDeleteConfirm = Deler - .title = Deler - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Pro exportar: usa File> Salvar pagina como… e tu trovara tu instantaneos in le plica { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metrica del instantaneos de schermo de Firefox -metricsPageTotalsQueryTitle = Totales -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Un panoramica de Screenshots -metricsPageTotalsQueryDevices = Total de apparatos registrate -metricsPageTotalsQueryActiveShots = Instantaneos active -metricsPageTotalsQueryExpiredShots = Expirate (ma recovrabile) -metricsPageTotalsQueryExpiredDeletedShots = Expirate (e delite) -metricsPageShotsQueryTitle = Instantaneos per die -metricsPageShotsQueryDescription = Numero del instantaneos create cata die (pro le ultime 30 dies) -metricsPageShotsQueryCount = Numero de instantaneos -metricsPageShotsQueryDay = Die -metricsPageUsersQueryTitle = Usatores pro die -metricsPageUsersQueryDescription = Numero de usatores qui creava al minus un instantaneo, per die (ultime 30 dies) -metricsPageUsersQueryCount = Numero de usatores -metricsPageUsersQueryDay = Die -metricsPageUserShotsQueryTitle = Numero de instantaneos per usator -metricsPageUserShotsQueryDescription = Le numero del usatores qui ha circa N total instantaneos -metricsPageUserShotsQueryCount = Numero de usatores -metricsPageUserShotsQueryShots = Numero approximative del instantaneos (non expirate) -metricsPageRetentionQueryTitle = Reservationes per septimana -metricsPageRetentionQueryDescription = Numero de dies ab la prime instantaneo de un usator al plus recente instantaneo, gruppate per initio septimana -metricsPageRetentionQueryUsers = Numero de usatores -metricsPageRetentionQueryDays = Numero de dies ab la prime instantaneo de un usator al plus recente instantaneo -metricsPageRetentionQueryFirstWeek = Septimana que le usator creava le prime instantaneo -metricsPageTotalRetentionQueryTitle = Retention total -metricsPageTotalRetentionQueryDescription = Durata que le usatores creava instantaneos, gruppate per septimana -metricsPageTotalRetentionQueryUsers = Numero de usatores -metricsPageTotalRetentionQueryDays = Dies que le usator creava instantaneos -metricsPageVersionQueryTitle = Version del additivo -metricsPageVersionQueryDescription = Le version del additivo usate durante authentication, in le ultime 14 dies -metricsPageVersionQueryUsers = Numero de usatores connexe -metricsPageVersionQueryVersion = Version del additivo -metricsPageVersionQueryLastSeen = Die -metricsPageHeader = Metrica -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Create le: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (tempore del base de datos: { $time }ms) diff --git a/locales/id/server.ftl b/locales/id/server.ftl deleted file mode 100644 index febf7cdbc2..0000000000 --- a/locales/id/server.ftl +++ /dev/null @@ -1,365 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Cuplikan Saya -gHomeLink = Beranda -gNoShots = - .alt = Tidak ada cuplikan ditemukan -gScreenshotsDescriptionServerless = Screenshots dibuat sederhana. Ambil dan unduh tangkapan layar tanpa meninggalkan Firefox. - -## Header - -buttonSettings = - .title = Setelan -buttonSignIn = - .title = Masuk -screenshotsLogo = - .title = Beranda Screenshots -bannerSignIn = Masuk atau daftar untuk mengakses tangkapan layar lintas peranti dan simpan favorit Anda untuk seterusnya. -bannerUpsell = { gScreenshotsDescription } Dapatkan Firefox sekarang juga -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Apa yang baru dari Firefox Screenshots? -onboardingPromoMessage = Sekarang, masuk ke Screenshots dengan Firefox Account dan lakukan lebih banyak: -onboardingPromoMessageListItem1 = Akses pustaka Anda dari semua perangkat Anda -onboardingPromoMessageListItem2 = Simpan cuplikan favorit Anda selamanya -onboardingPromoDismissButton = Tutup - .title = Tutup -onboardingPromoSigninButton = Masuk - .title = Masuk - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Ketentuan -footerLinkPrivacy = Kebijakan Privasi -footerReportShot = Laporkan Cuplikan Layar - .title = Laporkan cuplikan layar ini karena penyalahgunaan, spam, dan masalah-masalah lainnya -footerLinkFaqs = Pertanyaan Umum -footerLinkDMCA = Laporkan Pelanggaran Hak Cipta -footerLinkDiscourse = Kirim Saran -footerLinkRemoveAllData = Hapus Semua Data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Membuat { $title } -creatingPageTitleDefault = laman -creatingPageWaitMessage = Menyimpan gambar Anda… - -## Home page - -homePageDescription = - .content = Cuplikan layar intuitif dirancang langsung ke peramban. Tangkap, simpan, dan bagikan cuplikan layar saat Anda menjelajahi Web menggunakan Firefox. -homePageButtonMyShots = Buka Tangkapan Saya -homePageTeaser = Segera Hadir… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Unduh Gratis -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Cara Kerja Firefox Screenshots -homePageGetStartedTitle = Memulai -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Pilih ikon Screenshot dari menu tindakan laman di bilah alamat, dan menu Screenshots akan muncul di atas jendela peramban Anda. -homePageCaptureRegion = Tangkap Bagian -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klik dan seret untuk memilih area yang ingin Anda tangkap. Atau arahkan dan klik — Screenshots akan memilih area untuk Anda. Sudah pas? Pilih Simpan untuk mengakses tangkapan layar secara daring atau tombol panah ke bawah untuk mengunduhnya ke komputer Anda. -homePageCapturePage = Tangkap Laman -homePageCapturePageDescription = Gunakan tombol di kanan atas untuk merekam seluruh laman. Tombol Simpan yang Terlihat akan menangkap area yang Anda lihat tanpa menggulir, dan Simpan Laman Sepenuhnya akan menangkap semua yang ada di laman. -homePageDownloadCopy = Unduh atau Salin -homePageLegalLink = Legal -homePagePrivacyLink = Privasi -homePageTermsLink = Ketentuan -homePageCookiesLink = Kuki - -## Leave Screenshots page - -leavePageRemoveAllData = Hapus Semua Data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Anda harus memasang Firefox Screenshots atau masuk dengan Firefox Account untuk menghapus akun Anda -leavePageErrorGeneric = Terjadi galat -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Ini akan menghapus semua data Firefox Screenshots Anda secara permanen. -leavePageButtonProceed = Lanjutkan -leavePageButtonCancel = Batal -leavePageDeleted = Semua tangkapan layar Anda telah dihapus! - -## Not Found page - -notFoundPageTitle = Laman Tidak Ditemukan -notFoundPageIntro = Ups. -notFoundPageDescription = Laman tidak ditemukan. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Tangkapan Layar: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Kesalahan saat menyimpan tanggal kedaluwarsa -shotPageAlertErrorDeletingShot = Kesalahan saat menghapus tangkapan -shotPageAlertErrorUpdatingTitle = Galat saat menyimpan judul -shotPageConfirmDelete = Yakin ingin menghapus tangkapan ini secara permanen? -shotPageShareButton = - .title = Bagikan -shotPageCopyButton = - .title = Salin gambar ke papan klip -shotPageCopyActionLabel = Salin -shotPageCopied = Tersalin -shotPageShareFacebook = - .title = Bagikan di Facebook -shotPageShareTwitter = - .title = Bagikan di Twitter -shotPageSharePinterest = - .title = Bagikan di Pinterest -shotPageShareEmail = - .title = Bagikan tautan via surel -shotPageShareLink = Dapatkan tautan ke tangkapan ini: -shotPagePrivacyMessage = Siapa pun yang memiliki tautan dapat melihat tangkapan ini. -shotPageCopyImageText = - .label = Salin teks gambar -shotPageConfirmDeletion = Yakin ingin menghapus tangkapan ini secara permanen? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Jika Anda tidak melakukan apapun, tangkapan akan dihapus secara permanen . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = pulihkan sampai { $date } -shotPageExpiredMessage = Tangkapan ini telah kedaluwarsa. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Berikut adalah laman sumbernya: -shotPageDeleteButton = - .title = Hapus tangkapan ini -shotPageDownloadShot = - .title = Unduh -shotPageEditButton = - .title = Edit gambar ini -shotPagefavoriteButton = - .title = Favoritkan tangkapan ini -shotPageBackToHomeButton = - .title = Beranda -shotPageAllShotsButton = - .title = Semua Tangkapan Layar -shotPageScreenshotsDescriptionServerless = Screenshots dibuat sederhana. Ambil dan unduh tangkapan layar tanpa meninggalkan Firefox. -shotPageDMCAMessage = Tangkapan ini tidak lagi tersedia karena klaim hak kekayaan intelektual pihak ketiga. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Kirimkan surel ke { $dmca } untuk meminta informasi lebih lanjut. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Jika Tangkapan Anda merupakan subyek dari beberapa klaim, kami bisa mencabut akses Anda ke Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Sertakan URL dari tangkapan ini dalam surel Anda: { $url } -shotPageKeepFor = Berapa lama tangkapan ini disimpan? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Pilih waktu -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Selamanya ∞ -shotPageKeepTenMinutes = 10 Menit -shotPageKeepOneHour = 1 Jam -shotPageKeepOneDay = 1 Hari -shotPageKeepOneWeek = 1 Minggu -shotPageKeepTwoWeeks = 2 Minggu -shotPageKeepOneMonth = 1 Bulan -shotPageSaveExpiration = simpan -shotPageCancelExpiration = batal -shotPageDoesNotExpire = tidak pernah kedaluwarsa -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = kedaluwarsa -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = kedaluwarsa -timeDiffJustNow = baru saja -timeDiffMinutesAgo = { $number } menit yang lalu -timeDiffHoursAgo = { $number } jam yang lalu -timeDiffDaysAgo = { $number } hari yang lalu -timeDiffFutureSeconds = dalam beberapa detik -timeDiffFutureMinutes = dalam 1 menit -timeDiffFutureHours = dalam 1 jam -timeDiffFutureDays = besok -errorThirdPartyCookiesEnabled = Jika Anda mengambil tangkapan ini dan tidak bisa menghapusnya, Anda mungkin perlu mengaktifkan kuki pihak ketiga untuk sementara dari pengaturan peramban Anda. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Buat Catatan! -promoMessage = Alat penggubahan terbaru memungkinkan Anda memotong, menyorot, dan bahkan menambahkan teks ke tangkapan Anda. -promoLink = Coba sekarang -promoCloseButton = - .title = Tutup - -## Annotations - -annotationPenButton = - .title = Pena -annotationHighlighterButton = - .title = Penyorot -annotationUndoButton = - .title = Urungkan -annotationRedoButton = - .title = Ulangi -annotationTextButton = - .title = Tambahkan teks -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Bersihkan -annotationCropButton = - .title = Pangkas -annotationSaveEditButton = Simpan - .title = Simpan edit -annotationCancelEditButton = Batal - .title = Batal mengedit -annotationCropConfirmButton = Konfirmasi - .title = Konfirmasi pilihan -annotationCropCancelButton = Batal - .title = Batalkan pilihan -annotationColorWhite = - .title = Putih -annotationColorBlack = - .title = Hitam -annotationColorRed = - .title = Merah -annotationColorGreen = - .title = Hijau -annotationColorBlue = - .title = Biru -annotationColorYellow = - .title = Kuning -annotationColorPurple = - .title = Ungu -annotationColorSeaGreen = - .title = Hijau Laut -annotationColorGrey = - .title = Abu-abu -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Ukuran teks -# Values shown in text size selection dropdown -textSizeSmall = Kecil -textSizeMedium = Sedang -textSizeLarge = Besar -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Konfirmasi - .title = Konfirmasi -textToolCancelButton = Batal - .title = Batal -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Halo - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Ada yang salah -copyImageErrorMessage = Gagal menyalin tangkapan layar Anda ke papan klip - -## Settings Page - -settingsDisconnectButton = Putuskan - .title = Putuskan -settingsGuestAccountMessage = Akun Tamu -settingsSignInButton = Masuk - .title = Masuk -SettingsPageHeader = Setelan Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox Account -settingsClosePreferences = - .title = Tutup pengaturan -settingsFxaDisconnectAlertMessage = Apakah Anda yakin ingin memutuskan perangkat ini dari Firefox Account Anda? -settingsFxaDisconnectDescription = Jika keluar, Anda akan perlu masuk lain untuk mendapatkan akses kembali ke cuplikan layar Anda. -settingsFxaConnectDescription = Anda dapat masuk untuk mengakses cuplikan layar Anda di sepanjang perangkat. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Kesalahan saat menghapus tangkapan: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Tangkapan Saya: cari { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Kesalahan dalam menampilkan laman: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Cari tangkapan saya -shotIndexPageNoShotsMessage = Tidak ada tangkapan tersimpan. -shotIndexPageNoShotsInvitation = Lanjutkan, buat tangkapan. -shotIndexPageLookingForShots = Memuat tangkapan Anda… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Kami tidak menemukan tangkapan yang cocok dengan pencarian Anda. -shotIndexPageMyShotsButton = - .title = Tangkapan Layar Saya -shotIndexPageClearSearchButton = - .title = Bersihkan pencarian -shotIndexPageConfirmShotDelete = Hapus tangkapan ini? -shotIndexPagePreviousPage = - .title = Laman sebelumnya -shotIndexPageNextPage = - .title = Laman selanjutnya -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Ini bukan tangkapan layar favorit dan kedaluwarsa -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Ini adalah tangkapan favorit dan tidak kedaluwarsa -shotIndexSyncedShot = - .title = Tangkapan layar yang diambil dari peranti lainnya -shotIndexAlertErrorFavoriteShot = Bermasalah saat memutakhirkan status tangkapan favorit - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Apakah Anda yakin ingin menghapus tangkapan ini? -shotDeleteCancel = Batal - .title = Batal -shotDeleteConfirm = Hapus - .title = Hapus - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metrik Firefox Screenshots -metricsPageTotalsQueryTitle = Total -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Ikhtisar Screenshots -metricsPageTotalsQueryDevices = Jumlah peranti yang terdaftar -metricsPageTotalsQueryActiveShots = Tangkapan aktif -metricsPageTotalsQueryExpiredShots = Kedaluwarsa (tapi dapat dipulihkan) -metricsPageTotalsQueryExpiredDeletedShots = Kedaluwarsa (dan dihapus) -metricsPageShotsQueryTitle = Tangkapan per Hari -metricsPageShotsQueryDescription = Jumlah tangkapan yang dibuat setiap hari (dalam 30 hari terakhir) -metricsPageShotsQueryCount = Jumlah tangkapan -metricsPageShotsQueryDay = Hari -metricsPageUsersQueryTitle = Pengguna Harian -metricsPageUsersQueryDescription = Jumlah pengguna yang membuat setidaknya satu tangkapan, dalam sehari (30 hari terakhir) -metricsPageUsersQueryCount = Jumlah pengguna -metricsPageUsersQueryDay = Hari -metricsPageUserShotsQueryTitle = Jumlah Tangkapan per Pengguna -metricsPageUserShotsQueryDescription = Jumlah pengguna yang membuat sekitar N tangkapan total -metricsPageUserShotsQueryCount = Jumlah pengguna -metricsPageUserShotsQueryShots = Perkiraan jumlah tangkapan aktif (tidak kedaluwarsa) -metricsPageRetentionQueryTitle = Retensi Mingguan -metricsPageRetentionQueryDescription = Jumlah hari dari tangkapan pertama sampai tangkapan terbaru, dikelompokkan berdasar awal pekan -metricsPageRetentionQueryUsers = Jumlah pengguna -metricsPageRetentionQueryDays = Jumlah hari dari tangkapan pertama sampai yang terbaru -metricsPageRetentionQueryFirstWeek = Jumlah minggu pengguna membuat tangkapan pertama -metricsPageTotalRetentionQueryTitle = Total Retensi -metricsPageTotalRetentionQueryDescription = Lama pengguna membuat tangkapan, dikelompokkan berdasar minggu -metricsPageTotalRetentionQueryUsers = Jumlah pengguna -metricsPageTotalRetentionQueryDays = Jumlah hari pengguna membuat tangkapan -metricsPageVersionQueryTitle = Versi Pengaya -metricsPageVersionQueryDescription = Versi pengaya yang digunakan saat masuk, dalam 14 hari terakhir -metricsPageVersionQueryUsers = Jumlah pengguna yang masuk -metricsPageVersionQueryVersion = Versi pengaya -metricsPageVersionQueryLastSeen = Hari -metricsPageHeader = Metrik -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Dibuat pada: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (waktu basis data: { $time }ms) diff --git a/locales/is/server.ftl b/locales/is/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/is/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/it/server.ftl b/locales/it/server.ftl deleted file mode 100644 index 39169924d0..0000000000 --- a/locales/it/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Le mie immagini -gHomeLink = Pagina iniziale -gNoShots = - .alt = Nessuna immagine trovata -gScreenshotsDescriptionServerless = Screenshots: ti semplifica la vita! Cattura e scarica i tuoi screenshot direttamente da Firefox. - -## Header - -buttonSettings = - .title = Impostazioni -buttonSignIn = - .title = Accedi -screenshotsLogo = - .title = Pagina iniziale Screenshots -bannerSignIn = Accedi o registrati per accedere alle tue immagini da qualsiasi dispositivo e conservare per sempre le tue preferite. -bannerUpsell = { gScreenshotsDescription } Scarica subito Firefox -shutdownWarning = Gli screenshot salvati verranno eliminati a breve. A partire da giugno, Screenshot non offrirà più il servizio di archiviazione online. Se non vuoi perdere le tue immagini, scaricale sul computer. -shutdownPageTitle = Screenshots sta cambiando -shutdownPageDescription = A partire da giugno, Screenshots non offrirà più spazio di archiviazione online. Se vuoi conservare le immagini della tua libreria, scaricale singolarmente o in blocco. Ti ringraziamo per aver utilizzato questa funzione e ci scusiamo per qualsiasi inconveniente. -shutdownPageContinue = Ci auguriamo che continuerai a utilizzare Screenshots per acquisire, copiare e scaricare schermate. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Cosa c'è di nuovo in Firefox Screenshots? -onboardingPromoMessage = Ora puoi fare molto di più se accedi a Screenshots con un account Firefox: -onboardingPromoMessageListItem1 = Accedi alla tua raccolta da tutti i tuoi dispositivi -onboardingPromoMessageListItem2 = Conserva per sempre i tuoi scatti preferiti -onboardingPromoDismissButton = Ignora - .title = Ignora -onboardingPromoSigninButton = Accedi - .title = Accedi - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Condizioni di utilizzo -footerLinkPrivacy = Informativa sulla privacy -footerReportShot = Segnala immagine - .title = Segnala questa immagine come abuso, spam o per altri motivi -footerLinkFaqs = FAQ -footerLinkDMCA = Segnala violazioni IP -footerLinkDiscourse = Invia commenti -footerLinkRemoveAllData = Rimozione dei dati - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creazione { $title } -creatingPageTitleDefault = pagina -creatingPageWaitMessage = Salvataggio dell’immagine… - -## Home page - -homePageDescription = - .content = Un modo intuitivo di catturare schermate direttamente nel browser. Cattura, salva e condividi immagini durante la navigazione con Firefox. -homePageButtonMyShots = Vai alle mie immagini -homePageTeaser = Prossimamente… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Download gratuito -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Come funziona Firefox Screenshots -homePageGetStartedTitle = Per iniziare -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Seleziona l’icona di Screenshots tra le azioni disponibili per la pagina nella barra degli indirizzi. Il menu di Screenshots apparirà in alto nella finestra del browser. -homePageCaptureRegion = Cattura un’area dello schermo -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Fai clic e trascina per selezionare l’area che ti interessa. Oppure posizionati con il mouse e fai clic: Screenshots cercherà di selezionare l’area per te. È tutto pronto? Scegli Salva per memorizzare l’immagine online oppure il pulsante con la freccia verso il basso per scaricarla sul computer. -homePageCapturePage = Cattura una pagina -homePageCapturePageDescription = Utilizza i pulsanti in alto a destra per catturare la pagina. Il pulsante “Salva l’area visibile” cattura l’area visualizzata sullo schermo senza scorrere la pagina, mentre “Salva l’intera schermata” ne cattura il contenuto completo. -homePageDownloadCopy = Scarica o Copia -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Scegli l’inquadratura migliore. Con Screenshots puoi scaricare la porzione di schermo che hai selezionato o copiarla direttamente negli appunti. -homePageLegalLink = Note legali -homePagePrivacyLink = Privacy -homePageTermsLink = Condizioni di utilizzo -homePageCookiesLink = Cookie - -## Leave Screenshots page - -leavePageRemoveAllData = Elimina tutti i dati -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = È necessario avere installato Firefox Screenshots o essere connesso all’account Firefox per eliminare il proprio account -leavePageErrorGeneric = Si è verificato un errore -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Questa operazione eliminerà tutti i dati associati a Firefox Screenshots. -leavePageButtonProceed = Continua -leavePageButtonCancel = Annulla -leavePageDeleted = Tutte le tue immagini sono state eliminate. - -## Not Found page - -notFoundPageTitle = Pagina non trovata -notFoundPageIntro = Oops. -notFoundPageDescription = Pagina non trovata. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Screenshot: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Errore durante la modifica della scadenza dell’immagine -shotPageAlertErrorDeletingShot = Errore durante l’eliminazione dell’immagine -shotPageAlertErrorUpdatingTitle = Errore durante il salvataggio del titolo -shotPageConfirmDelete = Eliminare questa immagine in modo definitivo? -shotPageShareButton = - .title = Condividi -shotPageCopyButton = - .title = Copia immagine negli appunti -shotPageCopyActionLabel = Copia -shotPageCopied = Copiato -shotPageShareFacebook = - .title = Condividi su Facebook -shotPageShareTwitter = - .title = Condividi su Twitter -shotPageSharePinterest = - .title = Condividi su Pinterest -shotPageShareEmail = - .title = Condividi link via email -shotPageShareLink = Ottieni un link per condividere questa immagine: -shotPagePrivacyMessage = Chiunque in possesso di questo link potrà visualizzare l’immagine. -shotPageCopyImageText = - .label = Copia testo nell’immagine -shotPageConfirmDeletion = Eliminare questa immagine in modo definitivo? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Senza ulteriori azioni, questa immagine verrà eliminata . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = ripristina fino a { $date } -shotPageExpiredMessage = Questa immagine è scaduta. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Pagina originale da cui l’immagine è stata creata: -shotPageDeleteButton = - .title = Elimina questa immagine -shotPageDownloadShot = - .title = Scarica -shotPageEditButton = - .title = Modifica immagine -shotPagefavoriteButton = - .title = Aggiungi immagine ai preferiti -shotPageBackToHomeButton = - .title = Pagina iniziale -shotPageAllShotsButton = - .title = Tutte le immagini -shotPageScreenshotsDescriptionServerless = Screenshots: ti semplifica la vita! Cattura e scarica i tuoi screenshot direttamente da Firefox. -shotPageDMCAMessage = Questa immagine non è più disponibile a causa di una segnalazione di violazione della proprietà intellettuale da parte di soggetti terzi. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Invia un’email a { $dmca } per richiedere ulteriori informazioni. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = In caso di ripetute segnalazioni di violazione, potremmo revocare il tuo accesso a Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Includi l'indirizzo di questa immagine nell’email: { $url } -shotPageKeepFor = Per quanto tempo vuoi conservare questa immagine? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Seleziona durata -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = nessuna scadenza ∞ -shotPageKeepTenMinutes = 10 minuti -shotPageKeepOneHour = 1 ora -shotPageKeepOneDay = 1 giorno -shotPageKeepOneWeek = 1 settimana -shotPageKeepTwoWeeks = 2 settimane -shotPageKeepOneMonth = 1 mese -shotPageSaveExpiration = Salva -shotPageCancelExpiration = Annulla -shotPageDoesNotExpire = nessuna scadenza -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = Scade -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = è scaduto -timeDiffJustNow = adesso -timeDiffMinutesAgo = - { $number -> - [one] 1 minuto fa - *[other] { $number } minuti fa - } -timeDiffHoursAgo = - { $number -> - [one] 1 ora fa - *[other] { $number } ore fa - } -timeDiffDaysAgo = - { $number -> - [one] ieri - *[other] { $number } giorni fa - } -timeDiffFutureSeconds = tra pochi secondi -timeDiffFutureMinutes = - { $number -> - [one] in 1 minuto - *[other] in { $number } minuti - } -timeDiffFutureHours = - { $number -> - [one] in 1 ora - *[other] in { $number } ore - } -timeDiffFutureDays = - { $number -> - [one] domani - *[other] in { $number } giorni - } -errorThirdPartyCookiesEnabled = Se hai creato questa immagine e non riesci ad eliminarla, potrebbe essere necessario attivare i cookie di terze parti nelle impostazioni del browser. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Prendi nota! -promoMessage = Gli strumenti di modifica aggiornati permettono di ritagliare, evidenziare e anche di aggiungere testo ai tuoi screenshot. -promoLink = Provali -promoCloseButton = - .title = Chiudi notifica - -## Annotations - -annotationPenButton = - .title = Penna -annotationHighlighterButton = - .title = Evidenziatore -annotationUndoButton = - .title = Annulla -annotationRedoButton = - .title = Ripeti -annotationTextButton = - .title = Aggiungi testo -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Cancella -annotationCropButton = - .title = Ritaglia -annotationSaveEditButton = Salva - .title = Salva modifiche -annotationCancelEditButton = Annulla - .title = Annulla modifiche -annotationCropConfirmButton = Conferma - .title = Conferma la selezione -annotationCropCancelButton = Annulla - .title = Annulla la selezione -annotationColorWhite = - .title = Bianco -annotationColorBlack = - .title = Nero -annotationColorRed = - .title = Rosso -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Blu -annotationColorYellow = - .title = Giallo -annotationColorPurple = - .title = Viola -annotationColorSeaGreen = - .title = Verde acqua -annotationColorGrey = - .title = Grigio -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Dimensione testo -# Values shown in text size selection dropdown -textSizeSmall = Piccolo -textSizeMedium = Medio -textSizeLarge = Grande -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Conferma - .title = Conferma -textToolCancelButton = Annulla - .title = Annulla -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Ciao - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Si è verificato un errore -copyImageErrorMessage = Impossibile copiare l’immagine negli appunti. - -## Settings Page - -settingsDisconnectButton = Disconnetti - .title = Disconnetti -settingsGuestAccountMessage = Account ospite -settingsSignInButton = Accedi - .title = Accedi -SettingsPageHeader = Impostazioni di Firefox Screenshots -settingsFirefoxAccountSubHeader = Account Firefox -settingsClosePreferences = - .title = Chiudi impostazioni -settingsFxaDisconnectAlertMessage = Disconnettere questo dispositivo dal proprio account Firefox? -settingsFxaDisconnectDescription = Se ti disconnetti, dovrai accedere di nuovo per ritrovare i tuoi screenshot. -settingsFxaConnectDescription = Accedi all’account per ritrovare i tuoi screenshot su tutti i dispositivi. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Errore durante l’eliminazione dell’immagine: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Le mie immagini: cerca { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Errore durante la generazione della pagina: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Cerca nelle mie immagini -shotIndexPageNoShotsMessage = Nessuna immagine salvata. -shotIndexPageNoShotsInvitation = Cosa aspetti? Creane qualcuna. -shotIndexPageLookingForShots = Ricerca immagini… -shotIndexPageNoSearchResultsIntro = Uhm -shotIndexPageNoSearchResults = Non abbiamo trovato alcuna immagine che corrisponda al testo inserito. -shotIndexPageMyShotsButton = - .title = Le mie immagini -shotIndexPageClearSearchButton = - .title = Pulisci ricerca -shotIndexPageConfirmShotDelete = Eliminare questa immagine? -shotIndexPagePreviousPage = - .title = Pagina precedente -shotIndexPageNextPage = - .title = Pagina successiva -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Questa immagine non è nei preferiti e scadrà -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Questa immagine è nei preferiti e non ha scadenza -shotIndexSyncedShot = - .title = Immagine catturata da un altro dispositivo -shotIndexAlertErrorFavoriteShot = Si è verificato un errore durante l’aggiornamento dell’immagine preferita - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Eliminare questa immagine? -shotDeleteCancel = Annulla - .title = Annulla -shotDeleteConfirm = Elimina - .title = Elimina - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Per esportare uno screenshot seleziona File > Salva pagina con nome... e troverai i tuoi screenshot nella cartella { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metriche di Firefox Screenshots -metricsPageTotalsQueryTitle = Totali -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Una panoramica di Screenshots -metricsPageTotalsQueryDevices = Totale dispositivi registrati -metricsPageTotalsQueryActiveShots = Immagini attive -metricsPageTotalsQueryExpiredShots = Scadute (ma recuperabili) -metricsPageTotalsQueryExpiredDeletedShots = Scadute (ed eliminate) -metricsPageShotsQueryTitle = Immagini per giorno -metricsPageShotsQueryDescription = Numero di immagini create ogni giorno (negli ultimi 30 giorni) -metricsPageShotsQueryCount = Numero di immagini -metricsPageShotsQueryDay = Giorno -metricsPageUsersQueryTitle = Utenti per giorno -metricsPageUsersQueryDescription = Numero di utenti che hanno creato almeno un’immagine, per giorno (ultimi 30 giorni) -metricsPageUsersQueryCount = Numero di utenti -metricsPageUsersQueryDay = Giorno -metricsPageUserShotsQueryTitle = Numero di immagini per utente -metricsPageUserShotsQueryDescription = Il numero di utenti con N immagini complessive -metricsPageUserShotsQueryCount = Numero di utenti -metricsPageUserShotsQueryShots = Numero approssimativo di immagini attive (non scadute) -metricsPageRetentionQueryTitle = Fidelizzazione per settimana -metricsPageRetentionQueryDescription = Numero di giorni dalla prima immagine alla più recente, raggruppati per settimana iniziale -metricsPageRetentionQueryUsers = Numero di utenti -metricsPageRetentionQueryDays = Giorni trascorsi dall’immagine più recente dell’utente -metricsPageRetentionQueryFirstWeek = Settimana in cui l’utente ha creato la prima immagine -metricsPageTotalRetentionQueryTitle = Fidelizzazione complessiva -metricsPageTotalRetentionQueryDescription = Per quanto tempo gli utenti hanno creato immagini, raggruppato per settimana -metricsPageTotalRetentionQueryUsers = Numero di utenti -metricsPageTotalRetentionQueryDays = Per quanti giorni l’utente ha creato immagini -metricsPageVersionQueryTitle = Versione componente aggiuntivo -metricsPageVersionQueryDescription = La versione del componente aggiuntivo utilizzata per accedere (ultimi 14 giorni) -metricsPageVersionQueryUsers = Numero di utenti che effettuano l’accesso -metricsPageVersionQueryVersion = Versione componente aggiuntivo -metricsPageVersionQueryLastSeen = Giorno -metricsPageHeader = Metriche -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generato il: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (tempo di utilizzo del database: { $time }ms) diff --git a/locales/ja/server.ftl b/locales/ja/server.ftl deleted file mode 100644 index d8dbe5ede6..0000000000 --- a/locales/ja/server.ftl +++ /dev/null @@ -1,371 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = 自分のショット -gHomeLink = ホーム -gNoShots = - .alt = ショットが見つかりませんでした - -## Header - -buttonSettings = - .title = 設定 -buttonSignIn = - .title = ログイン -screenshotsLogo = - .title = Screenshots ホーム -bannerSignIn = ログインまたはアカウント登録 してショットにアクセス。端末を問わずにショットへアクセスし、あなたのお気に入りを保存しましょう。 -bannerUpsell = { gScreenshotsDescription } Firefox を今すぐ入手 -shutdownWarning = 間もなく保存したスクリーンショットの有効期限が切れます。 6 月以降、Screenshots はオンラインストレージの提供を終了します。オンライン上に保存したスクリーンショットは、コンピューターにダウンロードしてください。 -shutdownPageTitle = Screenshots が変わります -shutdownPageDescription = 5月末で Screenshots のオンラインストレージの提供を終了します。オンラインストレージ上のショットを保存しておきたい場合は、個別または バッチ処理 でダウンロードしてください。この機能をご使用いただきありがとうございました。ご不便をおかけして申し訳ありません。 -shutdownPageContinue = Screenshots による画面の保存、コピー、ダウンロード機能は引き続きお使いいただくことができます。 -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefox Screenshots の新機能 -onboardingPromoMessage = Screenshots に Firefox アカウントでログインして、より多くのことを行えます: -onboardingPromoMessageListItem1 = すべてのデバイスからライブラリーにアクセス -onboardingPromoMessageListItem2 = お気に入りのショットを永久保存 -onboardingPromoDismissButton = 無視する - .title = 無視 -onboardingPromoSigninButton = ログイン - .title = ログイン - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = 利用規約 -footerLinkPrivacy = プライバシー通知 -footerReportShot = ショットを報告 - .title = このショットを不正利用またはスパム、他の問題で報告します -footerLinkFaqs = よくある質問 -footerLinkDMCA = IP 侵害を報告 -footerLinkDiscourse = フィードバックを送る -footerLinkRemoveAllData = すべてのデータを削除 - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } を作成しています -creatingPageTitleDefault = ページ -creatingPageWaitMessage = ショットを保存しています... - -## Home page - -homePageDescription = - .content = ブラウザーに組み込まれた直感的なスクリーンショットツール。Firefox を使ってウェブをブラウズしながら、スクリーンショットをキャプチャ、保存、共有できます。 -homePageButtonMyShots = 自分のショットへ -homePageTeaser = 近日公開... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = 無料ダウンロード -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots の仕組み -homePageGetStartedTitle = はじめよう -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = アドレスバー内のページアクションメニューから Screenshots アイコンを選択すれば、ブラウザーウィンドウ上に Screenshots メニューが表示されます。 -homePageCaptureRegion = 選択範囲をキャプチャ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = クリック&ドラッグでキャプチャしたい範囲を選択します。あるいは単純にマウスを当ててクリックすれば、Screenshots が自動的に範囲を選択してくれます。範囲を確定したら、保存ボタンをクリックすればオンラインでスクリーンショットを参照できます。また下向きの矢印ボタンでコンピューターに保存することもできます。 -homePageCapturePage = ページをキャプチャ -homePageCapturePageDescription = ページ全体をキャプチャするには右上のボタンを使ってください。[表示範囲を保存] ボタンはスクロールせずに見えている範囲のみをキャプチャ、[ページ全体を保存] ボタンはページ上のすべての要素をキャプチャできます。 -homePageDownloadCopy = ダウンロードまたはコピー -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = 最高のショットを撮りましょう。Screenshots は選択したものをダウンロードまたはクリップボードにコピーできます。 -homePageLegalLink = 法的通知 -homePagePrivacyLink = プライバシー -homePageTermsLink = 利用規約 -homePageCookiesLink = Cookie - -## Leave Screenshots page - -leavePageRemoveAllData = すべてのデータを削除 -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Firefox Screenshots をインストールするか Firefox アカウントにログインしてアカウントを削除してください -leavePageErrorGeneric = 問題が発生しました -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = これによりあなたの Firefox Screenshots データはすべて永久に消去されます。 -leavePageButtonProceed = 続ける -leavePageButtonCancel = キャンセル -leavePageDeleted = あなたのスクリーンショットはすべて消去されました! - -## Not Found page - -notFoundPageTitle = ページが見つかりませんでした -notFoundPageIntro = おっと。 -notFoundPageDescription = ページが見つかりませんでした。 - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = スクリーンショット: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = 期限の保存中に問題が発生しました -shotPageAlertErrorDeletingShot = ショットの削除中に問題が発生しました -shotPageAlertErrorUpdatingTitle = タイトルの保存中に問題が発生しました -shotPageConfirmDelete = 本当にこのショットを永久に削除しますか? -shotPageShareButton = - .title = 共有 -shotPageCopyButton = - .title = 画像をクリップボードへコピー -shotPageCopyActionLabel = コピー -shotPageCopied = コピー完了 -shotPageShareFacebook = - .title = Facebook で共有 -shotPageShareTwitter = - .title = Twitter で共有 -shotPageSharePinterest = - .title = Pinterest で共有 -shotPageShareEmail = - .title = メールでリンクを共有 -shotPageShareLink = このショットの共有リンクを取得: -shotPagePrivacyMessage = リンクを手に入れた人は誰でもこのショットを見られます。 -shotPageCopyImageText = - .label = 画像のテキストをコピー -shotPageConfirmDeletion = 本当にこのショットを永久に削除しますか? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = 何もしない場合、このショットは に永久に削除されます。 -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date } まで復元 -shotPageExpiredMessage = このショットは期限切れとなりました。 -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = この作成元となったページはこちらです: -shotPageDeleteButton = - .title = このショットを削除 -shotPageDownloadShot = - .title = ダウンロード -shotPageEditButton = - .title = この画像を編集 -shotPagefavoriteButton = - .title = お気に入りのショット -shotPageBackToHomeButton = - .title = ホームページ -shotPageAllShotsButton = - .title = すべてのショット -shotPageDMCAMessage = このショットは第三者からの知的所有権侵害の申し立てにより使用できなくなりました。 -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = より詳しい情報は { $dmca } までお問い合わせください。 -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = あなたのショットに対して問題報告が複数寄せられた場合、あなたの Firefox Screenshots へのアクセスは無効化される可能性があります。 -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = このショットの URL をメールに記載してください: { $url } -shotPageKeepFor = このショットの保存期間 -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = 時間を選択 -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = 無期限 ∞ -shotPageKeepTenMinutes = 10 分 -shotPageKeepOneHour = 1 時間 -shotPageKeepOneDay = 1 日 -shotPageKeepOneWeek = 1 週間 -shotPageKeepTwoWeeks = 2 週間 -shotPageKeepOneMonth = 1 か月 -shotPageSaveExpiration = 保存 -shotPageCancelExpiration = キャンセル -shotPageDoesNotExpire = 無期限 -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = に期限切れ -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = に期限切れ -timeDiffJustNow = たった今 -timeDiffMinutesAgo = { $number } 分前 -timeDiffHoursAgo = { $number } 時間前 -timeDiffDaysAgo = { $number } 日前 -timeDiffFutureSeconds = 数秒以内 -timeDiffFutureMinutes = { $number } 分以内 -timeDiffFutureHours = { $number } 時間以内 -timeDiffFutureDays = { $number } 日以内 -errorThirdPartyCookiesEnabled = このショットを撮って削除できない場合、ブラウザーの設定画面でサードパーティ Cookie を一時的に有効化する必要があるかもしれません。 - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = お知らせ! -promoMessage = 拡張された編集ツールを使えば、ショットのトリミングやハイライト、さらに文字の追加もできます。 -promoLink = 試してみる -promoCloseButton = - .title = 通知を閉じる - -## Annotations - -annotationPenButton = - .title = ペン -annotationHighlighterButton = - .title = ハイライト -annotationUndoButton = - .title = 元に戻す -annotationRedoButton = - .title = やり直し -annotationTextButton = - .title = テキストを追加 -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = クリア -annotationCropButton = - .title = トリミング -annotationSaveEditButton = 保存 - .title = 編集内容を保存 -annotationCancelEditButton = キャンセル - .title = 編集をキャンセル -annotationCropConfirmButton = 確認 - .title = 確認選択 -annotationCropCancelButton = キャンセル - .title = キャンセル選択 -annotationColorWhite = - .title = 白 -annotationColorBlack = - .title = 黒 -annotationColorRed = - .title = 赤 -annotationColorGreen = - .title = 緑 -annotationColorBlue = - .title = 青 -annotationColorYellow = - .title = 黄 -annotationColorPurple = - .title = 紫 -annotationColorSeaGreen = - .title = 海緑 -annotationColorGrey = - .title = 灰 -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = 文字サイズ -# Values shown in text size selection dropdown -textSizeSmall = 小 -textSizeMedium = 中 -textSizeLarge = 大 -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = 確認 - .title = 確認 -textToolCancelButton = キャンセル - .title = キャンセル -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = こんにちは - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = 問題が発生しました -copyImageErrorMessage = ショットをクリップボードにコピーできませんでした。 - -## Settings Page - -settingsDisconnectButton = 接続を解除 - .title = 接続を解除 -settingsGuestAccountMessage = ゲストアカウント -settingsSignInButton = ログイン - .title = ログイン -SettingsPageHeader = Firefox Screenshots の設定 -settingsFirefoxAccountSubHeader = Firefox アカウント -settingsClosePreferences = - .title = 設定を閉じる -settingsFxaDisconnectAlertMessage = 本当に、このデバイスを Firefox アカウントから切断しますか? -settingsFxaDisconnectDescription = ログアウトすると、スクリーンショットにアクセスするには、再びログインする必要があります。 -settingsFxaConnectDescription = ログインすると、デバイスをまたがってスクリーンショットにアクセスできます。 - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = ショットの削除中に問題が発生しました: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = 自分のショット: { $searchTerm } を検索 -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = ページのレンダリング中に問題が発生しました: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = 自分のショットを検索 -shotIndexPageNoShotsMessage = 保存済みのショットはありません。 -shotIndexPageNoShotsInvitation = さぁ、いくつかショットを撮ってみましょう。 -shotIndexPageLookingForShots = あなたのショットを検索しています... -shotIndexPageNoSearchResultsIntro = うーん -shotIndexPageNoSearchResults = 検索語に一致するショットが見つかりませんでした。 -shotIndexPageMyShotsButton = - .title = マイショット -shotIndexPageClearSearchButton = - .title = 検索語を消去 -shotIndexPageConfirmShotDelete = このショットを削除しますか? -shotIndexPagePreviousPage = - .title = 前のページ -shotIndexPageNextPage = - .title = 次のページ -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = これはお気に入りのショットではないので保存期限が切れます。 -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = このお気に入りのショットは期限切れになりません -shotIndexSyncedShot = - .title = 別の端末で撮影されたショット -shotIndexAlertErrorFavoriteShot = お気に入りのショットの状態の更新時にエラーが発生しました - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = 本当にこのショットを削除しますか? -shotDeleteCancel = キャンセル - .title = キャンセル -shotDeleteConfirm = 削除 - .title = 削除 - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = 書き出すには: [ファイル] メニューの [名前を付けて保存...] から保存します。スクリーンショットは { $folder } フォルダーにあります。 - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots 統計データ -metricsPageTotalsQueryTitle = 合計 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Screenshots の概要 -metricsPageTotalsQueryDevices = 登録済み合計端末数 -metricsPageTotalsQueryActiveShots = アクティブなショット -metricsPageTotalsQueryExpiredShots = 期限切れ (ただし復元可能) -metricsPageTotalsQueryExpiredDeletedShots = 期限切れ (既に削除済み) -metricsPageShotsQueryTitle = 日別ショット数 -metricsPageShotsQueryDescription = 作成されたショットの日別数 (過去 30 日間) -metricsPageShotsQueryCount = ショット数 -metricsPageShotsQueryDay = 日 -metricsPageUsersQueryTitle = 日別ユーザー数 -metricsPageUsersQueryDescription = 少なくとも 1 つショットを作成したユーザーの日別数 (過去 30 日間) -metricsPageUsersQueryCount = ユーザー数 -metricsPageUsersQueryDay = 日 -metricsPageUserShotsQueryTitle = ユーザーごとのショット数 -metricsPageUserShotsQueryDescription = 合計で約 N ショット所有しているユーザーの数 -metricsPageUserShotsQueryCount = ユーザー数 -metricsPageUserShotsQueryShots = アクティブな (期限切れ前の) ショットのおおよその数 -metricsPageRetentionQueryTitle = 週別滞留率 -metricsPageRetentionQueryDescription = ユーザーの最初のショットから最近のショットまでの日数 (最初の週での分類) -metricsPageRetentionQueryUsers = ユーザー数 -metricsPageRetentionQueryDays = ユーザーの最初から最近のショットまでの日数 -metricsPageRetentionQueryFirstWeek = ユーザーが最初にショットを作成した週 -metricsPageTotalRetentionQueryTitle = 合計滞留率 -metricsPageTotalRetentionQueryDescription = ユーザーがショットを作成している期間の長さ (週別の分類) -metricsPageTotalRetentionQueryUsers = ユーザー数 -metricsPageTotalRetentionQueryDays = ユーザーがショットを作成している日数 -metricsPageVersionQueryTitle = アドオンのバージョン -metricsPageVersionQueryDescription = ログイン中に使用されたアドオンのバージョン (過去 14 日間) -metricsPageVersionQueryUsers = ログイン済みユーザー数 -metricsPageVersionQueryVersion = アドオンのバージョン -metricsPageVersionQueryLastSeen = 日 -metricsPageHeader = 統計データ -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = 作成日時: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (データベース時間: { $time } ミリ秒) diff --git a/locales/ka/server.ftl b/locales/ka/server.ftl deleted file mode 100644 index 861ebb86d0..0000000000 --- a/locales/ka/server.ftl +++ /dev/null @@ -1,393 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = ჩემი გადაღებულები -gHomeLink = მთავარი -gNoShots = - .alt = ვერ მოიძებნა -gScreenshotsDescriptionServerless = Screenshots მარტივად მუშაობს. გადაიღეთ და ჩამოტვირთეთ ეკრანის სურათები Firefox-ის დატოვების გარეშე. - -## Header - -buttonSettings = - .title = პარამეტრები -buttonSignIn = - .title = შესვლა -screenshotsLogo = - .title = Screenshots მთავარი -bannerSignIn = შედით ან შექმენით ანგარიში თქვენ მიერ გადაღებულ სურათებთან წვდომის მისაღებად სხვადასხვა მოწყობილობებიდან და მათ სამუდამოდ შესანახად. -bannerUpsell = { gScreenshotsDescription } გადმოწერეთ Firefox ახლავე -shutdownWarning = სურათების შენახვის ვადა მალე ამოიწურება. ივნისიდან მოყოლებული, Screenshots-ს აღარ ექნება ინტერნეტ-საცავის მომსახურება. გსურთ სურათების შენარჩუნება თქვენი ბიბლიოთეკიდან? ჩამოტვირთეთ თქვენს კომპიუტერში. -shutdownPageTitle = Screenshots-ში ცვლილებებია -shutdownPageDescription = ივნისიდან მოყოლებული, Screenshots-ს აღარ ექნება ინტერნეტ-საცავის მომსახურება. გსურთ სურათების შენარჩუნება თქვენი ბიბლიოთეკიდან? ჩამოტვირთეთ სათითაოდ ან ერთიანად. გმადლობთ, რომ სარგებლობდით ამ შესაძლებლობით და ვწუხვართ, უხერხულობის შექმნისთვის. -shutdownPageContinue = ვიმედოვნებთ, რომ ჩვეულებრივ განაგრძობთ Screenshots-ის გამოყენებას სურათების გადასაღებად, ასლის ასაღებად და ჩამოსატვირთად. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = რა სიახლეებია Firefox Screenshots-ში? -onboardingPromoMessage = ახლა, შედით Screenshots-ზე Firefox-ანგარიშით რომ შეძლოთ: -onboardingPromoMessageListItem1 = თქვენს ბიბლიოთეკასთან წვდომა ყველა თქვენი მოწყობილობიდან -onboardingPromoMessageListItem2 = რჩეული სურათების სამუდამოდ შენახვა -onboardingPromoDismissButton = გამოტოვება - .title = გამოტოვება -onboardingPromoSigninButton = შესვლა - .title = შესვლა - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = პირობები -footerLinkPrivacy = პირადი მონაცემების დაცვის განაცხადი -footerReportShot = მოხსენება გადაღებულ სურათზე - .title = მოგვახსენეთ სურათთან დაკავშირებული დარღვევის, არასასურველი შიგთავსის ან სხვა ხარვეზის შესახებ -footerLinkFaqs = ხ.დ.კ. -footerLinkDMCA = მოხსენება IP დარღვევაზე -footerLinkDiscourse = გამოხმაურება -footerLinkRemoveAllData = ყველა მონაცემის წაშლა - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = იქმნება { $title } -creatingPageTitleDefault = გვერდი -creatingPageWaitMessage = სურათი ინახება... - -## Home page - -homePageDescription = - .content = გვერდისთვის სურათის გადაღება პირდაპირ ბრაუზერში. გადაუღეთ, შეინახეთ და გააზიარეთ Firefox-ით თვალიერებისას. -homePageButtonMyShots = გადაღებულ სურათებზე გადასვლა -homePageTeaser = მალე იქნება... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = უფასო ჩამოტვირთვა -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = როგორ მუშაობს Firefox Screenshots -homePageGetStartedTitle = დაიწყეთ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = აირჩიეთ Screenshots-ის ხატულა მისამართების ველში არსებულ, მოქმედებების მენიუში და Screenshots-ის ღილაკები გამოჩნდება ბრაუზერის ფანჯრის ზედა მხარეს. -homePageCaptureRegion = სივრცისთვის სურათის გადაღება -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = დააწკაპეთ და გადაადგილეთ მაჩვენებელი ისარი, გადასაღები სივრცის მოსანიშნად. ან უბრალოდ ზემოდან გადაატარეთ სასურველ არეს და დააწკაპეთ – Screenshots თავად მონიშნავს საჭირო სივრცეს. გაკმაყოფილებთ შედეგი? დააჭირეთ „შენახვას“, თქვენი სურათის ინტერნეტში განსათავსებლად, ან დააჭირეთ ჩამოტვირთვის ღილაკს, კომპიუტერში შესანახად. -homePageCapturePage = გვერდისთვის სურათის გადაღება -homePageCapturePageDescription = მთლიანი გვერდისთვის სურათის გადასაღებად ისარგებლეთ ზედა მარჯვენა კუთხეში განთავსებული ღილაკებით. ხილული ნაწილის შენახვის ღილაკით, მხოლოდ იმ ნაწილს გადაიღებთ, რასაც ეკრანზე ხედავთ, ხოლო მთლიანი გვერდის შენახვის ღილაკით, ვებგვერდის სრულ სურათს მიიღებთ. -homePageDownloadCopy = ჩამოტვირთვა ან ასლის აღება -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = გადაიღეთ საუკეთესო სურათები. Screenshots საშუალებას გაძლევთ, რომ ჩამოტვირთოთ მონიშნული არე ან პირდაპირ ასლი აიღოთ. -homePageLegalLink = სამართლებრივი საკითხები -homePagePrivacyLink = პირადულობა -homePageTermsLink = პირობები -homePageCookiesLink = ფუნთუშები - -## Leave Screenshots page - -leavePageRemoveAllData = ყველა მონაცემის წაშლა -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = ანგარიშის წასაშლელად, აუცილებელია დაყენებული გქონდეთ Firefox Screenshots ან შესული იყოთ Firefox-ანგარიშზე. -leavePageErrorGeneric = მოხდა შეცდომა -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = შედეგად, Firefox Screenshots-ის მონაცემები სამუდამოდ წაიშლება. -leavePageButtonProceed = გაგრძელება -leavePageButtonCancel = გაუქმება -leavePageDeleted = თქვენი ყველა სურათი წაიშლება! - -## Not Found page - -notFoundPageTitle = გვერდი ვერ მოიძებნა -notFoundPageIntro = ვაი. -notFoundPageDescription = გვერდი ვერ მოიძებნა. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = სურათი: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = შეცდომა შენახვის ვადის განსაზღვრისას -shotPageAlertErrorDeletingShot = შედცომა სურათის წაშლისას -shotPageAlertErrorUpdatingTitle = შეცდომა სახელის დარქმევისას -shotPageConfirmDelete = ნამდვილად გსურთ ამ სურათის სამუდამოდ წაშლა? -shotPageShareButton = - .title = გაზიარება -shotPageCopyButton = - .title = სურათის ასლი -shotPageCopyActionLabel = ასლი -shotPageCopied = ასლი მზადაა -shotPageShareFacebook = - .title = გაზიარება Facebook-ით -shotPageShareTwitter = - .title = გაზიარება Twitter-ით -shotPageSharePinterest = - .title = გაზიარება Pinterest-ით -shotPageShareEmail = - .title = ბმულის გაზიარება ელ-ფოსტით -shotPageShareLink = გასაზიარებელი ბმულის მიღება -shotPagePrivacyMessage = ამ ბმულის საშუალებით, ნებისმიერს შეეძლება სურათის ნახვა. -shotPageCopyImageText = - .label = სურათის ტექსტის ასლი -shotPageConfirmDeletion = ნამდვილად გსურთ ამ სურათის სამუდამოდ წაშლა? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = თუ არაფერს მოიმოქმედებთ, ეს სურათი სამუდამოდ წაიშლება . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = აღდგენა { $date }-მდე -shotPageExpiredMessage = სურათი ვადაგასულია. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = გვერდის შემქმნელი: -shotPageDeleteButton = - .title = სურათის წაშლა -shotPageDownloadShot = - .title = ჩამოტვირთვა -shotPageEditButton = - .title = სურათის ჩასწორება -shotPagefavoriteButton = - .title = სურათის რჩეულად მონიშვნა -shotPageBackToHomeButton = - .title = მთავარი გვერდი -shotPageAllShotsButton = - .title = ყველა გადაღებული -shotPageScreenshotsDescriptionServerless = Screenshots მარტივად მუშაობს. გადაიღეთ და ჩამოტვირთეთ ეკრანის სურათები Firefox-ის დატოვების გარეშე. -shotPageDMCAMessage = სურათი წაიშალა მესამე მხარის მოთხოვნით, საავტორო უფლების დარღვევის საფუძველზე. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = გთხოვთ მოგვწეროთ მისამართზე { $dmca } დამატებითი ინფორმაციისთვის. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = თუ თქვენი სურათები მიიღებს დიდი რაოდენობით საჩივრებს, Firefox Screenshots-თან წვდომა შესაძლოა გაგიუქმდეთ. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = გთხოვთ შეტყობინებაში მიუთითოთ სურათის ბმული: { $url } -shotPageKeepFor = რამდენი ხნის განმავლობაში გსურთ სურათის დატოვება? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = დროის მითითება -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = განუსაზღვრელად ∞ -shotPageKeepTenMinutes = 10 წუთით -shotPageKeepOneHour = 1 საათით -shotPageKeepOneDay = 1 დღით -shotPageKeepOneWeek = 1 კვირით -shotPageKeepTwoWeeks = 2 კვირით -shotPageKeepOneMonth = 1 თვით -shotPageSaveExpiration = შენახვა -shotPageCancelExpiration = გაუქმება -shotPageDoesNotExpire = უვადოა -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = ვადა გაუვა -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = ვადა გაუვიდა -timeDiffJustNow = ახლახანს -timeDiffMinutesAgo = 1 წუთის წინ -timeDiffHoursAgo = - { $number -> - [one] 1 საათის წინ - *[other] { $number } საათის წინ - } -timeDiffDaysAgo = - { $number -> - [one] გუშინ - *[other] { $number } დღის წინ - } -timeDiffFutureSeconds = რამდენიმე წუთში -timeDiffFutureMinutes = - { $number -> - [one] 1 წუთში - *[other] { $number } წუთში - } -timeDiffFutureHours = - { $number -> - [one] 1 საათში - *[other] { $number } საათში - } -timeDiffFutureDays = - { $number -> - [one] ხვალ - *[other] { $number } დღეში - } -errorThirdPartyCookiesEnabled = თუ გადაიღეთ სურათი, მაგრამ ვერ ახერხებთ მის წაშლას, სავარაუდოდ, დაგჭირდებათ მესამე მხარის ფუნთუშების დროებით დაშვება, ბრაუზერის პარამეტრებიდან. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = ჩაინიშნეთ! -promoMessage = ჩასწორების ხელსაწყოები განახლებულია და საშუალება გეძლევათ მოჭრათ, გააფერადოთ და სასურველი ტექსტი დაამატოთ გადაღებულ სურათზე. -promoLink = გამოცადეთ -promoCloseButton = - .title = შეტყობინების დახურვა - -## Annotations - -annotationPenButton = - .title = კალამი -annotationHighlighterButton = - .title = მოსანიშნი -annotationUndoButton = - .title = დაბრუნება -annotationRedoButton = - .title = კვლავ შესრულება -annotationTextButton = - .title = ტექსტის დამატება -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = გასუფთავება -annotationCropButton = - .title = ამოჭრა -annotationSaveEditButton = შენახვა - .title = ჩასწორების დამახსოვრება -annotationCancelEditButton = გაუქმება - .title = ჩასწორების გაუქმება -annotationCropConfirmButton = დამოწმება - .title = შერჩევის დამოწმება -annotationCropCancelButton = გაუქმება - .title = შერჩევის გაუქმება -annotationColorWhite = - .title = თეთრი -annotationColorBlack = - .title = შავი -annotationColorRed = - .title = წითელი -annotationColorGreen = - .title = მწვანე -annotationColorBlue = - .title = ლურჯი -annotationColorYellow = - .title = ყვითელი -annotationColorPurple = - .title = იისფერი -annotationColorSeaGreen = - .title = ზღვის მწვანე -annotationColorGrey = - .title = ნაცრისფერი -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = ტექსტის ზომა -# Values shown in text size selection dropdown -textSizeSmall = მცირე -textSizeMedium = საშუალო -textSizeLarge = დიდი -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = თანხმობა - .title = თანხმობა -textToolCancelButton = გაუქმება - .title = გაუქმება -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = გამარჯობა - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = რაღაც ხარვეზი წარმოიქმნა -copyImageErrorMessage = სურათის ასლის აღება ვერ მოხერხდა. - -## Settings Page - -settingsDisconnectButton = კავშირის შეწყვეტა - .title = კავშირის შეწყვეტა -settingsGuestAccountMessage = სტუმრის ანგარიში -settingsSignInButton = შესვლა - .title = შესვლა -SettingsPageHeader = Firefox Screenshots-ის პარამეტრები -settingsFirefoxAccountSubHeader = Firefox-ანგარიში -settingsClosePreferences = - .title = პარამეტრების დახურვა -settingsFxaDisconnectAlertMessage = ნამდვილად გსურთ ამ მოწყობილობის გამოთიშვა Firefox-ანგარიშისგან? -settingsFxaDisconnectDescription = ანგარიშიდან გამოსვლის შემდეგ, ხელახლა დაგჭირდებათ შესვლა, თქვენს გადაღებულ სურათებთან წვდომის აღსადგენად. -settingsFxaConnectDescription = შეგიძლიათ შეხვიდეთ ანგარიშზე, თქვენს გადაღებულ სურათებთან წვდომის მისაღებად სხვადასხვა მოწყობილობებზე. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = შეცდომა სურათის წაშლისას: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = ჩემი გადაღებულები: { $searchTerm }-ის მონახვა -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = შეცდომა გვერდის დამუშავებისას: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = ჩემი გადაღებულების მონახვა -shotIndexPageNoShotsMessage = გადაღებული სურათები არ არის -shotIndexPageNoShotsInvitation = მიდით, შექმენით რამდენიმე. -shotIndexPageLookingForShots = სურათების მოძიება... -shotIndexPageNoSearchResultsIntro = ჰმ -shotIndexPageNoSearchResults = მითითებული ფრაზით, სურათები ვერ მოიძებნა. -shotIndexPageMyShotsButton = - .title = ჩემი გადაღებულები -shotIndexPageClearSearchButton = - .title = ძიების გასუფთავება -shotIndexPageConfirmShotDelete = წაიშალოს ეს სურათი? -shotIndexPagePreviousPage = - .title = წინა გვერდი -shotIndexPageNextPage = - .title = მომდევნო გვერდი -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = ეს არ წარმოადგენს თქვენს რჩეულ გადაღებულ სურათს, შესაბამისად ვადა გაუვა. -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = ეს სურათი რჩეულია და არასდროს გაუვა ვადა -shotIndexSyncedShot = - .title = სხვა მოწყობილობაზეა გადაღებული -shotIndexAlertErrorFavoriteShot = შეცდომა, სურათის რჩეული მდგომარეობის განახლებისას - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = ნამდვილად გსურთ ამ გადაღებული სურათის წაშლა? -shotDeleteCancel = გაუქმება - .title = გაუქმება -shotDeleteConfirm = წაშლა - .title = წაშლა - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = გასატანად: მენიუდან აირჩიეთ ფაილი > გვერდის შენახვა, როგორც... და თქვენი სურათები განთავსდება საქაღალდეში { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots ზომები -metricsPageTotalsQueryTitle = სულ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = სურათების გადახედვა -metricsPageTotalsQueryDevices = სულ დარეგისტრებული მოწყობილობები -metricsPageTotalsQueryActiveShots = არსებული სურათები -metricsPageTotalsQueryExpiredShots = ვადაგასული (აღდგენის შესაძლებლობით) -metricsPageTotalsQueryExpiredDeletedShots = ვადაგასული (და წაშლილი) -metricsPageShotsQueryTitle = სურათები დღეების მიხედვით -metricsPageShotsQueryDescription = დღიურად შექმნილი სურათების რაოდენობა (ბოლო 30 დღეში) -metricsPageShotsQueryCount = სურათების რაოდენობა -metricsPageShotsQueryDay = დღე -metricsPageUsersQueryTitle = მომხმარებლები დღეში -metricsPageUsersQueryDescription = მომხმარებლების რაოდენობა, რომლებიც დღეში სულ მცირე ერთ სურათს მაინც იღებენ (ბოლო 30 დღეში) -metricsPageUsersQueryCount = მომხმარებლების რაოდენობა -metricsPageUsersQueryDay = დღე -metricsPageUserShotsQueryTitle = სურათების რაოდენობა მომხმარებლის მიხედვით -metricsPageUserShotsQueryDescription = მომხმარებელთა რაოდენობა, რომელთაც N სურათი აქვთ -metricsPageUserShotsQueryCount = მომხმარებელთა რაოდენობა -metricsPageUserShotsQueryShots = მიახლოებითი რაოდენობა არსებული (ვადის მქონე) სურათების -metricsPageRetentionQueryTitle = ერთი კვირით დატოვებულები -metricsPageRetentionQueryDescription = დღეების რაოდენობა მომხმარებლის პირველ და ბოლო გადაღებებს შორის, დაყოფილი კვირის დასაწყისით -metricsPageRetentionQueryUsers = მომხმარებელთა რაოდენობა -metricsPageRetentionQueryDays = დღეების რაოდენობა მომხმარებლის პირველ და ბოლო გადაღებებს შორის -metricsPageRetentionQueryFirstWeek = ერთი კვირა, მომხმარებლის პირველი გადაღებიდან -metricsPageTotalRetentionQueryTitle = სულ დატოვებულები -metricsPageTotalRetentionQueryDescription = დროის ხანგრძლივობა, როცა მომხმარებლები იღებენ სურათებს, დაყოფილი კვირის მიხედვით -metricsPageTotalRetentionQueryUsers = მომხმარებელთა რაოდენობა -metricsPageTotalRetentionQueryDays = დღეების რაოდენობა, როცა მომხმარებლები იღებენ სურათებს -metricsPageVersionQueryTitle = დამატების ვერსია -metricsPageVersionQueryDescription = დამატების ეს ვერსია გამოიყენებოდა შესვლისას, ბოლო 14 დღის განვამლობაში -metricsPageVersionQueryUsers = ანგარიშზე შესული მომხმარებელთა რაოდენობა -metricsPageVersionQueryVersion = დამატების ვერსია -metricsPageVersionQueryLastSeen = დღე -metricsPageHeader = მაჩვენებლები -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = შექმნის დრო: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (მონაცემთა ბაზის დრო: { $time }ms) diff --git a/locales/kab/server.ftl b/locales/kab/server.ftl deleted file mode 100644 index 398d139529..0000000000 --- a/locales/kab/server.ftl +++ /dev/null @@ -1,384 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Tuṭṭfiwin-iw -gHomeLink = Asebter agejdan -gNoShots = - .alt = Ulac tuṭṭfiwin -gScreenshotsDescriptionServerless = Tuṭṭfiwin n ugdil fessus-it. Eg sakin sider tuṭṭfiwin n ugdil mebla ma teffɣeḍ seg Firefox. - -## Header - -buttonSettings = - .title = Iɣewwaṛen -buttonSignIn = - .title = Kcem -screenshotsLogo = - .title = Tuṭṭfa n wegdil agejdan -bannerSignIn = Qqen neɣ jerred akken ad tkecmeḍ ar tuṭṭfiwin-ik deg ibenkan daɣen ad teskelseḍ ayen tḥemmleḍ i lebda. -bannerUpsell = { gScreenshotsDescription }Awi Firefox tura -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Amaynut deg Firefox Screenshots? -onboardingPromoMessage = Tura, jerred ɣer Screenshots s umiḍan Firefox u xdem ugar: -onboardingPromoMessageListItem1 = Kcem ɣer temkarḍit-ik/im seg akk ibenkan-inek/inem. -onboardingPromoMessageListItem2 = Sekles tuṭṭfiwin-ik/im inurifen i lebda -onboardingPromoDismissButton = Zgel - .title = Zgel -onboardingPromoSigninButton = Kcem - .title = Kcem - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Tiwtilin -footerLinkPrivacy = Tasertit n tbaḍnit -footerReportShot = Aneqqis n tuṭṭfa - .title = Azen aneqqis n tuṭṭfa-a, ma yella d aspamneɣ uguuren-nniḍen -footerLinkFaqs = Isteqsiyen FAQ -footerLinkDMCA = Mmel-d ataɛdi ɣef ayla agzayan IP -footerLinkDiscourse = Mudd-d tikti-ik -footerLinkRemoveAllData = Kkes akk isefka - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Ti rna { $title } -creatingPageTitleDefault = Asebter -creatingPageWaitMessage = Aklas n tuṭṭfa n ugdil… - -## Home page - -homePageDescription = - .content = Tuṭṭfiwin n ugdil srid seg iminig-ik. Seggem, sekles sakin bḍi tuṭṭfiwin-ik n ugdil s tunigin di Web s Firefox. -homePageButtonMyShots = Ddu γer tuṭṭfiwin inu -homePageTeaser = Ad yilli ticki... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Sider baṭel -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Amek iteddu Firefox Screenshots -homePageGetStartedTitle = Bdu -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Fren tignit n Screenshots seg umuγ n tigawin n usebter deg ufeggag n tansiwin, sakin amuγ Screenshots ad id-ttwasken d asawen deg usfaylu n iminig inek. -homePageCaptureRegion = Ṭṭef tamnaḍt -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Senned u zuγer akken ad tferneḍ tamnaḍt i tebγiḍ ad teṭfeḍ. Neγ mbiwwel γer temnaḍt u sakin Screenshots ad ifren tamnaḍt-agi. sakin senned γef sekles akken ad tawiḍ tiwlafin srid neγ γef tqefalt aneccab d akkesar akken ad d-saliḍ γer uselkim inek. -homePageCapturePage = Ṭṭef asebter -homePageCapturePageDescription = Seqdec taqefalt d afella $yef uyfus akken ad teṭfeḍ akk asebter.Taqefal " sekles tamnaḍt" ad k-teǧǧ ad teṭfeḍ i tzemrepd ad skeneḍ war adrurem, sakin sekles akk asebter. -homePageDownloadCopy = Sider neɣ nɣel -homePageLegalLink = Usḍif -homePagePrivacyLink = Tabaḍnit -homePageTermsLink = Tiwtilin -homePageCookiesLink = Inagan n tuqqna - -## Leave Screenshots page - -leavePageRemoveAllData = Kkes akk isefka -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Ilaq ad ttwasbedden inegzumzn n Firefox neɣ ad teqneḍ deg umiḍan n Firefox akken ad tekseḍ amiḍan-ik -leavePageErrorGeneric = Teḍra-d tuccḍa -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Ayagi ad yekkes ilebda akk isefka n tuṭṭufiwin n ugdil n Firefox. -leavePageButtonProceed = Kemmel -leavePageButtonCancel = Sefsex -leavePageDeleted = Akk tuṭṭfiwin-ik n ugdil ad ttwakksent! - -## Not Found page - -notFoundPageTitle = Ulac asebter -notFoundPageIntro = Ihuh. -notFoundPageDescription = Ulac asebter. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Screenshot: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Tuccḍa deg usekles tagara -shotPageAlertErrorDeletingShot = Tuccḍa di tukksa n ṭṭufa -shotPageAlertErrorUpdatingTitle = Tuccḍa deg usekles n uzwel -shotPageConfirmDelete = Tebɣiḍ ad tekseḍ ṭṭufa-agi i lebda? -shotPageShareButton = - .title = Bḍu -shotPageCopyButton = - .title = Nɣel tugna ɣef affus -shotPageCopyActionLabel = Nɣel -shotPageCopied = Inγel -shotPageShareFacebook = - .title = Bḍu di Facebook -shotPageShareTwitter = - .title = Bḍu di Twitter -shotPageSharePinterest = - .title = Bḍu di Pinterest -shotPageShareEmail = - .title = Bḍu aseγwen s imayl -shotPageShareLink = Awi aseγwen ittwabḍan γer tuṭṭfa-agi: -shotPagePrivacyMessage = Yal yiwen ɣur-s a.seɣwen ad yizmir ad iwali tuṭṭfa-agi. -shotPageCopyImageText = - .label = Nγel aḍris n tewlaft -shotPageConfirmDeletion = Tebɣiḍ ad tekseḍ tuṭṭfa-agi i lebda? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ma yella ur teggiḍ kra, tuṭṭfa-agi ad tettwakkes ilebda . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = Rred armi { $date } -shotPageExpiredMessage = Tuṭṭfa-agi tfat. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Hatan usebter ansa i d-tettwarna: -shotPageDeleteButton = - .title = Kkes tuṭfa-agi -shotPageDownloadShot = - .title = Sider -shotPageEditButton = - .title = Ẓreg tugna-agi -shotPagefavoriteButton = - .title = Smenyif tuṭṭfa-agi -shotPageBackToHomeButton = - .title = Asebter agejdan -shotPageAllShotsButton = - .title = Tuṭṭfiwin meṛṛa -shotPageDMCAMessage = Tuṭṭfa-agi ur tezgi tella imi yella ucetki ɣef wayla agzayan i d-yekkan seg wis kraḍ. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Azen-d { $dmca } akken ad tsutreḍ ugar n telɣut. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ma yella tuṭṭfiwin cetkan-d aṭas fell-asent, yezmer ak-nekkes anekcum ar Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Ttxilek sedu URL n tuṭfa-agi deg imayl inek: { $url } -shotPageKeepFor = Ceḥal n wakud tuṭṭfa-agi ad tettwasekles? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Fren akud -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = war tilas ∞ -shotPageKeepTenMinutes = 10 n tesdatin -shotPageKeepOneHour = 1 n usrag -shotPageKeepOneDay = 1 n wass -shotPageKeepOneWeek = 1 n dduṛt -shotPageKeepTwoWeeks = 2 n dduṛtat -shotPageKeepOneMonth = Aggur -shotPageSaveExpiration = Sekles -shotPageCancelExpiration = Sefsex -shotPageDoesNotExpire = ur yettmettat ara -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = ad yemmet -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = immut -timeDiffJustNow = tura yakan -timeDiffMinutesAgo = { $number } n tesdatin aya -timeDiffHoursAgo = - { $number -> - [one] 1 usrag aya - *[other] { $number } isragen aya - } -timeDiffDaysAgo = - { $number -> - [one] iḍelli - *[other] { $number } n wussan aya - } -timeDiffFutureSeconds = deg kra n tesnatin -timeDiffFutureMinutes = - { $number -> - [one] di 1 n tsedat - *[other] di { $number } tsedatin - } -timeDiffFutureHours = - { $number -> - [one] di 1 usrag - *[other] di { $number } isragen - } -timeDiffFutureDays = - { $number -> - [one] azekka - *[other] di { $number } n wussan - } -errorThirdPartyCookiesEnabled = Ma txeḍmeḍ tuṭṭfa-a sakin ur tezmireḍ ara ad tt-tekseḍ, iwwi-d ahat ad tremdeḍ s wudem askudan inagan n tuqna n wis kraḍ seg Ismenyifen n iminig inek. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Aru tazmilt! -promoMessage = Ifecka n teẓrigt yettwaleqqmen ad k-yeǧǧ ad teṭṭfeḍ, ad tessebṛurqeḍ, daɣen ad ternuḍ aḍris ar tuṭṭfa-ik. -promoLink = Ɛerḍ-it -promoCloseButton = - .title = Mdel alɣu - -## Annotations - -annotationPenButton = - .title = Imru -annotationHighlighterButton = - .title = Aqerru -annotationUndoButton = - .title = Sefsex -annotationRedoButton = - .title = Kkes afsax -annotationTextButton = - .title = Ernu aḍris -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Sfeḍ -annotationCropButton = - .title = Flali -annotationSaveEditButton = Sekles - .title = Asnifel n usekles -annotationCancelEditButton = Sefsex - .title = Asnifel n usefsex -annotationCropConfirmButton = Sentem - .title = SSentem tafrant -annotationCropCancelButton = Sefsex - .title = Sefsex tafrant -annotationColorWhite = - .title = Amellal -annotationColorBlack = - .title = Aberkan -annotationColorRed = - .title = Azggaɣ -annotationColorGreen = - .title = Azegzaw -annotationColorBlue = - .title = Amidadi -annotationColorYellow = - .title = Awraɣ -annotationColorPurple = - .title = Avyuli -annotationColorSeaGreen = - .title = Azegzaw n yil -annotationColorGrey = - .title = Amumad -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Teɣzi n uḍris -# Values shown in text size selection dropdown -textSizeSmall = meẓẓi -textSizeMedium = Alemmas -textSizeLarge = Meqqar -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Sentem - .title = Sentem -textToolCancelButton = Sefsex - .title = Sefsex -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Azul - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Teḍra-d tuccḍa. -copyImageErrorMessage = Ur zmir ara ad inɣel tuṭṭfa-inek ɣer "ɣef afus". - -## Settings Page - -settingsDisconnectButton = Ffeɣ - .title = Ffeɣ -settingsGuestAccountMessage = Amiɛdan n inebgi -settingsSignInButton = Kcem - .title = Kcem -SettingsPageHeader = Iγewwaṛen n tuṭṭfa Firefox -settingsFirefoxAccountSubHeader = Amiḍan Firefox -settingsClosePreferences = - .title = Mdel ismenyifen -settingsFxaDisconnectAlertMessage = Tebɣiḍ ad tekkseḍ tuqqna n ibenk-agi seg umiḍan-ik/im Firefox? -settingsFxaDisconnectDescription = Ma tefɣeḍ, issefk ad teqqneḍ i tikkelt nniḍen akken ad tkecmeḍ ɣer Tuṭṭfiwin n wegdil-ik/im. -settingsFxaConnectDescription = Tzemreḍ ad teqneḍ akken ad tkecmeḍ ɣer tuṭṭfiwin-inek deg ibenkan. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Tuccḍa di tukksa n tuṭṭfat: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Tuṭṭfiwin-iw: anadi n { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Tuccḍa di tririt n usebter: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Nadi tuṭfiwin inu -shotIndexPageNoShotsMessage = Ulac tuṭfiwin ittwaskelsen. -shotIndexPageNoShotsInvitation = Bdu, Rnu kra. -shotIndexPageLookingForShots = Anadi n tuṭfiwin inek… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Ulac tuṭfiwin i γef tettnadiḍ. -shotIndexPageMyShotsButton = - .title = Tuṭṭfiwin-iw -shotIndexPageClearSearchButton = - .title = Sfeḍ anadi -shotIndexPageConfirmShotDelete = Kkes tuṭfa-agi? -shotIndexPagePreviousPage = - .title = Asebter iεeddan -shotIndexPageNextPage = - .title = Asebter i d-iteddun -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Tagi mačči d tuṭṭfa i tḥemmleḍ, ihi ad temmet. -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Wagi d anegzum anurif ur yettmettaten ara -shotIndexSyncedShot = - .title = Tuṭṭfa tella-d deg ibenk nniḍen -shotIndexAlertErrorFavoriteShot = Ted^ḍra-d tucḍa deg uleqqem n waddaden n tuṭṭfwin ismenyifen - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Tebɣiḍ ad tekseḍ tuṭṭfa-yagi? -shotDeleteCancel = Sefsex - .title = Sefsex -shotDeleteConfirm = Kkes - .title = Kkes - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Tasnakta n tuṭṭfiwin n ugdil n Firefox -metricsPageTotalsQueryTitle = Asemday -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Tazwart ar Screenshots -metricsPageTotalsQueryDevices = Amḍan n isuga yettwakelsen -metricsPageTotalsQueryActiveShots = Tuṭṭfiwin iremden -metricsPageTotalsQueryExpiredShots = Immut (maca tzemreḍ ad t-id-rreḍ) -metricsPageTotalsQueryExpiredDeletedShots = Immut ( u ittwakkes) -metricsPageShotsQueryTitle = Tuṭṭfiwin s wass -metricsPageShotsQueryDescription = Amḍan n tuṭṭfiwin yettwarnan yal ass (30 n wussan ineggura) -metricsPageShotsQueryCount = Amḍan n tuṭṭfiwin -metricsPageShotsQueryDay = Ass -metricsPageUsersQueryTitle = Iseqdacen s wass -metricsPageUsersQueryDescription = Amḍan n iseqdacen yernan ɣersum yiwet n tuṭṭfa. s wass (30 n wussan ineggura) -metricsPageUsersQueryCount = Amḍan n iseqdacen -metricsPageUsersQueryDay = Ass -metricsPageUserShotsQueryTitle = Amḍan n tuṭṭfiwin s useqdac -metricsPageUserShotsQueryDescription = Amḍan n iseqdacen isɛan azal n N n tuṭṭfiwin -metricsPageUserShotsQueryCount = Amḍan n iseqdacen -metricsPageUserShotsQueryShots = Amḍan n tiwlafin turmidin ( ur immuten ara) -metricsPageRetentionQueryTitle = Aḥraz n umalas -metricsPageRetentionQueryDescription = Amḍan n wussan seg wasmi aseqdac iṭṭef tuṭṭfa tamezwarut ar tuṭṭfa taneggarut, myizwaren s ddurt n tazwara -metricsPageRetentionQueryUsers = Amḍan n iseqdacen -metricsPageRetentionQueryDays = Ussan gar tuṭṭa tamenzut n useqdac akked tuṭṭfa taneggarut -metricsPageRetentionQueryFirstWeek = Amalas anida aseqdac yerna tuṭṭfa tamenzut -metricsPageTotalRetentionQueryTitle = Amḍan n uḥraz -metricsPageTotalRetentionQueryDescription = Teγzi n wakud n useqdac i d-yernan tuṭṭfa, ttmiyizwaren s ddurt -metricsPageTotalRetentionQueryUsers = Amḍan n iseqdacen -metricsPageTotalRetentionQueryDays = Ussan anida aseqdac irennu tuṭṭfiwin -metricsPageVersionQueryTitle = Lqem n uzegrir -metricsPageVersionQueryDescription = Lqem n uzegrir ittwaqedcen deg unekcum, di 14 ussan inegurra -metricsPageVersionQueryUsers = Amḍan n iseqdacen yeqqnen -metricsPageVersionQueryVersion = Lqem n uzegrir -metricsPageVersionQueryLastSeen = Ass -metricsPageHeader = Tasnakta -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Yettwasirew di: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (akud n taffa n isefka: { $time }ms) diff --git a/locales/kk/server.ftl b/locales/kk/server.ftl deleted file mode 100644 index 36d48e6a85..0000000000 --- a/locales/kk/server.ftl +++ /dev/null @@ -1,391 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Менің скриншоттарым -gHomeLink = Үйге -gNoShots = - .alt = Скриншоттар табылмады -gScreenshotsDescriptionServerless = Скриншоттарды жасау оңай. Скриншоттарды Firefox-тан шықпай-ақ түсіру және жүктеу. - -## Header - -buttonSettings = - .title = Баптаулар -buttonSignIn = - .title = Кіру -screenshotsLogo = - .title = Скриншоттар үй парағы -bannerSignIn = Скриншоттарға әр түрлі құрылғылардан қатынау және таңдамалыларды мәңгі сақтау үшін кіріңіз немесе тіркеліңіз. -bannerUpsell = { gScreenshotsDescription } Firefox-ты қазір алу -shutdownWarning = Сақталған скриншоттар мерзімі жақында аяқталады. Маусым айынан бастап, Скриншоттар тегін онлайн сақтау орнын ұсынбайтын болады. Скриншоттарды кітапханаңызда сақтауды қалайсыз ба? Оларды компьютеріңізге жүктеп алыңыз. -shutdownPageTitle = Скриншоттар ауысуда -shutdownPageDescription = Маусым айынан бастап, Скриншоттар тегін онлайн сақтау орнын ұсынбайтын болады. Скриншоттарды кітапханаңызда сақтауды қалайсыз ба? Скриншоттарды бір-бірдеп, немесе топтап жүктеп алыңыз. Бұл мүмкіндікті қолданғаныңыз үшін рахмет, ыңғайсыздық үшін кешірім сұраймыз. -shutdownPageContinue = Скриншоттар мүмкіндігін скриншоттарды түсіру, көшіру және жүктеп алу үшін қолдануды жалғастыратыныңызға үміттенеміз. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefox скриншоттарында не жаңалық бар? -onboardingPromoMessage = Енді Firefox тіркелгісімен скриншоттарға кіріңіз және көбірек жасаңыз: -onboardingPromoMessageListItem1 = Кітапханаңызға барлық құрылғыларыңыздан қатынаңыз -onboardingPromoMessageListItem2 = Таңдамалы скриншоттарыңызды мәңгі сақтаңыз -onboardingPromoDismissButton = Тайдыру - .title = Тайдыру -onboardingPromoSigninButton = Кіру - .title = Кіру - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Қолдану шарттары -footerLinkPrivacy = Жекелік ескертуі -footerReportShot = Скриншотты хабарлау - .title = Бұл скриншотты ереже бұзу, спам, немесе басқа мәселелері салдарынан хабарлау -footerLinkFaqs = ЖҚС-тер -footerLinkDMCA = Авторлық құқықтардың бұзылуы жөнінде хабарлау -footerLinkDiscourse = Кері байланыс -footerLinkRemoveAllData = Барлық деректерді өшіру - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Жасалуда { $title } -creatingPageTitleDefault = бет -creatingPageWaitMessage = Снапшотты сақтау… - -## Home page - -homePageDescription = - .content = Тура браузердің ішінде қолжетерлік интуитивті скриншоттар. Интернетті Firefox көмегімен шолу кезінде скриншоттарды түсіріңіз, сақтаңыз және олармен бөлісіңіз. -homePageButtonMyShots = Менің скриншоттарыма өту -homePageTeaser = Жақында… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Тегін жүктеп алу -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox скриншоттары қалай жұмыс жасайды -homePageGetStartedTitle = Бастау -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Адрестік жолақтың бет әрекеттері мәзірінен Скриншоттар таңбашасын таңдаңыз, одан кейін Скриншоттар терезесі браузер терезесінің жоғарғы жағынан шығады. -homePageCaptureRegion = Аймақты түсіру -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Түсіргіңіз келетін аймақты таңдау үшін шертіп, тартып апарыңыз. Немесе тек үстіне апарып, шертіңіз — Скриншоттар сайманы аймақты сіз үшін таңдайды. Көргенді ұнаттыңыз ба? Скриншотыңызды желіде сақтау үшін Сақтау, ал, оны компьютеріңізге жүктеп алу үшін, төменге қарап тұрған бағдарша батырмасын басыңыз. -homePageCapturePage = Парақты түсіру -homePageCapturePageDescription = Толық парақтарды түсіру үшін, жоғары оң жақтағы батырмаларды қолданыңыз. Көрінетінді сақтау батырмасы айналдырусыз көрініп тұрған аймақты түсіреді, ал, Толық парақты түсіру парақтағы барлық нәрсені скриншотқа түсіреді. -homePageDownloadCopy = Жүктеу немесе көшіріп алу -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Ең жақсы скриншотты түсіріңіз. Скриншоттар көмегімен таңдауыңызды жүктеп алу немесе алмасу буферіне көшіруге болады. -homePageLegalLink = Құқықтық ақпарат -homePagePrivacyLink = Жекелік -homePageTermsLink = Қолдану шарттары -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Барлық деректерді өшіру -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Тіркелгіңізді өшіру үшін Firefox скриншоттары орнатылған болуы немесе Firefox тіркелгісіне кіруіңіз керек -leavePageErrorGeneric = Қате орын алды -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Бұл әрекет сіздің Firefox скриншоттары деректердің барлығын толығымен өшіреді. -leavePageButtonProceed = Жалғастыру -leavePageButtonCancel = Бас тарту -leavePageDeleted = Сіздің барлық скриншоттарыңыз өшірілді! - -## Not Found page - -notFoundPageTitle = Бет табылмады -notFoundPageIntro = Қате. -notFoundPageDescription = Бет табылмады. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Скриншот: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Аяқталу мерзімін сақтау қатесі -shotPageAlertErrorDeletingShot = Скриншотты өшіру қатесі -shotPageAlertErrorUpdatingTitle = Атауын сақтау қатесі -shotPageConfirmDelete = Бұл скриншотты толығымен өшіруді шынымен қалайсыз ба? -shotPageShareButton = - .title = Бөлісу -shotPageCopyButton = - .title = Суретті алмасу буферіне көшіру -shotPageCopyActionLabel = Көшіріп алу -shotPageCopied = Көшірілген -shotPageShareFacebook = - .title = Facebook-те бөлісу -shotPageShareTwitter = - .title = Twitter-де төлісу -shotPageSharePinterest = - .title = Pinterest-те бөлісу -shotPageShareEmail = - .title = Сілтемемен эл. пошта арқылы бөлісу -shotPageShareLink = Бұл скриншоттың бөлісу сілтемесін алу: -shotPagePrivacyMessage = Сілтемесі бар әр адам бұл скриншотты қарай алады. -shotPageCopyImageText = - .label = Сурет мәтінін көшіріп алу -shotPageConfirmDeletion = Бұл скриншотты толығымен өшіруді шынымен қалайсыз ба? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ешнәрсе жасамасаңыз, бұл скриншот толығымен өшіріледі. -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = ұзартылған { $date } дейін -shotPageExpiredMessage = Бұл скриншоттың мерзімі аяқталған. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Бұл скриншот жасалған парақ: -shotPageDeleteButton = - .title = Бұл скриншотты өшіру -shotPageDownloadShot = - .title = Жүктеп алу -shotPageEditButton = - .title = Бұл суретті түзету -shotPagefavoriteButton = - .title = Бұл скриншотты таңдамалы қылу -shotPageBackToHomeButton = - .title = Үй парағы -shotPageAllShotsButton = - .title = Барлық скриншоттар -shotPageScreenshotsDescriptionServerless = Скриншоттар қарапайым болды. Firefox-тан шықпай-ақ, скриншоттарды түсіріп, жүктеп алыңыз. -shotPageDMCAMessage = Бұл скриншот үшінші жақтың зияткерлік меншігі арызы салдарынан енді қолжетерсіз. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Көбірек білу үшін, { $dmca } адресіне жазыңыз. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Сіздің скриншоттарыңыз көптеген арыздарға тап болса, Firefox скриншоттарына қатынау құқығыңызды өшіруіміз мүмкін. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Эл. пошта хатына бұл скриншоттың URL адресін қосыңыз: { $url } -shotPageKeepFor = Бұл скриншот қанша уақыт бойы сақталуы тиіс? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Уақытты таңдау -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Шексіз ∞ -shotPageKeepTenMinutes = 10 минут -shotPageKeepOneHour = 1 сағат -shotPageKeepOneDay = 1 күн -shotPageKeepOneWeek = 1 апта -shotPageKeepTwoWeeks = 2 апта -shotPageKeepOneMonth = 1 ай -shotPageSaveExpiration = сақтау -shotPageCancelExpiration = бас тарту -shotPageDoesNotExpire = мерзімі аяқталмайды -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = мерзімі аяқталады -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = мерзімі аяқталды -timeDiffJustNow = жаңа ғана -timeDiffMinutesAgo = - { $number -> - *[other] 1 минут бұрын - } -timeDiffHoursAgo = - { $number -> - *[other] 1 сағат бұрын - } -timeDiffDaysAgo = - { $number -> - *[other] кеше - } -timeDiffFutureSeconds = бірнеше секундтан кейін -timeDiffFutureMinutes = - { $number -> - *[other] { $number } минуттан кейін - } -timeDiffFutureHours = - { $number -> - *[other] { $number } сағаттан кейін - } -timeDiffFutureDays = - { $number -> - *[other] { $number } күннен кейін - } -errorThirdPartyCookiesEnabled = Егер сіз бұл скриншотты түсіріп, оны өшіре алмасаңыз, онда сізге браузерде уақытша үшінші жақты cookies файлдарына рұқсат беру керек болуы мүмкін. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Естелікті сақтау! -promoMessage = Жаңартылған түзету құралдары көмегімен скриншотты қию, түспен ерекшелеу және оған тіпті мәтінді де қосуға болады. -promoLink = Оларды қолданып көру -promoCloseButton = - .title = Ескертуді жабу - -## Annotations - -annotationPenButton = - .title = Қалам -annotationHighlighterButton = - .title = Маркер -annotationUndoButton = - .title = Болдырмау -annotationRedoButton = - .title = Қайталау -annotationTextButton = - .title = Мәтінді қосу -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Тазарту -annotationCropButton = - .title = Қию -annotationSaveEditButton = Сақтау - .title = Түзетуді сақтау -annotationCancelEditButton = Бас тарту - .title = Түзетуден бас тарту -annotationCropConfirmButton = Растау - .title = Таңдауды растау -annotationCropCancelButton = Бас тарту - .title = Таңдаудан бас тарту -annotationColorWhite = - .title = Ақ -annotationColorBlack = - .title = Қара -annotationColorRed = - .title = Қызыл -annotationColorGreen = - .title = Жасыл -annotationColorBlue = - .title = Көк -annotationColorYellow = - .title = Сары -annotationColorPurple = - .title = Қызыл көк -annotationColorSeaGreen = - .title = Теңіз жасыл -annotationColorGrey = - .title = Сұр -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Мәтін өлшемі -# Values shown in text size selection dropdown -textSizeSmall = Кіші -textSizeMedium = Орташа -textSizeLarge = Үлкен -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Растау - .title = Растау -textToolCancelButton = Бас тарту - .title = Бас тарту -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Сәлеметсіз бе - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Бірнәрсе қате кетті -copyImageErrorMessage = Скриншотыңызды алмасу буферіне көшіру мүмкін емес. - -## Settings Page - -settingsDisconnectButton = Байланысты үзу - .title = Байланысты үзу -settingsGuestAccountMessage = Қонақ тіркелгісі -settingsSignInButton = Кіру - .title = Кіру -SettingsPageHeader = Firefox Screenshots баптаулары -settingsFirefoxAccountSubHeader = Firefox тіркелгісі -settingsClosePreferences = - .title = Баптауларды жабу -settingsFxaDisconnectAlertMessage = Бұл құрылғыны Firefox тіркелгіңізден ажыратқыңыз келе ме? -settingsFxaDisconnectDescription = Шығатын болсаңыз, скриншоттарға қатынау үшін қайтадан кіруіңіз керек болады. -settingsFxaConnectDescription = Құрылғыларыңыздағы скриншоттарға қатынау үшін кіруіңізге болады. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Скриншотты сақтау қатесі: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Менің скрншоттарым: { $searchTerm } іздеу -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Парақты рендерлеу қатесі: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Менің скриншоттарымнан іздеу -shotIndexPageNoShotsMessage = Сақталған скриншоттар жоқ. -shotIndexPageNoShotsInvitation = Бірнешеуін сақтаңыз. -shotIndexPageLookingForShots = Скриншоттарыңызды іздеу… -shotIndexPageNoSearchResultsIntro = Хмм -shotIndexPageNoSearchResults = Іздеуіңізге сай скриншоттар табылмады. -shotIndexPageMyShotsButton = - .title = Менің скриншоттарым -shotIndexPageClearSearchButton = - .title = Іздеуді тазарту -shotIndexPageConfirmShotDelete = Бұл скриншотты өшіру керек пе? -shotIndexPagePreviousPage = - .title = Алдыңғы бет -shotIndexPageNextPage = - .title = Келесі бет -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Бұл таңдамалы скриншот емес, оның мерзімі бітеді -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Бұл скриншот таңдамалы, оның мерзімі аяқталмайды -shotIndexSyncedShot = - .title = Басқа құрылғыда алынған скриншот -shotIndexAlertErrorFavoriteShot = Таңдамалы скриншот күйін жаңарту қатесі - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Бұл скриншотты өшіруді шынымен қалайсыз ба? -shotDeleteCancel = Бас тарту - .title = Бас тарту -shotDeleteConfirm = Өшіру - .title = Өшіру - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Экспорттау үшін: Файл> Бетті қалайша сақтау… қолданыңыз және скриншоттарды { $folder } бумасынан таба аласыз - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox скриншоттар метрикалары -metricsPageTotalsQueryTitle = Барлығы -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Скриншоттарды шолу -metricsPageTotalsQueryDevices = Барлығы тіркелген құрылғылар -metricsPageTotalsQueryActiveShots = Белсенді скриншоттар -metricsPageTotalsQueryExpiredShots = Мерзімі аяқталған (бірақ, қалпына келтіруге болатын) -metricsPageTotalsQueryExpiredDeletedShots = Мерзімі аяқталған (және өшірілген) -metricsPageShotsQueryTitle = Күндер бойынша скриншоттар -metricsPageShotsQueryDescription = Әр күнде жасалған скриншоттар саны (соңғы 30 күн үшін) -metricsPageShotsQueryCount = Скриншоттар саны -metricsPageShotsQueryDay = Күн -metricsPageUsersQueryTitle = Күн бойынша пайдаланушылар -metricsPageUsersQueryDescription = Кем дегенде бір скриншотты жасаған пайдаланушылар саны, күн бойынша (соңғы 30 күнде) -metricsPageUsersQueryCount = Пайданушылар саны -metricsPageUsersQueryDay = Күн -metricsPageUserShotsQueryTitle = Пайдаланушы бойынша скриншоттар саны -metricsPageUserShotsQueryDescription = Жалпы N скриншотты жасаған пайдаланушылар саны -metricsPageUserShotsQueryCount = Пайдаланушылар саны -metricsPageUserShotsQueryShots = Белсенді (мерзімі бітпеген) скриншоттардың болжалды саны -metricsPageRetentionQueryTitle = Апта бойынша сақталу -metricsPageRetentionQueryDescription = Пайдаланушының алғашқы скриншотынан ең соңғысына дейінгі күндер саны, апта басы бойынша топталған -metricsPageRetentionQueryUsers = Пайдаланушылар саны -metricsPageRetentionQueryDays = Пайдаланушының алғашқы скриншотынан ең соңғысына дейінгі күндер саны -metricsPageRetentionQueryFirstWeek = Пайдаланушы алғашқы скриншотты жасаған апта -metricsPageTotalRetentionQueryTitle = Жалпы саны -metricsPageTotalRetentionQueryDescription = Пайдаланушы скриншоттарды жасап жүрген уақыт өлшемі, апта бойынша топталған -metricsPageTotalRetentionQueryUsers = Пайданушылар саны -metricsPageTotalRetentionQueryDays = Пайдаланушы скриншоттарды жасаған күндер -metricsPageVersionQueryTitle = Қосымша нұсқасы -metricsPageVersionQueryDescription = Жүйеге кіру кезінде қолданылған қосымша нұсқасы, соңғы 14 күнде -metricsPageVersionQueryUsers = Жүйеге кірген пайдаланушылар саны -metricsPageVersionQueryVersion = Қосымша нұсқасы -metricsPageVersionQueryLastSeen = Күн -metricsPageHeader = Метрикалар -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Жиналған: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (дерекқор уақыты: { $time } мс) diff --git a/locales/km/server.ftl b/locales/km/server.ftl deleted file mode 100644 index 3563fc606e..0000000000 --- a/locales/km/server.ftl +++ /dev/null @@ -1,119 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = រូបថត​របស់​ខ្ញុំ -gHomeLink = ទំព័រដើម - -## Header - - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = លក្ខខណ្ឌ -footerLinkPrivacy = ការ​ជូន​ដំណឹង​​ឯកជនភាព -footerLinkFaqs = សំណួរ​ដែល​សួរ​ញឹកញាប់ -footerLinkDMCA = រាយការណ៍ការបំពាន​តាម IP -footerLinkDiscourse = ផ្ដល់​មតិ​កែលម្អ -footerLinkRemoveAllData = យកទិន្នន័យទាំងអស់ចេញ - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = កំពុង​បង្កើត { $title } -creatingPageTitleDefault = ទំព័រ -creatingPageWaitMessage = កំពុងរក្សាទុករូបថតរបស់អ្នក… - -## Home page - -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = ទាញ​យក​ដោយ​ឥត​គិត​ថ្លៃ -homePageGetStartedTitle = បាន​ចាប់ផ្ដើម -homePagePrivacyLink = ភាពឯកជន - -## Leave Screenshots page - -leavePageButtonCancel = បោះបង់ - -## Not Found page - -notFoundPageTitle = រក​មិន​ឃើញ​ទំព័រ -notFoundPageDescription = រក​មិន​ឃើញ​ទំព័រ។ - -## Shot page - -shotPageAlertErrorUpdatingTitle = កំហុសក្នុងការរក្សាទុកចំណងជើង -shotPageShareButton = - .title = ចែករំលែក -shotPageCopied = បានចម្លង -shotPageShareFacebook = - .title = ចែករំលែកលើ Facebook -shotPageShareTwitter = - .title = ចែករំលែកលើ Twitter -shotPageSharePinterest = - .title = ចែករំលែកលើ Pinterest -shotPageShareEmail = - .title = ចែករំលែក​តំណ​តាមអ៊ីមែល -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = នេះជាទំព័រដែលវាត្រូវបានបង្កើតដំបូងពី៖ -shotPageDownloadShot = - .title = ទាញយក -shotPageSaveExpiration = រក្សាទុក -shotPageCancelExpiration = បោះបង់ - -## Shot Page New Feature Promotion Dialog. - -promoCloseButton = - .title = បិទ​ការ​ជូនដំណឹង​ - -## Annotations - -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = សម្អាត -annotationSaveEditButton = រក្សាទុក - .title = រក្សាទុកការកែសម្រួល -annotationCancelEditButton = បោះបង់ - .title = បោះបង់ការកែសម្រួល -annotationColorWhite = - .title = ពណ៌ស - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - - -## Settings Page - - -## Shotindex page - -shotIndexPageClearSearchButton = - .title = ជម្រះ​ការ​ស្វែងរក -shotIndexPagePreviousPage = - .title = ទំព័រ​មុន -shotIndexPageNextPage = - .title = ទំព័រ​បន្ទាប់ - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = តើអ្នកប្រាកដជាចង់លុបរូបថតនេះមែនទេ? -shotDeleteCancel = បោះបង់ - .title = បោះបង់ -shotDeleteConfirm = លុប - .title = លុប - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -metricsPageTotalsQueryDevices = ឧបករណ៍សរុបបានចុះឈ្មោះ -metricsPageUsersQueryCount = ចំនួនអ្នកប្រើ diff --git a/locales/kn/server.ftl b/locales/kn/server.ftl deleted file mode 100644 index 30f99bb3dd..0000000000 --- a/locales/kn/server.ftl +++ /dev/null @@ -1,176 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = ನನ್ನ ತೆರೆಚಿತ್ರಗಳು -gHomeLink = ನೆಲೆ -gNoShots = - .alt = ಯಾವುದೇ ತೆರೆಗಳು ಕಂಡುಬಂದಿಲ್ಲ -gSettings = ಸಿದ್ಧತೆಗಳು -gSignIn = ಪ್ರವೇಶಿಸು - -## Header - -signInButton = - .aria-label = ಪ್ರವೇಶಿಸು -settingsButton = - .aria-label = ಸಿದ್ಧತೆಗಳು - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = ನಿಯಮಗಳು -footerLinkPrivacy = ಗೌಪ್ಯತಾ ಸೂಚನೆ -footerLinkFaqs = ಸಾಮಾನ್ಯವಾಗಿ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು -footerLinkDiscourse = ಪ್ರತಿಕ್ರಿಯೆ ನೀಡು -footerLinkRemoveAllData = ಎಲ್ಲಾ ದತ್ತಾಂಶವನ್ನು ತೆಗೆದು ಹಾಕು - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } ಸೃಷ್ಠಿಸಲಾಗುತ್ತಿದೆ -creatingPageTitleDefault = ಪುಟ -creatingPageWaitMessage = ತೆರೆಚಿತ್ರವನ್ನು ಉಳಿಸಲಾಗುತ್ತಿದೆ… - -## Home page - -homePageButtonMyShots = ನನ್ನ ತೆರೆಚಿತ್ರಗಳಿಗೆ ಹೋಗು -homePageTeaser = ಸದ್ಯದಲ್ಲೇ ಬರುತ್ತಿದೆ... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = ಉಚಿತ ಡೌನ್‌ಲೋಡು -homePageGetStartedTitle = ಪ್ರಾರಂಭಿಸಿರಿ -homePageLegalLink = ಕಾನೂನು -homePagePrivacyLink = ಗೌಪ್ಯತೆ -homePageTermsLink = ನಿಯಮಗಳು -homePageCookiesLink = ಕುಕಿಗಳು - -## Leave Screenshots page - -leavePageRemoveAllData = ಎಲ್ಲಾ ದತ್ತಾಂಶವನ್ನು ತೆಗೆದು ಹಾಕು -leavePageErrorGeneric = ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ -leavePageButtonProceed = ಮುಂದುವರಿಸಿ -leavePageButtonCancel = ರದ್ದು ಮಾಡು - -## Not Found page - -notFoundPageTitle = ಪುಟವು ಕಂಡುಬಂದಿಲ್ಲ -notFoundPageIntro = ಓಹ್. -notFoundPageDescription = ಪುಟವು ಕಂಡುಬಂದಿಲ್ಲ. - -## Shot page - -shotPageAlertErrorUpdatingTitle = ಶೀರ್ಷಿಕೆ ಉಳಿಸುವಲ್ಲಿ ದೋಷ -shotPageConfirmDelete = ಈ ತೆರೆಚಿತ್ರವನ್ನು ನೀವು ಖಚಿತವಾಗಿಯೂ ಅಳಿಸಲು ಬಯಸುತ್ತೀರ? -shotPageShareButton = - .title = ಹಂಚು -shotPageCopy = ನಕಲಿಸು -shotPageCopied = ನಕಲಿಸಲಾಗಿದೆ -shotPageDownloadShot = - .title = ಡೌನ್‌ಲೋಡ್ -shotPageEditButton = - .title = ಈ ಚಿತ್ರ ಸಂಪಾದಿಸಿ -shotPageDownload = ಡೌನ್‌ಲೋಡ್ -shotPageUpsellFirefox = ಈಗ ಫೈರ್ಫಾಕ್ಸ್ ಪಡೆದುಕೊಳ್ಳಿ -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = ಸಮಯ ಆಯ್ಕೆಮಾಡು -shotPageKeepTenMinutes = ೧೦ ನಿಮಿಷಗಳು -shotPageKeepOneHour = ೧ ಗಂಟೆ -shotPageKeepOneDay = ೧ ದಿನ -shotPageKeepOneWeek = ೧ ವಾರ -shotPageKeepTwoWeeks = ೨ ವಾರಗಳು -shotPageKeepOneMonth = ೧ ತಿಂಗಳು -shotPageSaveExpiration = ಉಳಿಸು -shotPageCancelExpiration = ರದ್ದುಮಾಡಿ -timeDiffJustNow = ಈಗಷ್ಟೆ - -## Shot Page New Feature Promotion Dialog. - - -## Annotations - -annotationPenButton = - .title = ಪೆನ್ -annotationHighlighterButton = - .title = ಹೈಲೈಟರ್ -annotationUndoButton = - .title = ರದ್ದುಗೊಳಿಸು -annotationRedoButton = - .title = ಮರುಕಳಿಸು -annotationTextButton = - .title = ಪಠ್ಯ ಸೇರಿಸು -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = ಅಳಿಸು -annotationCropButton = - .title = ಕತ್ತರಿಸು -annotationSaveEditButton = ಉಳಿಸು - .title = ಸಂಪಾದನೆ ಉಳಿಸು -annotationCancelEditButton = ರದ್ದುಗೊಳಿಸು - .title = ಸಂಪಾದನೆ ರದ್ದುಗೊಳಿಸು -annotationCropConfirmButton = ದೃಢಪಡಿಸು - .title = ಆಯ್ಕೆ ದೃಢಪಡಿಸು -annotationCropCancelButton = ರದ್ದುಗೊಳಿಸು - .title = ಆಯ್ಕೆ ರದ್ದುಗೊಳಿಸು -annotationColorWhite = - .title = ಬಿಳಿ -annotationColorBlack = - .title = ಹಿಂದೆ -annotationColorRed = - .title = ಕೆಂಪು -annotationColorGreen = - .title = ಹಸಿರು -annotationColorBlue = - .title = ನೀಲಿ -annotationColorYellow = - .title = ಹಳದಿ -annotationColorPurple = - .title = ನೇರಳೆ -annotationColorGrey = - .title = ಬೂದು -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = ಪಠ್ಯದ ಗಾತ್ರ -# Values shown in text size selection dropdown -textSizeSmall = ಚಿಕ್ಕ -textSizeMedium = ಮಾಧ್ಯಮ -textSizeLarge = ದೊಡ್ಡದು -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = ಖಚಿತಪಡಿಸು - .title = ಖಚಿತಪಡಿಸು -textToolCancelButton = ರದ್ದುಗೊಳಿಸು - .title = ರದ್ದುಗೊಳಿಸು -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = ಹಲೋ - -## Settings Page - -settingsDisconnectButton = ಸಂಪರ್ಕ ತೆಗೆ - .title = ಸಂಪರ್ಕ ತೆಗೆ - -## Shotindex page - -shotIndexPagePreviousPage = - .title = ಹಿಂದಿನ ಪುಟ -shotIndexPageNextPage = - .title = ಮುಂದಿನ ಪುಟ - -## Delete Confirmation Dialog - -shotDeleteCancel = ರದ್ದುಗೊಳಿಸು - .title = ರದ್ದುಗೊಳಿಸು -shotDeleteConfirm = ಅಳಿಸು - .title = ಅಳಿಸು - -## Metrics page -## All metrics strings are optional for translation - -metricsPageTotalsQueryTitle = ಒಟ್ಟು -metricsPageShotsQueryDay = ದಿನ -metricsPageUsersQueryDay = ದಿನ -metricsPageVersionQueryLastSeen = ದಿನ diff --git a/locales/ko/server.ftl b/locales/ko/server.ftl deleted file mode 100644 index a1e2b92136..0000000000 --- a/locales/ko/server.ftl +++ /dev/null @@ -1,294 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = 내 스크린샷 -gHomeLink = 홈 -gNoShots = - .alt = 스크린샷 없음 - -## Header - -buttonSettings = - .title = 설정 -buttonSignIn = - .title = 로그인 -screenshotsLogo = - .title = Screenshots 홈 - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = 이용약관 -footerLinkPrivacy = 개인 정보 보호 안내 -footerLinkFaqs = 자주 묻는 질문들 -footerLinkDMCA = IP 침해 신고 -footerLinkDiscourse = 사용자 의견 -footerLinkRemoveAllData = 모든 데이터 삭제 - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } 만들기 -creatingPageTitleDefault = 페이지 -creatingPageWaitMessage = 스크린샷 저장중… - -## Home page - -homePageDescription = - .content = 브라우저 안에서 직관적으로 스크린샷을 만들 수 있습니다. Firefox를 이용해서 웹을 브라우징 하면서 스크린샷을 찍고 저장하고 공유할 수 있습니다. -homePageButtonMyShots = 내 스크린샷 -homePageTeaser = 곧 공개됩니다… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = 무료 다운로드 -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots 사용법 -homePageGetStartedTitle = 시작하기 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = 검색 주소창의 페이지 작업 메뉴에서 스크린샷 아이콘을 선택하면 브라우저 창의 상단에 스크린샷 메뉴가 나타납니다. -homePageCaptureRegion = 영역 캡처 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = 캡처할 영역을 드래그해서 선택하세요. 아니면 그냥 마우스를 올리고 클릭하세요 — 스크린샷이 자동으로 영역을 선택해줍니다. 마음에 드세요? 저장을 누르면 온라인에서 스크린샷에 접근할 수 있고 아래 방향 화살표를 누르면 컴퓨터에 다운 받을 수 있습니다. -homePageCapturePage = 페이지 캡처 -homePageCapturePageDescription = 전체 페이지를 캡처하기 위해서 오른쪽 상단에 있는 버튼을 사용하세요. 보이는 영역 저장 버튼은 스크롤 하지 않은 현재 보고 있는 영역을 캡처하고 전체 페이지 저장은 페이지의 모든 내용을 캡처합니다. -homePageLegalLink = 법률 -homePagePrivacyLink = 개인정보 -homePageTermsLink = 이용약관 -homePageCookiesLink = 쿠키 - -## Leave Screenshots page - -leavePageRemoveAllData = 모든 데이터 삭제 -leavePageErrorGeneric = 오류 발생 -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = 모든 Firefox Screenshots 데이터가 영구적으로 지워집니다. -leavePageButtonProceed = 진행 -leavePageButtonCancel = 취소 -leavePageDeleted = 모든 스크린샷이 삭제되었습니다! - -## Not Found page - -notFoundPageTitle = 페이지를 찾을 수 없음 -notFoundPageIntro = 이런! -notFoundPageDescription = 페이지를 찿을수 없습니다. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = 스크린샷: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = 만료일 저장 중 오류 -shotPageAlertErrorDeletingShot = 스크린샷 삭제 중 오류 -shotPageAlertErrorUpdatingTitle = 제목 저장 중 오류 -shotPageConfirmDelete = 이 스크린샷을 영구적으로 삭제하시겠습니까? -shotPageShareButton = - .title = 공유 -shotPageCopied = 복사됨 -shotPageShareFacebook = - .title = 페이스북에 공유 -shotPageShareTwitter = - .title = 트위터에 공유 -shotPageSharePinterest = - .title = 핀터레스트에 공유 -shotPageShareEmail = - .title = 이메일로 공유 -shotPageShareLink = 이 스크린샷의 공유 링크: -shotPagePrivacyMessage = 이 링크가 있는 사람은 이 스크린샷을 볼 수있습니다. -shotPageCopyImageText = - .label = 이미지 텍스트 복사 -shotPageConfirmDeletion = 이 스크린샷을 영구적으로 삭제하시겠습니까? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = 아무것도 하지 않으신다면, 이 스크린샷은 내로 삭제됩니다. -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date }까지 복구 -shotPageExpiredMessage = 이 스크린샷은 만료되었습니다. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = 이 스크린샷의 원본 페이지: -shotPageDeleteButton = - .title = 이 스크린샷 삭제 -shotPageDownloadShot = - .title = 다운로드 -shotPageEditButton = - .title = 현재 이미지 편집 -shotPageDMCAMessage = 저작권상의 문제로 이 스크린샷을 더 이상 표시할 수 없습니다. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = 자세한 사항은 { $dmca }으로 문의하시기 바랍니다. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = 스크린샷 신고 횟수가 많아지면, Firefox 스크린샷 사용 권한을 회수할 수도 있습니다. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = 이 스크린샷의 URL을 이메일에 첨부해 주세요. URL: { $url } -shotPageKeepFor = 이 스크린샷을 얼마나 오래 유지하시겠습니까? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = 시간 선택 -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = 무제한 ∞ -shotPageKeepTenMinutes = 10분 -shotPageKeepOneHour = 1시간 -shotPageKeepOneDay = 1일 -shotPageKeepOneWeek = 1주 -shotPageKeepTwoWeeks = 2주 -shotPageKeepOneMonth = 1개월 -shotPageSaveExpiration = 저장 -shotPageCancelExpiration = 취소 -shotPageDoesNotExpire = 만료되지 않음 -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = 에 만료 -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = 에 만료됨 -timeDiffJustNow = 방금 전 -timeDiffMinutesAgo = { $number }분 전 -timeDiffHoursAgo = { $number }시간 전 -timeDiffDaysAgo = { $number }일 전 -timeDiffFutureSeconds = 몇 초 전 -timeDiffFutureMinutes = { $number }분 내 -timeDiffFutureHours = { $number }시간 내 -timeDiffFutureDays = { $number }일 내 -errorThirdPartyCookiesEnabled = 이 스크린샷을 삭제할 수 없다면 브라우저의 설정에서 제3자 쿠키를 일시적으로 활성화해야 할 수도 있습니다. - -## Shot Page New Feature Promotion Dialog. - - -## Annotations - -annotationPenButton = - .title = 펜 -annotationHighlighterButton = - .title = 하이라이터 -annotationUndoButton = - .title = 실행 취소 -annotationRedoButton = - .title = 다시 실행 -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = 지우기 -annotationCropButton = - .title = 자르기 -annotationSaveEditButton = 저장 - .title = 편집 저장 -annotationCancelEditButton = 취소 - .title = 편집 취소 -annotationCropConfirmButton = 확인 - .title = 선택 확인 -annotationCropCancelButton = 취소 - .title = 선택 취소 -annotationColorWhite = - .title = 흰색 -annotationColorBlack = - .title = 검정 -annotationColorRed = - .title = 빨강 -annotationColorGreen = - .title = 초록 -annotationColorBlue = - .title = 파랑 -annotationColorYellow = - .title = 노랑 -annotationColorPurple = - .title = 보라 -annotationColorSeaGreen = - .title = 해록색 -annotationColorGrey = - .title = 회색 - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - - -## Settings Page - -settingsDisconnectButton = 연결 끊기 - .title = 연결 끊기 -settingsGuestAccountMessage = 게스트 계정 -settingsSignInButton = 로그인 - .title = 로그인 -SettingsPageHeader = Firefox Screenshots 설정 -settingsClosePreferences = - .title = 환경 설정 닫기 - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = 스크린샷 삭제 중 오류: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = 내 스크린샷: { $searchTerm }으로 검색 -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = 페이지 렌더링 중 오류: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = 내 스크린샷 검색 -shotIndexPageNoShotsMessage = 저장된 스크린샷이 없습니다. -shotIndexPageNoShotsInvitation = 하나 만들어 보세요. -shotIndexPageLookingForShots = 스크린샷 찾아보는 중.. -shotIndexPageNoSearchResultsIntro = 흐음 -shotIndexPageNoSearchResults = 검색하신 스크린샷을 찾지 못했습니다. -shotIndexPageClearSearchButton = - .title = 검색 지우기 -shotIndexPageConfirmShotDelete = 이 스크린샷을 삭제하시겠어요? -shotIndexPagePreviousPage = - .title = 이전 페이지 -shotIndexPageNextPage = - .title = 다음 페이지 - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = 이 스크린샷을 삭제하시겠습니까? -shotDeleteCancel = 취소 - .title = 취소 -shotDeleteConfirm = 삭제 - .title = 삭제 - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots 통계 -metricsPageTotalsQueryTitle = 전체 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = 스크린샷 개요 -metricsPageTotalsQueryDevices = 등록된 모든 기기 -metricsPageTotalsQueryActiveShots = 활성화된 스크린샷 -metricsPageTotalsQueryExpiredShots = 만료됨 (복구 가능) -metricsPageTotalsQueryExpiredDeletedShots = 만료됨 (복구 불가능) -metricsPageShotsQueryTitle = 일별 스크린샷 -metricsPageShotsQueryDescription = 하루에 만들어진 스크린샷 수 (최근 30일 내) -metricsPageShotsQueryCount = 스크린샷 수 -metricsPageShotsQueryDay = 일 -metricsPageUsersQueryTitle = 일별 사용자 -metricsPageUsersQueryDescription = 하루에 최소 한 번 스크린샷을 찍은 사용자의 수 (지난 30일간) -metricsPageUsersQueryCount = 사용자 수 -metricsPageUsersQueryDay = 일 -metricsPageUserShotsQueryTitle = 사용자 당 스크린샷 수 -metricsPageUserShotsQueryDescription = 대략 N개의 스크린샷을 가지고 있는 사용자 수 -metricsPageUserShotsQueryCount = 사용자 수 -metricsPageUserShotsQueryShots = 유효한(만료되지 않은) 스크린샷의 대략적인 수 -metricsPageRetentionQueryTitle = 주별 보유 -metricsPageRetentionQueryDescription = 사용자의 첫번째 스크린 샷에서 최근 스크린샷까지의 날짜를 시작 주로 묶음 -metricsPageRetentionQueryUsers = 사용자 수 -metricsPageRetentionQueryDays = 사용자의 가장 최근에 찍은 스크린샷으로 부터의 날수 -metricsPageRetentionQueryFirstWeek = 사용자가 처음으로 스크린샷을 찍었던 주 -metricsPageTotalRetentionQueryTitle = 전체 보유 -metricsPageTotalRetentionQueryDescription = 사용자가 스크린샷을 만든 시간의 길이를 주별로 묶음 -metricsPageTotalRetentionQueryUsers = 사용자 수 -metricsPageTotalRetentionQueryDays = 사용자가 스크린샷을 찍은 후 날수 -metricsPageVersionQueryTitle = 부가 기능 버전 -metricsPageVersionQueryDescription = 지난 14일간 로그인하는동안 사용된 부가 기능의 버전 -metricsPageVersionQueryUsers = 로그인한 사용자 수 -metricsPageVersionQueryVersion = 부가 기능 버전 -metricsPageVersionQueryLastSeen = 일 -metricsPageHeader = 수치 -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = 생성: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (데이터베이스 시간 : { $time }ms) diff --git a/locales/lij/server.ftl b/locales/lij/server.ftl deleted file mode 100644 index 1d79515dfc..0000000000 --- a/locales/lij/server.ftl +++ /dev/null @@ -1,92 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = E mæ föto -gHomeLink = Pagina prinçipâ -gNoShots = - .alt = Nisciunn-a föto atrovâ -gScreenshotsDescription = O Screenshots o vegnî e cöse façili. Fanni föto, sarvili e condividdili sensa mai lasciâ Firefox. - -## Header - -buttonSettings = - .title = Inpostaçioin -buttonSignIn = - .title = Intra -screenshotsLogo = - .title = Pagina prinçipâ de Screenshots -bannerSignIn = Intra ò registrite pe acede a-e teu föto spantegæ in sci teu dispoxitivi e sarva quelle che te piaxan de ciù pe de longo. -bannerUpsell = { gScreenshotsDescription } Piggite Firefox oua -onboardingPromoSigninButton = Intra - .title = Intra - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Termini -footerLinkPrivacy = Informativa in sciâ privacy -footerLinkFaqs = Domande e risposte -footerLinkDiscourse = Comenta -footerLinkRemoveAllData = Scancella tutti i dæti - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Creo { $title } -creatingPageTitleDefault = pagina -creatingPageWaitMessage = Registraçion föto… - -## Home page - -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Scarega de badda -homePageGetStartedTitle = Pe iniçiâ - -## Leave Screenshots page - -leavePageButtonCancel = Anulla - -## Not Found page - -notFoundPageTitle = Pagina no atrovâ -notFoundPageIntro = Ahime mi! -notFoundPageDescription = Pagina no atrovâ. - -## Shot page - -shotPageShareButton = - .title = Condividdi -shotPageCopyButton = - .title = Còpia inmagine inti aponti -shotPageCopied = Copiou - -## Shot Page New Feature Promotion Dialog. - - -## Annotations - - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorMessage = No riescio a copiâ a teu föto inti aponti. - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/lo/server.ftl b/locales/lo/server.ftl deleted file mode 100644 index 6f0a34c6d0..0000000000 --- a/locales/lo/server.ftl +++ /dev/null @@ -1,130 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = ພາບຂອງຂ້ອຍ -gHomeLink = ໜ້າຫຼັກ - -## Header - - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = ຂໍ້ກຳນົດ -footerLinkPrivacy = ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ -footerLinkFaqs = ຄຳຖາມທີພົບເປັນປະຈຳ -footerLinkDMCA = ລາຍງານການລະເມິດຊັບສີນທາງປັນຍາ -footerLinkDiscourse = ໃຫ້ຄຳແນະນຳ -footerLinkRemoveAllData = ນຳຂໍ້ມູນທັງຫມົດອອກ - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = ກຳລັງສ້າງ { $title } -creatingPageTitleDefault = ຫນ້າ - -## Home page - -homePageTeaser = ໄວໆນີ້… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = ດາວໂຫລດຟຣີ -homePageGetStartedTitle = ເລີ່ມຕົ້ນໃຊ້ງານ -homePageSaveShare = ບັນທືກ ແລະ ແບ່ງປັນ -homePageLegalLink = ຂໍ້ກົດຫມາຍ -homePagePrivacyLink = ຄວາມເປັນສ່ວນຕົວ -homePageTermsLink = ຂໍ້ກຳນົດ -homePageCookiesLink = ຄຸກກີ - -## Leave Screenshots page - -leavePageRemoveAllData = ນຳເອົາຂໍ້ມູນທັງຫມົດອອກ -leavePageErrorGeneric = ເກີດຂໍ້ຜິດພາດ -leavePageButtonProceed = ດໍາເນີນການຕໍ່ -leavePageButtonCancel = ຍົກເລີກ - -## Not Found page - -notFoundPageTitle = ບໍ່ພົບຫນ້ານີ້ -notFoundPageIntro = ອຸ່ຍ. -notFoundPageDescription = ບໍ່ພົບຫນ້ານີ້. - -## Shot page - -shotPageAlertErrorUpdatingTitle = ເກີດຂໍ້ຜິິດພາດໃນການບັນທືກຊື່ເລື່ອງ -shotPageConfirmDelete = ທ່ານຫມັ້ນໃຈແລ້ວບໍ່ວ່າຕ້ອງການລຶບພາບນີ້ຢ່າງຖາວອນ? -shotPageShareButton = - .title = ແບ່ງປັນ -shotPageCopied = ສຳເນົາແລ້ວ! -shotPageShareFacebook = - .title = ແບ່ງປັນໃນ Facebook -shotPageShareTwitter = - .title = ແບ່ງປັນໃນ Twitter -shotPageSharePinterest = - .title = ແບ່ງປັນໃນ Pinterest -shotPageConfirmDeletion = ທ່ານຫມັ້ນໃຈແລ້ວບໍ່ວ່າຕ້ອງການລຶບພາບນີ້ຢ່າງຖາວອນ? -shotPageDownloadShot = - .title = ດາວໂຫລດ -shotPageEditButton = - .title = ແກ້ໄຂຮູບພາບນີ້ -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = ເລືອກເວລາ -shotPageKeepTenMinutes = 10 ນາທີ -shotPageKeepOneHour = 1 ຊົ່ວໂມງ -shotPageKeepOneDay = 1 ມື້ -shotPageKeepOneWeek = 1 ອາທິດ -shotPageKeepTwoWeeks = 2 ອາທິດ -shotPageKeepOneMonth = 1 ເດືອນ -shotPageSaveExpiration = ບັນທຶກ -shotPageCancelExpiration = ຍົກເລີກ -shotPageDoesNotExpire = ບໍ່ຫມົດອາຍຸ -timeDiffJustNow = ມື້ກີ້ນີ້ -timeDiffMinutesAgo = - { $number -> - *[other] { $number } ນາທີກ່ອນຫນ້ານີ້ - } -timeDiffHoursAgo = - { $number -> - *[other] { $number } ຊົ່ວໂມງກ່ອນຫນ້ານີ້ - } -timeDiffDaysAgo = - { $number -> - *[other] { $number } ມື້ກ່ອນຫນ້ານີ້ - } -timeDiffFutureDays = - { $number -> - *[other] ໃນ { $number } ມື້ - } - -## Shot Page New Feature Promotion Dialog. - - -## Annotations - - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - - -## Settings Page - - -## Shotindex page - -shotIndexPageClearSearchButton = - .title = ລຶບການຄົ້ນຫາ - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - -metricsPageUserShotsQueryCount = ຈຳນວນຜູ້ໃຊ້ -metricsPageRetentionQueryUsers = ຈຳນວນຜູ້ໃຊ້ diff --git a/locales/lt/server.ftl b/locales/lt/server.ftl deleted file mode 100644 index 7da416094d..0000000000 --- a/locales/lt/server.ftl +++ /dev/null @@ -1,403 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mano nuotraukos -gHomeLink = Pradžia -gNoShots = - .alt = Nuotraukų nerasta -gScreenshotsDescriptionServerless = Ekrano nuotraukos paprastai. Fotografuokite ir atsisiųskite ekrano nuotraukas nepalikdami „Firefox“. - -## Header - -buttonSettings = - .title = Nuostatos -buttonSignIn = - .title = Prisijungti -screenshotsLogo = - .title = Ekranų nuotraukų pradžia -bannerSignIn = Prisijunkite, norėdami pasiekti savo nuotraukas visuose įrenginiuose ir visam laikui įrašyti patinkančias. -bannerUpsell = { gScreenshotsDescription } Parsisiųskite „Firefox“ -shutdownWarning = Įrašytos ekrano nuotraukos netrukus pradings. Nuo birželio nebebus teikiama saugojimo internete paslauga. Norite išsaugoti turimas nuotraukas? Parsisiųskite jas į savo kompiuterį. -shutdownPageTitle = Ekrano nuotraukos keičiasi -shutdownPageDescription = Ekrano nuotraukoms nuo birželio nebus suteikiamas talpinimas internete. Norite pasilikti nuotraukas iš savo archyvo? Parsisiųskite jas po vieną, arba kartu. Ačiū, kad naudojatės šiuo funkcionalumu, ir atsiprašome dėl galimo nepatogumo. -shutdownPageContinue = Tikimės, kad ir toliau naudositės ekrano nuotraukų funkcionalumu. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Kas naujo su „Firefox Screenshots“? -onboardingPromoMessage = Prisijunkite prie „Screenshots“ su „Firefox“ paskyra ir darykite daugiau: -onboardingPromoMessageListItem1 = Pasiekite savo archyvą iš visų įrenginių -onboardingPromoMessageListItem2 = Neribotai saugokite patinkančias nuotraukas -onboardingPromoDismissButton = Paslėpti - .title = Paslėpti -onboardingPromoSigninButton = Prisijungti - .title = Prisijungti - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Sąlygos -footerLinkPrivacy = Privatumo pranešimas -footerReportShot = Pranešti apie nuotrauką - .title = Pranešti apie šią nuotrauką dėl išnaudojimo, brukalų, ar kitų problemų -footerLinkFaqs = Dažni klausimai -footerLinkDMCA = Pranešti apie intelektinės nuosavybės pažeidimą -footerLinkDiscourse = Pateikti atsiliepimą -footerLinkRemoveAllData = Pašalinti visus duomenis - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Kuriamas { $title } -creatingPageTitleDefault = tinklalapis -creatingPageWaitMessage = Jūsų nuotrauka įrašoma… - -## Home page - -homePageDescription = - .content = Intuityvios ekrano nuotraukos tiesiai naršyklėje. Darykite, saugokite ir dalinkitės ekrano nuotraukomis naršydami saityne su „Firefox“. -homePageButtonMyShots = Eiti į mano nuotraukas -homePageTeaser = Bus jau netrukus… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Nemokamas atsisiuntimas -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Kaip veikia „Firefox“ ekrano nuotraukos -homePageGetStartedTitle = Pradėkite -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Pasirinkite ekrano nuotraukų piktogramą iš tinklalapio veiksmų meniu, esančio adreso juostoje. Tuomet virš jūsų naršyklės lango pasirodys ekrano nuotraukų meniu. -homePageCaptureRegion = Fotografuokite sritį -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Spustelėkite ir tempkite norėdami pažymėti norimą nufotografuoti sritį. Arba tiesiog užveskite pelę ir spustelėkite – bus pažymėta toji sritis. Patinka, ką matote? Pasirinkite „Įrašyti“, norėdami pasiekti savo nuotrauką internete, arba rodyklę žemyn, norėdami atsisiųsti ją į savo kompiuterį. -homePageCapturePage = Fotografuokite tinklalapį -homePageCapturePageDescription = Naudokitės mygtukais viršuje dešinėje, norėdami nufotografuoti visą tinklalapį. Mygtukas „Įrašyti matomą“ nufotografuos sritį, kurią matote neslinkdami pelės, o „Įrašyti visą tinklalapį“ nufotografuos viską, kas jame yra. -homePageDownloadCopy = Atsisiųsti arba kopijuoti -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Padarykite geriausią kadrą. Ekrano nuotraukos leidžia jūsų pasirinkimą atsisiųsti, arba nukopijuoti jį tiesiai į iškarpinę. -homePageLegalLink = Teisinė informacija -homePagePrivacyLink = Privatumas -homePageTermsLink = Nuostatai -homePageCookiesLink = Slapukai - -## Leave Screenshots page - -leavePageRemoveAllData = Pašalinti visus duomenis -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Turite būti įdiegę „Firefox Screenshots“, arba prisijungę prie „Firefox“ paskyros, norėdami ištrinti savo paskyrą -leavePageErrorGeneric = Įvyko klaida -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Tai visam laikai ištrins visus jūsų „Firefox“ nuotraukų duomenis. -leavePageButtonProceed = Vykdyti -leavePageButtonCancel = Atsisakyti -leavePageDeleted = Visos jūsų nuotraukos buvo ištrintos! - -## Not Found page - -notFoundPageTitle = Tinklalapis nerastas -notFoundPageIntro = Ups. -notFoundPageDescription = Tinklalapis nerastas. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Ekrano nuotrauka: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Klaida įrašant galiojimą -shotPageAlertErrorDeletingShot = Klaida trinant nuotrauką -shotPageAlertErrorUpdatingTitle = Klaida įrašant pavadinimą -shotPageConfirmDelete = Ar tikrai norite visam laikui ištrinti šią nuotrauką? -shotPageShareButton = - .title = Dalintis -shotPageCopyButton = - .title = Kopijuoti vaizdą į iškarpinę -shotPageCopyActionLabel = Kopijuoti -shotPageCopied = Nukopijuota -shotPageShareFacebook = - .title = Dalintis per „Facebook“ -shotPageShareTwitter = - .title = Dalintis per „Twitter“ -shotPageSharePinterest = - .title = Dalintis per „Pinterest“ -shotPageShareEmail = - .title = Dalintis saitu per el. paštą -shotPageShareLink = Gaukite saitą šiai nuotraukai: -shotPagePrivacyMessage = Bet kas, turintis saitą, galės peržiūrėti šią nuotrauką. -shotPageCopyImageText = - .label = Kopijuoti paveikslo tekstą -shotPageConfirmDeletion = Ar tikrai norite visam laikui ištrinti šią nuotrauką? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Jei nieko nedarysite, ši nuotrauka bus ištrinta visam laikui . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = atkurti iki { $date } -shotPageExpiredMessage = Ši nuotrauka baigė galioti. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Štai tinklalapis, iš kurio jis buvo sukurtas: -shotPageDeleteButton = - .title = Ištrinti šią nuotrauką -shotPageDownloadShot = - .title = Atsisiųsti -shotPageEditButton = - .title = Redaguoti paveikslą -shotPagefavoriteButton = - .title = Pažymėti kaip patinkančią -shotPageBackToHomeButton = - .title = Pradžios tinklalapis -shotPageAllShotsButton = - .title = Visos nuotraukos -shotPageScreenshotsDescriptionServerless = Ekrano nuotraukos paprastai. Fotografuokite ir atsisiųskite ekrano nuotraukas nepalikdami „Firefox“. -shotPageDMCAMessage = Ši nuotrauka nepasiekiama dėl trečiųjų šalių intelektinės nuosavybės teisių. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Prašome susisiekti su { $dmca } dėl daugiau informacijos. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Jeigu jūsų nuotraukos sulauks daug pretenzijų, mes galime apriboti jūsų naudojimąsi „Firefox“ ekrano nuotraukomis. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Prašome įtraukti šio karo URL savo el. laiške: { $url } -shotPageKeepFor = Kiek ilgai šis nuotrauka turėtų būti laikoma? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Pasirinkite laiką -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Neribotai ∞ -shotPageKeepTenMinutes = 10 minučių -shotPageKeepOneHour = 1 valandą -shotPageKeepOneDay = 1 dieną -shotPageKeepOneWeek = 1 savaitę -shotPageKeepTwoWeeks = 2 savaites -shotPageKeepOneMonth = 1 mėnesį -shotPageSaveExpiration = įrašyti -shotPageCancelExpiration = atsisakyti -shotPageDoesNotExpire = nesibaigia -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = baigs galioti -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = baigė galioti -timeDiffJustNow = ką tik -timeDiffMinutesAgo = - { $number -> - [one] prieš 1 minutę - [few] prieš { $number } minutes - *[other] prieš { $number } minučių - } -timeDiffHoursAgo = - { $number -> - [one] prieš 1 valandą - [few] prieš { $number } valandas - *[other] prieš { $number } valandų - } -timeDiffDaysAgo = - { $number -> - [one] vakar - [few] prieš { $number } dienas - *[other] prieš { $number } dienų - } -timeDiffFutureSeconds = po keleto sekundžių -timeDiffFutureMinutes = - { $number -> - [one] po 1 minutės - [few] po { $number } minučių - *[other] po { $number } minučių - } -timeDiffFutureHours = - { $number -> - [one] po 1 valandos - [few] po { $number } valandų - *[other] po { $number } valandų - } -timeDiffFutureDays = - { $number -> - [one] rytoj - [few] po { $number } dienų - *[other] po { $number } dienų - } -errorThirdPartyCookiesEnabled = Jei padarėte šią nuotrauką ir negalite jos pašalinti, gali tekti laikinai įjungti trečiųjų šalių slapukus per naršyklės nuostatas. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Nauja! -promoMessage = Atnaujinti redagavimo įrankiai leidžia apkirpti, paryškinti, ir net pridėti tekstą ant jūsų ekrano nuotraukų. -promoLink = Išbandykite juos -promoCloseButton = - .title = Užverti pranešimą - -## Annotations - -annotationPenButton = - .title = Rašiklis -annotationHighlighterButton = - .title = Žymeklis -annotationUndoButton = - .title = Atšaukti -annotationRedoButton = - .title = Pakartoti -annotationTextButton = - .title = Pridėti tekstą -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Išvalyti -annotationCropButton = - .title = Apkirpti -annotationSaveEditButton = Įrašyti - .title = Įrašyti pakeitimus -annotationCancelEditButton = Atsisakyti - .title = Atsisakyti pakeitimų -annotationCropConfirmButton = Tinka - .title = Patvirtinkite pasirinkimą -annotationCropCancelButton = Atsisakyti - .title = Atsisakyti pasirinkimo -annotationColorWhite = - .title = Balta -annotationColorBlack = - .title = Juoda -annotationColorRed = - .title = Raudona -annotationColorGreen = - .title = Žalia -annotationColorBlue = - .title = Mėlyna -annotationColorYellow = - .title = Geltona -annotationColorPurple = - .title = Violetinė -annotationColorSeaGreen = - .title = Jūros mėlio -annotationColorGrey = - .title = Pilka -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Teksto dydis -# Values shown in text size selection dropdown -textSizeSmall = Mažas -textSizeMedium = Vidutinis -textSizeLarge = Didelis -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Patvirtinti - .title = Patvirtinti -textToolCancelButton = Atsisakyti - .title = Atsisakyti -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Labas - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Atsitiko kažkas negero -copyImageErrorMessage = Jūsų nuotraukos nepavyko nukopijuoti į iškarpinę. - -## Settings Page - -settingsDisconnectButton = Atsijungti - .title = Atsijungti -settingsGuestAccountMessage = Svečio paskyra -settingsSignInButton = Prisijungti - .title = Prisijungti -SettingsPageHeader = „Firefox“ ekrano nuotraukų nuostatos -settingsFirefoxAccountSubHeader = „Firefox“ paskyra -settingsClosePreferences = - .title = Užverti nuostatas -settingsFxaDisconnectAlertMessage = Ar tikrai norite atjungti šį įrenginį nuo savo „Firefox“ paskyros? -settingsFxaDisconnectDescription = Jei atsijungsite, norėdami pasiekti savo nuotraukas turėsite prisijungti iš naujo. -settingsFxaConnectDescription = Norėdami pasiekti savo ekrano nuotraukas kituose įrenginiuose, prisijunkite. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Klaida trinant nuotrauką: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mano kardai: ieškoti { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Klaida atvaizduojant tinklalapį: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Ieškoti mano nuotraukų -shotIndexPageNoShotsMessage = Nėra įrašytų nuotraukų. -shotIndexPageNoShotsInvitation = Nagi, sukurkite keletą. -shotIndexPageLookingForShots = Ieškome jūsų nuotraukų… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Negalime rasti jokių nuotraukų, atitinkančių jūsų paiešką. -shotIndexPageMyShotsButton = - .title = Mano nuotraukos -shotIndexPageClearSearchButton = - .title = Išvalyti paiešką -shotIndexPageConfirmShotDelete = Ištrinti šią nuotrauką? -shotIndexPagePreviousPage = - .title = Ankstesnis puslapis -shotIndexPageNextPage = - .title = Kitas puslapis -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Tai nėra patinkanti nuotrauka, tad vėliau pradings -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Ši nuotrauka yra patinkanti, ir niekur nedings -shotIndexSyncedShot = - .title = Nuotrauka padaryta kitame įrenginyje -shotIndexAlertErrorFavoriteShot = Nepavyko atnaujinti patinkančios nuotraukos būsenos - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Ar tikrai norite pašalinti šią nuotrauką? -shotDeleteCancel = Atsisakyti - .title = Atsisakyti -shotDeleteConfirm = Pašalinti - .title = Pašalinti - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Norėdami eksportuoti: pasirinkite „Failas“ > „Įrašyti tinklalapį kaip…“, ir savo nuotraukas rasite aplanke „{ $folder }“. - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = „FIrefox“ ekrano nuotraukų statistika -metricsPageTotalsQueryTitle = Viso -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Ekrano nuotraukų apžvalga -metricsPageTotalsQueryDevices = Viso registruotų įrenginių -metricsPageTotalsQueryActiveShots = Aktyvių nuotraukų -metricsPageTotalsQueryExpiredShots = Baigusių galioti (bet atkuriamų) -metricsPageTotalsQueryExpiredDeletedShots = Baigusių galioti (iš ištrintų) -metricsPageShotsQueryTitle = Nuotraukos dienomis -metricsPageShotsQueryDescription = Nuotraukos, padarytos per dieną (per paskutines 30 dienų) -metricsPageShotsQueryCount = Nuotraukų skaičius -metricsPageShotsQueryDay = Diena -metricsPageUsersQueryTitle = Naudotojai dienomis -metricsPageUsersQueryDescription = Naudotojai, padarę bent vieną nuotrauką, dienomis (per paskutines 30 dienų) -metricsPageUsersQueryCount = Naudotojų skaičius -metricsPageUsersQueryDay = Diena -metricsPageUserShotsQueryTitle = Nuotraukos vienam naudotojui -metricsPageUserShotsQueryDescription = Naudotojų skaičius, kurie viso turi apie N nuotraukų -metricsPageUserShotsQueryCount = Naudotojų skaičius -metricsPageUserShotsQueryShots = Apytikslis skaičius aktyvių (nebaigusių galioti) nuotraukų -metricsPageRetentionQueryTitle = Išlaikymas savaitėmis -metricsPageRetentionQueryDescription = Dienų skaičius tarp naudotojo pirmos ir paskiausios nuotraukos, sugrupuota pagal pradinę savaitę -metricsPageRetentionQueryUsers = Naudotojų skaičius -metricsPageRetentionQueryDays = Dienos nuo naudotojo pirmos iki paskiausios nuotraukos -metricsPageRetentionQueryFirstWeek = Savaitė, kurią naudotojas padarė pirmą nuotrauką -metricsPageTotalRetentionQueryTitle = Viso išlaikymas -metricsPageTotalRetentionQueryDescription = Laiko trukmė, kai naudotojai darė nuotraukas, sugrupuota pagal savaitę -metricsPageTotalRetentionQueryUsers = Naudotojų skaičius -metricsPageTotalRetentionQueryDays = Dienos, kai naudotojas darė nuotraukas -metricsPageVersionQueryTitle = Priedo versija -metricsPageVersionQueryDescription = Priedo versija prisijungimo metu, per paskutines 14 dienų -metricsPageVersionQueryUsers = Prisijungusių naudotojų skaičius -metricsPageVersionQueryVersion = Priedo versija -metricsPageVersionQueryLastSeen = Diena -metricsPageHeader = Statistika -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Sugeneruota: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (duomenų bazės užtrukimas: { $time } ms) diff --git a/locales/ltg/server.ftl b/locales/ltg/server.ftl deleted file mode 100644 index ce5ed11480..0000000000 --- a/locales/ltg/server.ftl +++ /dev/null @@ -1,74 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Muni ekranšōvīņi -gHomeLink = Sōkums -gNoShots = - .alt = Nav nivīna ekranšōvīņa -gScreenshotsDescription = Ekranšōvīņus taisēt palics sprosta. Taisi, sagloboj un dolīs ar ekranšōvīņim napamatūt Firefox. - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Nūteikumi -footerLinkPrivacy = Privātuma atruna -footerLinkFaqs = BUJ -footerLinkDiscourse = Izveidōt atsauksmi -footerLinkRemoveAllData = Dzēst vysus datus - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Taisa { $title } -creatingPageTitleDefault = lopa -creatingPageWaitMessage = Sagloboj tovu ekranšōvīni... - -## Home page - -homePageButtonMyShots = Īt pi munim ekranšōvīnim -homePageTeaser = Dreiži... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Nūlōdēt bez moksys -homePageGetStarted = Sōkums -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Kai strōdoj Firefox Screenshots -homePageGetStartedTitle = Sōkums -homePageCaptureRegion = Saglobōt ekrana apgobolu -homePageCapturePage = Saglobōt lopu -homePageSaveShare = Saglobōt un pazadalēt -homePageLegalLink = Juridiska informaceja -homePagePrivacyLink = Privātums -homePageTermsLink = Lītōšonys nūteikumi -homePageCookiesLink = Seikdatnes - -## Leave Screenshots page - -leavePageRemoveAllData = Dzēst vysus datus - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/lv/server.ftl b/locales/lv/server.ftl deleted file mode 100644 index 5a85115b68..0000000000 --- a/locales/lv/server.ftl +++ /dev/null @@ -1,109 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gHomeLink = Sākums - -## Header - -buttonSettings = - .title = Iestatījumi - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Noteikumi -footerLinkPrivacy = Privātuma politika -footerLinkFaqs = BUJ -footerLinkDMCA = Ziņot par IP pārkāpumu -footerLinkRemoveAllData = Noņemt visus datus - -## Creating page - -creatingPageTitleDefault = lapa - -## Home page - -homePageTeaser = Drīzumā… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Bezmaksas lejupielāde -homePageDownloadCopy = Lejupielādēt vai kopēt -homePagePrivacyLink = Privātums -homePageTermsLink = Noteikumi -homePageCookiesLink = Sīkdatnes - -## Leave Screenshots page - -leavePageRemoveAllData = Noņemt visus datus - -## Not Found page - - -## Shot page - - -## Shot Page New Feature Promotion Dialog. - - -## Annotations - -annotationColorWhite = - .title = Balts -annotationColorBlack = - .title = Melns -annotationColorRed = - .title = Sarkans -annotationColorGreen = - .title = Zaļš -annotationColorBlue = - .title = Zils -annotationColorYellow = - .title = Dzeltens -annotationColorGrey = - .title = Pelēka -# Values shown in text size selection dropdown -textSizeSmall = Mazs -textSizeMedium = Vidējs -textSizeLarge = Liels -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Sveiki - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Kaut kas nogāja greizi - -## Settings Page - -settingsGuestAccountMessage = Viesu konts -settingsFirefoxAccountSubHeader = Firefox konts - -## Shotindex page - -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageClearSearchButton = - .title = Notīrīt meklēšanu -shotIndexPageNextPage = - .title = Nākamā lapa - -## Delete Confirmation Dialog - - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -metricsPageShotsQueryDay = Diena -metricsPageUsersQueryDay = Diena -metricsPageVersionQueryLastSeen = Diena -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Uzģenerēts: { $generated } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (datubāzes laiks: { $time }ms) diff --git a/locales/mai/server.ftl b/locales/mai/server.ftl deleted file mode 100644 index d6f4c1b74b..0000000000 --- a/locales/mai/server.ftl +++ /dev/null @@ -1,320 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = हमर शॉट -gHomeLink = होम -gNoShots = - .alt = कोनो शॉट नहि भेटल -gScreenshotsDescription = स्क्रीन शॉट आसान बनाएल गेल. बिनु फ़ायरफॉक्स छोड़ेने शॉट लिअ, सहेजू, आओर सहेजू. - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = शर्त -footerLinkPrivacy = गोपनीयता सूचना -footerLinkFaqs = अक्सर पूछल जाए बला प्रश्न -footerLinkDMCA = रिपोर्ट IP उल्लंघन -footerLinkDiscourse = प्रतिक्रिया दिअ -footerLinkRemoveAllData = सभ डेटा मेटाबू - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } बनओनाइ -creatingPageTitleDefault = पेज -creatingPageWaitMessage = अहाँक शॉट सहेजि रहल अछि... - -## Home page - -homePageDescription = - .content = सहज ज्ञान युक्त सही ब्राउज़र मे बेक्ड स्क्रीनशॉट. कैप्चर करू, सहेजू आओर शेयर स्क्रीनशॉट क रूप मे अहाँ Firefox क उपयोग कएक वेब ब्राउज़ करू. -homePageButtonMyShots = हमर शॉट्स पर जाउ -homePageTeaser = जल्दी आए रहल अछि... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = मुफ्त डाउनलोड -homePageGetStarted = प्रारंभ करू -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox स्क्रीनशॉट कओन तरहें काज करैत अछि -homePageGetStartedTitle = प्रारंभ करू -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescription = अपन टूलबार मे नव Screenshots खोजू. एकरा चुनू, आओर Screenshots मेनू अहाँक ब्राउजर विंडो मे उप्पर मे देखाइ पड़त. -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = एड्रैस बार मे पेज एक्शन मेनू सँ Screenshots आइकन केँ चुनू, आओर Screenshots मेनू अहाँक ब्राउजर विंडो क उप्पर मे देखाइ पड़त. -homePageCaptureRegion = एकटा क्षेत्र कैप्चर करू -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = ओ क्षेत्र केँ क्लिक आ ड्रैग करू जकरा अहाँ कैप्चर करए चाहैत छी. अथवा केवल क्लिक करू — Screenshots अहाँक लेल क्षेत्र चुनि लेत. जेहन कि अहाँ देखि सकैत छी? अपन स्क्रीनशॉट क ऑनलाइन देखए लेली सहेजनाय चुनू अथवा अपन कंप्यूटर पर डाउनलोड करए खातिर डाउन एरौ बटन दाबू . -homePageCapturePage = एकटा पेज कैप्चर करू -homePageCapturePageDescription = पूरा पेज कैप्चर करए लेल उप्पर क दहिन्ना बटन उपयोग करू. देखाइ पड़ैत सहेजू बटन क्षेत्र ते कैप्चर क लेत, अहाँ बिनु स्क्रॉल कएनए देखि सकैत छी, आओर सहेजू पूरा पेज पृष्ठ क पूरा हिस्सा कैप्चर कए लेत. -homePageSaveShare = सहेजू आओर साझा करू -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageSaveShareDescription = जँ अहाँ एकटा शॉट लए छी, Firefox अहाँक आनलाइन स्क्रीनशॉट लाइब्रेरी सँ स्क्रीनशॉट पठाएत आओर अहाँक लिंक क्लिपबोर्ड मे कॉपी करत. हम अपना सँ अहाँक स्क्रीनशॉट दुइ सप्ताह लेल संग्रह करै छी, मुदा अहाँ कखनो शॉट मेटाए सकैत छी अथवा समाप्ति तिथि बदैल कए अपना लाइब्रेरी मे नमहर काल धरि शॉट सहेजि सकैत छी. -homePageLegalLink = वैध -homePagePrivacyLink = गोपनीयता -homePageTermsLink = शर्त -homePageCookiesLink = कुकीज़ - -## Leave Screenshots page - -leavePageRemoveAllData = सभ डेटा मेटाबू -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAddonRequired = अपन खाता कें मेटाबै लेल अहाँक जरूर Firefox Screenshots इंस्टॉल हएबाक चाही -leavePageErrorGeneric = एकटा त्रुटि उत्पन्न भेल -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = ई अहाँक सभ Firefox Screenshots डेटा केँ हमेशा कलेल मेटाए देत. -leavePageButtonProceed = आगाँ जाउ -leavePageButtonCancel = रद्द करू -leavePageDeleted = अहाँक सभ Screenshots मेटाए देल गेल! - -## Not Found page - -notFoundPageTitle = पेज नहि भेटल -notFoundPageIntro = ओह -notFoundPageDescription = पेज नहि भेटल - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = स्क्रीनशॉट: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = समाप्ति क बचत करए मे त्रुटि -shotPageAlertErrorDeletingShot = शॉट मेटाबै मे त्रुटि -shotPageAlertErrorUpdatingTitle = शीर्षक सहेजए मे त्रुटि -shotPageConfirmDelete = की अहाँ वाकई ई शॉट केँ मेटाबै लेल चाहैत छी? -shotPageShareButton = - .title = साझा -shotPageCopy = कॉपी करू -shotPageCopied = कॉपी कएल गेल -shotPageShareFacebook = - .title = Facebook पर साझा करू -shotPageShareTwitter = - .title = Twitter पर साझा करू -shotPageSharePinterest = - .title = Pinterest पर साझा करू -shotPageShareEmail = - .title = ईमेल द्वारा लिंक साझा करू -shotPageShareLink = ई शॉट लेल एकटा साझा करए लायक लिंक पाबू. -shotPagePrivacyMessage = लिंक द्वारा केओ भी ई शॉट केँ देखि सकैत अछि. -shotPageCopyImageText = - .label = फोटो टेक्स्ट कॉपी करू -shotPageConfirmDeletion = की अहाँ वाकई ई शॉट केँ हमेशा लेल मेटाबै चाहैत छी? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = जँ अहाँ किछु नए करैत छी, ई शॉट हमेशा कलेल मेटाए देल जाएत. -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $Date } तक पुनर्स्थापित करू -shotPageExpiredMessage = ई शॉट क समय सीमा समाप्त भ गेल अछि. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = एतय ई पेज अछि, ई मूल रूप सँ बनाएल गेल छला: -shotPageDeleteButton = - .title = ई शॉट मेटाबू -shotPageAbuseButton = - .title = ई शॉट केँ दुरूपयोग, स्पैम, अथवा आन समस्या लेल रिपोट करू -shotPageDownloadShot = - .title = डाउनलोड करू -shotPageEditButton = - .title = ई फोटो केँ संपादित करू -shotPageDownload = डाउनलोड करू -shotPageScreenshotsDescription = Screenshots आसान बनाएल गेल. Screenshots लिअ, सहेजू आओर शेयर करू बिना Firefox सँ निकलने. -shotPageUpsellFirefox = एखन firefox पाबू -shotPageDMCAMessage = तेसर पक्ष के इंटेलेक्चुअल प्रोपर्टी दावा के कारण ई शॉट आब मोजुद नहि अछि. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = आगाँ जानकारी पाबै लेल कृपया { $dmca } पर ईमेल करू. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = जँ अहाँक शॉट अनेक दावा के तहत आबैत अछि, हम अहाँक पहुँच Firefox Screenshots मे बन्न क सकैत छी. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = कृपया अपन ईमेल मे ई शॉट क URL जोड़ू: { $url } -shotPageKeepFor = कतेक काल धरि ई शॉट बनाएल रहल चाही? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = समय चुनू -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = अनिश्चितकाल ∞ -shotPageKeepTenMinutes = 10 मिनट -shotPageKeepOneHour = 1 घंटा -shotPageKeepOneDay = 1 दिन -shotPageKeepOneWeek = 1 सप्ताह -shotPageKeepTwoWeeks = 2 सप्ताह -shotPageKeepOneMonth = 1 महिना -shotPageSaveExpiration = सहेजू -shotPageCancelExpiration = कैंसिल करू -shotPageDoesNotExpire = समाप्त नहि हए अछि -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = समय सीमा समाप्त -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = समाप्त -timeDiffJustNow = एखन एखन -timeDiffMinutesAgo = - { $number -> - [one] 1 मिनट पहले - *[other] { $number } मिनट पहले - } -timeDiffHoursAgo = - { $number -> - [one] 1 घंटा पहले - *[other] { $number } घंटा पहले - } -timeDiffDaysAgo = - { $number -> - [one] काल्हि - *[other] { $number } दिन पहले - } -timeDiffFutureSeconds = कनिके काल मे -timeDiffFutureMinutes = - { $number -> - [one] 1 मिनट मे - *[other] { $number } मिनट मे - } -timeDiffFutureHours = - { $number -> - [one] 1 घंटा मे - *[other] { $number } घंटा मे - } -timeDiffFutureDays = - { $number -> - [one] काल्हि - *[other] { $number } दिन मे - } -errorThirdPartyCookiesEnabled = जँ अहा ई शॉट लेने छथि आओर एकरा मेटाए नहि पाबि रहल छी, तँ अहाँ केँ अपन ब्रॉउज़र प्रेफरेंश मे जाए क अस्थायी रूप सँ तेसर पार्टी कुकीज़ सक्रिय करै हाएत. - -## Annotations - -annotationPenButton = - .title = पेन -annotationHighlighterButton = - .title = हाइलाइटर -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = साफ करू -annotationCropButton = - .title = क्रॉप करू -annotationSaveEditButton = सहेजू - .title = संपादन सहेजू -annotationCancelEditButton = कैंसिल करू - .title = संपादन कैंसिल करू -annotationCropConfirmButton = पुष्टि करू - .title = चयन क पुष्टि करू -annotationCropCancelButton = कैंसिल करू - .title = चयन कैंसिल करू -annotationColorWhite = - .title = उज्जर -annotationColorBlack = - .title = करिया -annotationColorRed = - .title = लाल -annotationColorGreen = - .title = हरिअर -annotationColorBlue = - .title = नीला -annotationColorYellow = - .title = पिअर -annotationColorPurple = - .title = बैंगनी -annotationColorSeaGreen = - .title = समुद्री हरिअर -annotationColorGrey = - .title = भूरा - -## Settings Page - -settingsDisconnectButton = कनेक्शन हटाबू - .title = कनेक्शन हटाबू -settingsGuestAccountMessage = अतिथि क खाता -settingsSignInInvite = आन डिवाइस सँ सिंक करए लेल सिंक करू -settingsSignInButton = साइन इन करू - .title = साइन इन करू -SettingsPageHeader = Firefox Screenshots सेटिंग्स -settingsDescription = अहाँ Firefox खाता केँ आन डिवाइस सँ सिंक कए क अपन सभ स्क्रीनशॉट केँ आन डिवाइस पर निजी रूप सँ पहुँचि सकैत छी. -settingsPageSubHeader = सिंक & खाता -settingsClosePreferences = - .title = वरीयता बन्न करू - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = शॉट हटाबै मे त्रुटि: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = हमर शॉट: कलेल खोज करू { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = रेंडरिंग पेज त्रुटि: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = हमर शॉट्स खोजू -shotIndexPageSearchButton = - .title = खोजू -shotIndexPageNoShotsMessage = कोनो सहेजल गेल शॉट नहि. -shotIndexPageNoShotsInvitation = चलू, किछु बनाबू. -shotIndexPageLookingForShots = अपन शॉट्स क खोज... -shotIndexPageNoSearchResultsIntro = अच्छा -shotIndexPageNoSearchResults = हम अहाँक खोज सँ मैच करै बला कोनो भी शॉट केँ नहि ढूंढ सकब. -shotIndexPageClearSearchButton = - .title = खोज साफ करू -shotIndexPageConfirmShotDelete = ई शॉट केँ मेटाबू? -shotIndexPagePreviousPage = - .title = पिछला पृष्ठ -shotIndexPageNextPage = - .title = अगिला पृष्ठ -# This symbol is used in the lower right corner of the card for a shot on the -# My Shots page to indicate that the shot does not expire. It should be a -# single character (or simply nothing if no such symbol is available for a -# language/culture). -shotIndexNoExpirationSymbol = ∞ - .title = ई शॉट समाप्त नहि हाएत अछि - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = की अहाँ वाकई मे ई शॉट केँ मेटाबै चाहैत छी? -shotDeleteCancel = कैंसिल करू - .title = कैंसिल करू -shotDeleteConfirm = मेटाउ - .title = मेटाउ - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots मेट्रिक्स -metricsPageTotalsQueryTitle = कुल -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = स्क्रीनशॉट क अवलोकन -metricsPageTotalsQueryDevices = कुल पंजीकृत डिवाइस -metricsPageTotalsQueryActiveShots = सक्रिय शॉट्स -metricsPageTotalsQueryExpiredShots = समय सीमा समाप्त (मुदा वापस भेटि सकब योग्य) -metricsPageTotalsQueryExpiredDeletedShots = समाप्त (आओर हटाए देल गेल) -metricsPageShotsQueryTitle = दिन क शॉट्स -metricsPageShotsQueryDescription = प्रत्येक दिन बनाएल गेल शॉट्स क संख्या (पछिला 30 दिन खातिर) -metricsPageShotsQueryCount = शॉट्स क संख्या -metricsPageShotsQueryDay = दिन -metricsPageUsersQueryTitle = दिन क अनुसार उपयोगकर्ता -metricsPageUsersQueryDescription = उपयोगकर्ता क संख्या जे कम सँ कम एक शॉट बनैने हुए, एक दिन मे (पछिला 30 दिन) -metricsPageUsersQueryCount = उपयोगकर्ता क संख्या -metricsPageUsersQueryDay = दिन -metricsPageUserShotsQueryTitle = शॉट्स क सँख्या प्रति उपयोगकर्ता -metricsPageUserShotsQueryDescription = N कुल शॉट्स क संबंध मे उपयोगकर्ता क संख्या -metricsPageUserShotsQueryCount = उपयोगकर्ता क संख्या -metricsPageUserShotsQueryShots = लगभग सक्रिय शॉट्स (समाप्त नहि) क संख्या -metricsPageRetentionQueryTitle = सप्ताह सँ प्रतिधारण -metricsPageRetentionQueryDescription = शुरुआती सप्ताह द्वारा समूहीकृत, उपयोगकर्ता क पहिला शॉट सँ सबसँ हाल क शॉट पर दिन क संख्या -metricsPageRetentionQueryUsers = उपयोगकर्ता क संख्या -metricsPageRetentionQueryDays = उपयोगकर्ता क पहिला सँ लएकए हाल धरि क शॉट मे लागल दिन -metricsPageRetentionQueryFirstWeek = सप्ताह, जाहि मे उपयोगकर्ता पहिल बेर शॉट्स बनाएलक -metricsPageTotalRetentionQueryTitle = कुल प्रतिधारण -metricsPageTotalRetentionQueryDescription = उपयोगकर्ता द्वारा शॉट्स बनाबै मे लगाएल गेल समय, सप्ताह द्वारा समूहीकृत कएल -metricsPageTotalRetentionQueryUsers = उपयोगकर्ता क संख्या -metricsPageTotalRetentionQueryDays = दिवस, जकरा मे उपयोगकर्ता शॉट्स बनाए रहल अछि -metricsPageVersionQueryTitle = ऐड-ऑन संस्करण -metricsPageVersionQueryDescription = पछिला 14 दिन मे, लॉगइन क दौरान इस्तेमाल कएल गेल add-on क सँस्करण -metricsPageVersionQueryUsers = लॉगिन करए बला उपयोगकर्ता क संख्या -metricsPageVersionQueryVersion = एड-ऑन संस्करण -metricsPageVersionQueryLastSeen = दिन -metricsPageHeader = मैट्रिक्स -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = एतय उत्पन्न: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (डेटाबेस समय: { $time }ms) diff --git a/locales/mk/server.ftl b/locales/mk/server.ftl deleted file mode 100644 index 00c8581eb3..0000000000 --- a/locales/mk/server.ftl +++ /dev/null @@ -1,345 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Мои слики -gHomeLink = Почетна -gNoShots = - .alt = Нема слики од екран -gScreenshotsDescription = Слики од екран поедноставени. Фаќајте, снимајте и споделувајте слики од екран без да го напуштите Firefox. - -## Header - - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Услови -footerLinkPrivacy = Известување за приватност -footerLinkFaqs = ЧПП -footerLinkDMCA = Пријавете злоупотреба на интелектуална сопственост -footerLinkDiscourse = Оставете мислење -footerLinkRemoveAllData = Избришете ги сите податоци - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Создавам { $title } -creatingPageTitleDefault = страница -creatingPageWaitMessage = Вашата слика се снима... - -## Home page - -homePageDescription = - .content = Интуитивни слики од екран вградени во прелистувачот. Фаќајте, снимајте и споделувајте слики од екран додека го прелистувате Интернет со Firefox. -homePageButtonMyShots = Појди до Мои слики -homePageTeaser = Наскоро... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Слободно преземање -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Како работи Firefox Screenshots -homePageGetStartedTitle = Вовед -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescription = Пронајдете ја новата иконка на Screenshots во вашиот алатник. Изберете ја и менито на Screenshots ќе се појави над прозорецот на вашиот прелистувач. -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Изберете ја иконката на Screenshots од менито со активности за страница во адресната лента и менито на Screenshots ќе се прикаже врз прозорецот на вашиот прелистувачот. -homePageCaptureRegion = Фати слика од регион -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Кликнете и влечете за да означите зона за снимање. Или пак, застанете со покажувачот и кликнете — Screenshots ќе ја избере зоната за Вас. Ви се допаѓа тоа што го гледате? Изберете Сними за да ја зачувате сликата на Интернет или пак, копчето со стрелка надолу за да ја преземете сликата на вашиот компјутер. -homePageCapturePage = Фати слика од страница -homePageCapturePageDescription = Користете ги копчињата горе-десно за да фатите слики од цели страници. Копчето Сними видлив дел ќе го фати делот што е видлив без лизгање, а Сними цела страница ќе ја фати целата страница. -homePageSaveShare = Сними и сподели -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageSaveShareDescription = Кога ќе фатите слика од екран, Firefox ја снима на Интернет, во вашата библиотека Screenshots и ја копира адресата до сликата во меморија. Автоматски ги чуваме вашите слики во времетраење од две недели, но вие можете да ги избришете во било кој момент или пак да го промените рокот на чување за да ги задржите подолго во вашата библиотека. -homePageLegalLink = Правна напомена -homePagePrivacyLink = Приватност -homePageTermsLink = Услови -homePageCookiesLink = Колачиња - -## Leave Screenshots page - -leavePageRemoveAllData = Отстрани ги сите податоци -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAddonRequired = Морате да го имате инсталирано Firefox Screenshots за да ја избришете вашата сметка -leavePageErrorGeneric = Се случи грешка -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Со ова ќе ги избришете сите податоци на Firefox Screenshots трајно. -leavePageButtonProceed = Продолжи -leavePageButtonCancel = Откажи -leavePageDeleted = Сите ваши слики од екран беа избришани! - -## Not Found page - -notFoundPageTitle = Страницата не постои -notFoundPageIntro = Упс. -notFoundPageDescription = Страницата не постои. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Слика од екран: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Грешка при зачувуањето на рокот на траење -shotPageAlertErrorDeletingShot = Грешка при бришењето на сликата -shotPageAlertErrorUpdatingTitle = Грешка при снимањето на насловот -shotPageConfirmDelete = Сигурно сакате да ја избришете оваа слика од екран трајно? -shotPageShareButton = - .title = Сподели -shotPageCopy = Копирај -shotPageCopied = Ископирано -shotPageShareFacebook = - .title = Сподели на Facebook -shotPageShareTwitter = - .title = Сподели на Twitter -shotPageSharePinterest = - .title = Сподели на Pinterest -shotPageShareEmail = - .title = Сподели врска преку е-пошта -shotPageShareLink = Земете врска за споделување на оваа слика: -shotPagePrivacyMessage = Сите што ја имаат адресата до сликата, можат да ја видат -shotPageCopyImageText = - .label = Копирај го текстот на сликата -shotPageConfirmDeletion = Сигурно сакате да ја избришете оваа слика од екран трајно? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ако не направите ништо, оваа слика ќе биде трајно избришана . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = можно враќање до { $date } -shotPageExpiredMessage = Рокот на траење на оваа слика е истечен. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Еве ја страницата од којашто е оригинално избработена: -shotPageDeleteButton = - .title = Избриши ја оваа слика -shotPageDownloadShot = - .title = Преземи -shotPageEditButton = - .title = Уреди ја оваа слика -shotPageDownload = Преземи -shotPageScreenshotsDescription = Слики од екран поедноставени. Фаќајте, снимајте и споделувајте слики од екран без да го напуштите Firefox. -shotPageUpsellFirefox = Земете Firefox сега -shotPageDMCAMessage = Оваа слика од екран не е повеќе достапна заради жалба за нарушена интелектуална сопственост -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = За повеќе информации, Ве молиме испратете порака на { $dmca }. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ако вашите слики се предмет на злоупотреба на повеќе страни, можно е да ви го оневозможиме пристапот до Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Ве молиме вклучете ја следната адреса на сликата во вашата е-порака: { $url } -shotPageKeepFor = Колку долго треба да се чува оваа слика? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Изберете време -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Бесконечно ∞ -shotPageKeepTenMinutes = 10 минути -shotPageKeepOneHour = 1 час -shotPageKeepOneDay = 1 ден -shotPageKeepOneWeek = 1 седмица -shotPageKeepTwoWeeks = 2 седмици -shotPageKeepOneMonth = 1 месец -shotPageSaveExpiration = сними -shotPageCancelExpiration = откажи -shotPageDoesNotExpire = нема рок на траење -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = важи -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = рокот измина -timeDiffJustNow = сега -timeDiffMinutesAgo = - { $number -> - [one] пред 1 минута - *[other] пред { $number } минути - } -timeDiffHoursAgo = - { $number -> - [one] пред 1 час - *[other] пред { $number } часа - } -timeDiffDaysAgo = - { $number -> - [one] вчера - *[other] пред { $number } дена - } -timeDiffFutureSeconds = за неколку секунди -timeDiffFutureMinutes = - { $number -> - [one] за 1 минута - *[other] за { $number } минути - } -timeDiffFutureHours = - { $number -> - [one] за 1 час - *[other] за { $number } часа - } -timeDiffFutureDays = - { $number -> - [one] утре - *[other] за { $number } дена - } -errorThirdPartyCookiesEnabled = Ако вие ја фативте оваа слика и не можете да ја избришете, можеби треба привремено да овозможите користење на колачиња од трети страни во Опциите на прелистувачот. - -## Shot Page New Feature Promotion Dialog. - -promoLink = Пробајте ги - -## Annotations - -annotationPenButton = - .title = Пенкало -annotationHighlighterButton = - .title = Маркер -annotationUndoButton = - .title = Врати -annotationRedoButton = - .title = Повтори -annotationTextButton = - .title = Додај текст -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Исчисти -annotationCropButton = - .title = Исечи -annotationSaveEditButton = Сними - .title = Сними промени -annotationCancelEditButton = Откажи - .title = Откажи уредување -annotationCropConfirmButton = Потврди - .title = Потврди го изборот -annotationCropCancelButton = Откажи - .title = Откажи го изборот -annotationColorWhite = - .title = Бела -annotationColorBlack = - .title = Црна -annotationColorRed = - .title = Црвена -annotationColorGreen = - .title = Зелена -annotationColorBlue = - .title = Сина -annotationColorYellow = - .title = Жолта -annotationColorPurple = - .title = Виолетова -annotationColorSeaGreen = - .title = Морска зелена -annotationColorGrey = - .title = Сива -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Големина на текст -# Values shown in text size selection dropdown -textSizeSmall = Мала -textSizeMedium = Среда -textSizeLarge = Голема -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Потврди - .title = Потврди -textToolCancelButton = Откажи - .title = Откажи -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Здраво - -## Settings Page - -settingsDisconnectButton = Исклучи се - .title = Исклучи се -settingsGuestAccountMessage = Гостинска сметка -settingsSignInInvite = Најавете се за синхронизација помеѓу уреди -settingsSignInButton = Најавете се - .title = Најавете се -SettingsPageHeader = Поставки на Firefox Screenshots -settingsDescription = Можете да се најавите со сметка на Firefox за да ги синхронизирате сите ваши слики помеѓу уреди и да им пристапувате приватно. -settingsPageSubHeader = Синхронизација и сметки -settingsClosePreferences = - .title = Затвори поставки - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Грешка при бришењето на сликата: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Мои слики: пребарување за { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Грешка во прикажувањето на страницата: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Пребарај низ моите слики -shotIndexPageSearchButton = - .title = Барај -shotIndexPageNoShotsMessage = Нема снимени слики од екран. -shotIndexPageNoShotsInvitation = Повелете, направете некоја. -shotIndexPageLookingForShots = Ги барам вашите слики од екран... -shotIndexPageNoSearchResultsIntro = Хм -shotIndexPageNoSearchResults = Не можеме да пронајдеме слики што одговараат на вашето пребарување. -shotIndexPageClearSearchButton = - .title = Исчисти пребарување -shotIndexPageConfirmShotDelete = Да ја избришам оваа слика? -shotIndexPagePreviousPage = - .title = Претходна страница -shotIndexPageNextPage = - .title = Следна страница -# This symbol is used in the lower right corner of the card for a shot on the -# My Shots page to indicate that the shot does not expire. It should be a -# single character (or simply nothing if no such symbol is available for a -# language/culture). -shotIndexNoExpirationSymbol = ∞ - .title = Оваа слика нема рок на траење - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Дали сте сигурни дека сакате да ја избришете оваа слика? -shotDeleteCancel = Откажи - .title = Откажи -shotDeleteConfirm = Избриши - .title = Избриши - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Метрика на Firefox Screenshots -metricsPageTotalsQueryTitle = Вкупно -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Преглед на Screenshots -metricsPageTotalsQueryDevices = Вкупно регистрирани уреди -metricsPageTotalsQueryActiveShots = Активни слики од екран -metricsPageTotalsQueryExpiredShots = Со поминат рок (и можност за враќање) -metricsPageTotalsQueryExpiredDeletedShots = Со поминат рок (и трајно избришани) -metricsPageShotsQueryTitle = Слики по ден -metricsPageShotsQueryDescription = Број на слики од екран направени секој ден (во последните 30 дена) -metricsPageShotsQueryCount = Број на слики -metricsPageShotsQueryDay = Ден -metricsPageUsersQueryTitle = Корисници по ден -metricsPageUsersQueryDescription = Број на корисници што направиле барем една слика од екран дневно (во последните 30 дена) -metricsPageUsersQueryCount = Број на корисници -metricsPageUsersQueryDay = Ден -metricsPageUserShotsQueryTitle = Број на слики по корисник -metricsPageUserShotsQueryDescription = Бројот на корисници што имаат вкупно околу N слики од екран -metricsPageUserShotsQueryCount = Број на корисници -metricsPageUserShotsQueryShots = Просечен број на активни слики од екран (без поминат рок) -metricsPageRetentionQueryTitle = Задржување по седмица -metricsPageRetentionQueryDescription = Број на денови од првата до најновата слика од екран на корисникот, групирани според почетна седмица -metricsPageRetentionQueryUsers = Број на корисници -metricsPageRetentionQueryDays = Број на денови откога е направена првата, па сѐ до последната слика од екран -metricsPageRetentionQueryFirstWeek = Седмица во која корисникот за првпат направил слика од екран -metricsPageTotalRetentionQueryTitle = Вкупно задржување -metricsPageTotalRetentionQueryDescription = Времетраење во кое корисниците создавале слики од екран, групирани по седмица -metricsPageTotalRetentionQueryUsers = Број на корисници -metricsPageTotalRetentionQueryDays = Денови кога корисникот создавал слики од екран -metricsPageVersionQueryTitle = Верзија на додатокот -metricsPageVersionQueryDescription = Верзијата на додатокот што се користи за најавување во последните 14 дена -metricsPageVersionQueryUsers = Број на корисници што се најавуваат -metricsPageVersionQueryVersion = Верзија на додатокот -metricsPageVersionQueryLastSeen = Ден -metricsPageHeader = Метрика -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Создадена на: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (database time: { $time }ms) diff --git a/locales/ml/server.ftl b/locales/ml/server.ftl deleted file mode 100644 index 76167ab329..0000000000 --- a/locales/ml/server.ftl +++ /dev/null @@ -1,173 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = എന്റെ ഷോട്ടുകൾ -gHomeLink = പൂമുഖം -gNoShots = - .alt = ഷോട്ടുകൾ ഒന്നും കണ്ടില്ല - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = മോസില്ല -footerLinkTerms = നിബന്ധനകള്‍ -footerLinkPrivacy = സ്വകാര്യതാ അറിയിപ്പ് -footerLinkFaqs = സ്ഥിരം ചോദ്യങ്ങള്‍ -footerLinkDiscourse = പ്രതികരണം നല്‍കുക -footerLinkRemoveAllData = എല്ലാ വിവരങ്ങളും നീക്കം ചെയ്യുക - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = ഉണ്ടാക്കുന്നു { $title } -creatingPageTitleDefault = പേജ് -creatingPageWaitMessage = നിങ്ങളുടെ ഷോട്ട് സൂക്ഷിക്കുന്നു... - -## Home page - -homePageButtonMyShots = എന്റെ ഷോട്ടുകളിലേക്ക് പോവുക -homePageTeaser = ഉടൻ വരുന്നു... -homePageDownloadFirefoxTitle = ഫയര്‍ഫോക്സ് -homePageDownloadFirefoxSubTitle = സൗജന്യ ഡൗണ്‍ലോഡ് -homePageGetStarted = ഉപയോഗിച്ചു് തൂടങ്ങൂ -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = ഫയർഫോക്സ് സ്കീൻഷോട്ടുകൾ എങ്ങനെ പ്രവര്‍ത്തിക്കുന്നു -homePageGetStartedTitle = ഉപയോഗിച്ചു് തൂടങ്ങൂ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescription = നിങ്ങളുടെ ടൂള്‍ബാറില്‍ സ്ക്രീന്‍ഷോട്ട് ഐക്കണ്‍ ഉണ്ട്. അത് തെരഞ്ഞെടുക്കുമ്പോള്‍ ബ്രൌസര്‍ വിന്റോയുടെ മുകളില്‍ സ്ക്രീന്‍ഷോട്ട് മെനു വരും. -homePageSaveShare = സൂക്ഷിച്ച ശേഷം പങ്കുവെക്കൂ -homePageLegalLink = നിയമപരം -homePagePrivacyLink = സ്വകാര്യത -homePageTermsLink = നിബന്ധനകൾ -homePageCookiesLink = കുക്കികള്‍ - -## Leave Screenshots page - -leavePageRemoveAllData = എല്ലാ വിവരങ്ങളും നീക്കം ചെയ്യുക -leavePageErrorGeneric = ഒരു പിശക് ഉണ്ടായിരിയ്ക്കുന്നു: -leavePageButtonProceed = തുടരുക -leavePageButtonCancel = റദ്ദാക്കുക - -## Not Found page - -notFoundPageTitle = താള്‍ കണ്ടെത്തിയില്ല. -notFoundPageIntro = അയ്യോ. -notFoundPageDescription = താള്‍ കണ്ടെത്തിയില്ല. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = സ്ക്രീൻഷോട്ട്: { $originalTitle } -shotPageAlertErrorDeletingShot = ഷോട്ട് മായ്കല്‍ നടന്നില്ല -shotPageAlertErrorUpdatingTitle = തലക്കെട്ട് സൂക്ഷിക്കുന്നതില്‍ തകരാര്‍ -shotPageConfirmDelete = ഷോട്ട് എന്നേക്കുമായി ഒഴിവാക്കണം എന്ന് ഉറപ്പാണോ? -shotPageShareButton = - .title = പങ്കുവെക്കുക -shotPageCopy = പകര്‍ത്തുക -shotPageCopied = പകർത്തി! -shotPageShareFacebook = - .title = ഫേയ്സ്ബുക്കിൽ പങ്കുവെക്കുക -shotPageShareTwitter = - .title = ട്വിറ്ററിൽ പങ്കുവെക്കുക -shotPageSharePinterest = - .title = പിന്ററസ്റ്റിൽ പങ്കുവെക്കുക -shotPageShareEmail = - .title = ഇമെയിൽ വഴി പങ്കുവെക്കുക -shotPageShareLink = പങ്കുവെക്കാവുന്ന ഒരു കണ്ണി ലഭ്യമാക്കുക: -shotPagePrivacyMessage = കണ്ണിയുള്ള ആർക്കും ഈ ഷോട്ട് കാണാം. -shotPageConfirmDeletion = ഈ ഷോട്ട് സ്ഥിരമായി നീക്കം ചെയ്യണം എന്ന് താങ്കൾക്ക് ഉറപ്പാണോ? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = നിങ്ങൾ ഒന്നും ചെയ്തില്ലെങ്കിൽ, ഈ ഷോട്ട് സ്ഥിരമായി നീക്കം ചെയ്യപ്പെടും . -shotPageDeleteButton = - .title = ഈ ഷോട്ട് നീക്കം ചെയ്യുക -shotPageDownloadShot = - .title = ഡൗണ്‍ലോഡ് -shotPageDownload = ഡൗണ്‍ലോഡ് -shotPageUpsellFirefox = ഫയർഫോക്സ് ഇപ്പോൾ നേടൂ -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = ഈ ഷോട്ടിന്റെ യുആ‍ർഎൽ നിങ്ങളുടെ ഇമെയിലിൽ ഉൾക്കൊള്ളിക്കുക: { $url } -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = സമയം തെരഞ്ഞെടുക്കുക -shotPageKeepTenMinutes = 10 മിനുട്ട് -shotPageKeepOneHour = ഒരു മണിക്കൂർ -shotPageKeepOneDay = ഒരു ദിവസം -shotPageKeepOneWeek = ഒരാഴ്ച -shotPageKeepTwoWeeks = രണ്ട് ആഴ്ചകള്‍ -shotPageKeepOneMonth = ഒരു മാസം -shotPageSaveExpiration = സംരക്ഷിക്കുക -shotPageCancelExpiration = റദ്ദാക്കുക -shotPageDoesNotExpire = കാലാവധി കഴിയുന്നില്ല -timeDiffJustNow = ഇപ്പോള്‍ -timeDiffMinutesAgo = - { $number -> - [one] 1 മിനിറ്റ് മുൻപ് - *[other] { $number } മിനിറ്റുകൾ മുൻപ് - } -timeDiffHoursAgo = - { $number -> - [one] 1 മണിക്കൂർ മുൻപ് - *[other] { $number } മണിക്കൂറുകൾ മുൻപ് - } -timeDiffDaysAgo = - { $number -> - [one] ഇന്നലെ - *[other] { $number } ദിവസങ്ങൾക്ക് മുൻപ് - } -timeDiffFutureSeconds = നിമിഷങ്ങൾക്കകം -timeDiffFutureMinutes = - { $number -> - [one] 1 മിനിറ്റിനകം - *[other] { $number } മിനിറ്റുകൾക്കകം - } -timeDiffFutureHours = - { $number -> - [one] 1 മണിക്കൂറിനകം - *[other] { $number } മണിക്കൂറുകൾക്കകം - } -timeDiffFutureDays = - { $number -> - [one] നാളെ - *[other] { $number } ദിവസങ്ങൾക്കുള്ളിൽ - } - -## Annotations - - -## Settings Page - - -## Shotindex page - -shotIndexPageSearchPlaceholder = - .placeholder = എന്റെ ഷോട്ടുകൾ തിരയുക -shotIndexPageSearchButton = - .title = തിരയുക -shotIndexPagePreviousPage = - .title = മുൻപത്തെ താൾ -shotIndexPageNextPage = - .title = അടുത്ത താൾ - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - -metricsPageShotsQueryCount = ഷോട്ടുകളുടെ എണ്ണം -metricsPageShotsQueryDay = ദിവസം -metricsPageUsersQueryCount = ഉപയോക്താക്കളുടെ എണ്ണം -metricsPageUsersQueryDay = ദിവസം -metricsPageUserShotsQueryTitle = ഓരോ ഉപയോക്താവിനുള്ള ഷോട്ടുകളുടെ എണ്ണം -metricsPageUserShotsQueryCount = ഉപയോക്താക്കളുടെ എണ്ണം -metricsPageRetentionQueryUsers = ഉപയോക്താക്കളുടെ എണ്ണം -metricsPageTotalRetentionQueryUsers = ഉപയോക്താക്കളുടെ എണ്ണം -metricsPageVersionQueryTitle = ആഡ്-ഓൺ പതിപ്പ് -metricsPageVersionQueryUsers = പ്രവേശിക്കുന്ന ഉപയോക്താക്കളുടെ എണ്ണം -metricsPageVersionQueryVersion = ആഡ്-ഓൺ പതിപ്പ് -metricsPageVersionQueryLastSeen = ദിവസം -metricsPageHeader = മെട്രിക്ക് diff --git a/locales/mn/server.ftl b/locales/mn/server.ftl deleted file mode 100644 index 93292f407b..0000000000 --- a/locales/mn/server.ftl +++ /dev/null @@ -1,224 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gHomeLink = Эхлэл хуудас - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Үйлчилгээний нөхцөл -footerLinkPrivacy = Нууцлал мэдэгдэл -footerLinkFaqs = ТТА хуудас -footerLinkDMCA = Оюуны өмчийг зөрчлийг мэдээлэх -footerLinkDiscourse = Санал хүсэлт илгээх -footerLinkRemoveAllData = Өгөгдлийг хамаг арилгах - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } үүсгэж байна -creatingPageTitleDefault = хуудас - -## Home page - -homePageTeaser = Тун удахгүй… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Үнэ төлбөргүй татж авах -homePageGetStarted = Эхлэх -homePageGetStartedTitle = Эхэлцгээе -homePageCapturePage = Хуудасын зурагыг авах -homePageSaveShare = Хадгалаад хуваалцах -homePageLegalLink = Эрхзүй -homePagePrivacyLink = Нууцлал -homePageTermsLink = Үйлчилгээний нөхцөл -homePageCookiesLink = Күүкий - -## Leave Screenshots page - -leavePageRemoveAllData = Өгөгдлийг хамаг арилгах -leavePageErrorGeneric = Алдаа гарлаа -leavePageButtonProceed = Үргэлжлүүлэх -leavePageButtonCancel = Цуцлах - -## Not Found page - -notFoundPageTitle = Хуудас олдоогүй -notFoundPageIntro = Өө! -notFoundPageDescription = Хуудас олдоогүй. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Дэлгэцийн зураг: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Дуусах хугацаагийг хадгалсанд алдаа гарлаа -shotPageAlertErrorUpdatingTitle = Гарчгийг хадгалсанд алдаа гарлаа -shotPageShareButton = - .title = Хуваалцах -shotPageCopy = Хуулах -shotPageCopied = Хуулбарласан -shotPageShareFacebook = - .title = Facebook–т хуваалцах -shotPageShareTwitter = - .title = Twitter–д хуваалцах -shotPageSharePinterest = - .title = Pinterest–эд хуваалцах -shotPageCopyImageText = - .label = Дүрсийнн бичвэрийг хуулах -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date } хүртэл сэргээх -shotPageDownloadShot = - .title = Татаж авах -shotPageEditButton = - .title = Энэ дүрсийг засварлах -shotPageDownload = Татаж авах -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Үргэлжлэх хугацаагыг сонгох -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Тодорхойгүй үргэлжлэх хугацаа ∞ -shotPageKeepTenMinutes = 10 минут -shotPageKeepOneHour = 1 цаг -shotPageKeepOneDay = 1 өдөр -shotPageKeepOneWeek = 1 долоо хоног -shotPageKeepTwoWeeks = 2 долоо хоног -shotPageKeepOneMonth = 1 сар -shotPageSaveExpiration = хадгалах -shotPageCancelExpiration = цуцлах -shotPageDoesNotExpire = хугацаа дуусахгүй -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = хугацаа дуусана -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = хугацаа дууссан -timeDiffJustNow = мөнөөхөн -timeDiffMinutesAgo = - { $number -> - [one] 1 минутын өмнө - *[other] { $number } минутын өмнө - } -timeDiffHoursAgo = - { $number -> - [one] 1 цагын өмнө - *[other] { $number } цагын өмнө - } -timeDiffDaysAgo = - { $number -> - [one] өчигдөр - *[other] { $number } өдрийн өмнө - } -timeDiffFutureSeconds = хэдэн сэкундын дотор -timeDiffFutureMinutes = - { $number -> - [one] 1 минутын дотор - *[other] { $number } минутын дотор - } -timeDiffFutureHours = - { $number -> - [one] 1 цагын дотор - *[other] { $number } цагыг дотор - } -timeDiffFutureDays = - { $number -> - [one] маргааш - *[other] { $number } өдрийн дотор - } - -## Annotations - -annotationPenButton = - .title = Үзэг -annotationHighlighterButton = - .title = Тодруулагч -annotationUndoButton = - .title = Үйлдэл буцаах -annotationRedoButton = - .title = Үйлдэл давтах -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Арилгах -annotationCropButton = - .title = Хайчлах -annotationSaveEditButton = Хадгалах - .title = Засварыг хадгалах -annotationCancelEditButton = Цуцлах - .title = Засварыг цуцлах -annotationCropConfirmButton = Бататгах - .title = Сонгосон хэсгийг бататгах -annotationCropCancelButton = Цуцлах - .title = Сонголтыг цуцлах -annotationColorWhite = - .title = цагаан -annotationColorBlack = - .title = хар -annotationColorRed = - .title = улаан -annotationColorGreen = - .title = ногоон -annotationColorBlue = - .title = хөх -annotationColorYellow = - .title = шар -annotationColorPurple = - .title = ягаан -annotationColorSeaGreen = - .title = тэнгисийн ус мэт ногоон -annotationColorGrey = - .title = саарал - -## Settings Page - -settingsDisconnectButton = Холболт салгах - .title = Холболт салгах -settingsGuestAccountMessage = Зочин хэрэглэгч -settingsSignInButton = Нэвтрэх - .title = Нэвтрэх -settingsClosePreferences = - .title = Сонголтуудыг хаах - -## Shotindex page - -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Хуудасыг дүрслэн харуулахт алдаа гарлаа: { $error } -shotIndexPageSearchButton = - .title = Хайлт -shotIndexPageClearSearchButton = - .title = Хайлтыг арилгах -shotIndexPagePreviousPage = - .title = Өмнөх хуудас -shotIndexPageNextPage = - .title = Дараагийн хуудас - -## Delete Confirmation Dialog - -shotDeleteCancel = Цуцлах - .title = Цуцлах -shotDeleteConfirm = Устгах - .title = Устгах - -## Metrics page -## All metrics strings are optional for translation - -metricsPageTotalsQueryTitle = Нийт дүн -metricsPageShotsQueryDay = Өдөр -metricsPageUsersQueryCount = Хэрэглэгчийн тоо -metricsPageUsersQueryDay = Өдөр -metricsPageUserShotsQueryCount = Хэрэглэгчийн тоо -metricsPageRetentionQueryUsers = Хэрэглэгчийн тоо -metricsPageTotalRetentionQueryUsers = Хэрэглэгчийн тоо -metricsPageVersionQueryTitle = Нэмэлт хэрэглүүрийн хувилбар -metricsPageVersionQueryUsers = Хэвтрэж баих хэрэглэгчийн тоо -metricsPageVersionQueryVersion = Нэмэлт хэрэглүүрийн хувилбар -metricsPageVersionQueryLastSeen = Өдөр -metricsPageHeader = Хэмжүүр -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Үүсгэгдсэн хугацааны тамга: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = Өгөгдлийн сангийн хугацааны тамга: ({ $time } мс) diff --git a/locales/mr/server.ftl b/locales/mr/server.ftl deleted file mode 100644 index 055d4c5983..0000000000 --- a/locales/mr/server.ftl +++ /dev/null @@ -1,356 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = माझे शॉट्स -gHomeLink = मुख्य पटल -gNoShots = - .alt = शॉट्स सापडले नाहीत - -## Header - -buttonSettings = - .title = सेटिंग -buttonSignIn = - .title = साइन इन करा -onboardingPromoDismissButton = बरखास्त - .title = बरखास्त - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = अटी -footerLinkPrivacy = गोपनीयता सूचना -footerLinkFaqs = नेहमी विचारले जाणारे प्रश्न -footerLinkDMCA = IP भंग केल्याची तक्रार नोंदवा -footerLinkDiscourse = अभिप्राय द्या -footerLinkRemoveAllData = सर्व डेटा काढुन टाका - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } तयार करत आहे -creatingPageTitleDefault = पृष्ठ -creatingPageWaitMessage = आपला शॉट जतन करीत आहे... - -## Home page - -homePageDescription = - .content = अंतर्ज्ञानी स्क्रीनशॉट थेट ब्राउझर मध्ये. Firefox वर वेब ब्राउझ करताना स्क्रीनशॉट घ्या, जतन करा आणि शेअर करा. -homePageButtonMyShots = माझ्या शॉट्सवर जा -homePageTeaser = लवकरच येत आहे... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = मोफत डाऊनलोड -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox स्क्रीनशॉट्स कसे काम करतात -homePageGetStartedTitle = सुरूवात करा -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = पत्ता पट्टी वरच्या पृष्ठ क्रिया मेनू मधून स्क्रीनशॉटचे चिन्ह निवडा, आणि आपल्या ब्राउझर पटलावर स्क्रीनशॉट मेनू अवतरेल. -homePageCaptureRegion = क्षेत्र कॅप्चर करा -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = प्रतिमा बनवायचे क्षेत्र निवडण्यासाठी क्लिक करून ओढा. किंवा फक्त वरचेवर फिरवा आणि क्लिक करा — स्क्रीनशॉट्स आपल्यासाठी क्षेत्र निवडेल. आपण पाहिले ते आवडले का? आपले स्क्रीनशॉट नंतर वापरण्यासाठी जतन करणे निवडा किंवा डाउनलोड करण्यासाठी खालील बाणाचे बटन निवडा. -homePageCapturePage = पृष्ठ कॅप्चर करा -homePageCapturePageDescription = वरील उजवी बटने पूर्ण पृष्ठ साठवण्यासाठी वापरा. आपण स्क्रोल न करता पाहू शकणारे क्षेत्र दर्शनीय साठवा बटन साठवेल, आणि पूर्ण पृष्ठ साठवा बटन पूर्ण पृष्ठ साठवेल. -homePageLegalLink = कायदेशीर -homePagePrivacyLink = गुप्तता -homePageTermsLink = अटी -homePageCookiesLink = कुकीज - -## Leave Screenshots page - -leavePageRemoveAllData = सगळा डेटा काढून टाका -leavePageErrorGeneric = एक त्रुटी आली. -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = हे आपले सर्व Firefox स्क्रीनशॉट्स डेटा कायमचे पुसून टाकेल. -leavePageButtonProceed = पुढे जा -leavePageButtonCancel = रद्द करा -leavePageDeleted = आपले सर्व स्क्रीनशॉट्स मिटविण्यात आले आहेत! - -## Not Found page - -notFoundPageTitle = पृष्ठ आढळले नाही -notFoundPageIntro = अरेच्या. -notFoundPageDescription = पृष्ठ आढळले नाही - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = स्क्रीनशॉट: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = कालबाह्यता जतन करताना त्रुटी -shotPageAlertErrorDeletingShot = शॉट हटविताना त्रुटी -shotPageAlertErrorUpdatingTitle = शीर्षक जतन करताना त्रुटी -shotPageConfirmDelete = आपल्याला खात्री आहे आपण हा शॉट कायमचा हटवू इच्छिता? -shotPageShareButton = - .title = सामायिक करा -shotPageCopyButton = - .title = प्रतिमा क्लिपबोर्डवर कॉपी करा -shotPageCopyActionLabel = प्रत बनवा -shotPageCopied = प्रतिकृत केली -shotPageShareFacebook = - .title = Facebook वर सामायिक करा -shotPageShareTwitter = - .title = Twitter वर सामायिक करा -shotPageSharePinterest = - .title = Pinterest वर सामयिक करा -shotPageShareEmail = - .title = ईमेलद्वारे दुवा सामयिक करा -shotPageShareLink = या शॉटवर सामयिक करण्यासाठी दुवा मिळवा: -shotPagePrivacyMessage = दुवा असलेला कोणीही हा शॉट पाहू शकतो. -shotPageCopyImageText = - .label = प्रतिमा मजकूराची प्रत बनवा -shotPageConfirmDeletion = आपण निश्चितपणे हा शॉट कायमचा हटवू इच्छिता? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = आपण काहीही न केल्यास, हा शॉट कायमचा हटविला जाईल . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date } पर्यंत पुनर्संचयित करा -shotPageExpiredMessage = हा शॉट कालबाह्य झाला आहे. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = या पृष्ठावरुन हे तयार करण्यात आले होते: -shotPageDeleteButton = - .title = हा शॉट हटवा -shotPageDownloadShot = - .title = डाउनलोड -shotPageEditButton = - .title = ही प्रतिमा संपादित करा -shotPagefavoriteButton = - .title = हा शॉट आवडता म्हणून चिन्हांकित करा -shotPageAllShotsButton = - .title = सर्व शॉट -shotPageDMCAMessage = तृतीय पक्ष बौद्धिक संपत्ती दाव्यामुळे हा शॉट उपलब्ध नाही. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = अधिक माहिती साठी कृपया { $dmca } ला इमेल करा. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = आपले शॉट्सवर जर अनेक दावे असतील, तर आम्ही आपला Firefox Screenshots वापर थांबवु शकतो. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = कृपया आपल्या इमेल मध्ये या शॉटची URLसामील करा: { $url } -shotPageKeepFor = हा शॉट किती काळ राखून ठेवला पाहिजे? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = वेळ निवडा -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = अनिश्चित काळासाठी ∞ -shotPageKeepTenMinutes = 10 मिनिटे -shotPageKeepOneHour = 1 तास -shotPageKeepOneDay = 1 दिवस -shotPageKeepOneWeek = 1 आठवडा -shotPageKeepTwoWeeks = 2 आठवडे -shotPageKeepOneMonth = 1 महिना -shotPageSaveExpiration = जतन करा -shotPageCancelExpiration = रद्द करा -shotPageDoesNotExpire = कालबाह्य होत नाही -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = कालबाह्य -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = कालबाह्य झाले -timeDiffJustNow = आत्ताच -timeDiffMinutesAgo = - { $number -> - [one] 1 मिनिटापूर्वी - *[other] { $number } मिनिटांपूर्वी - } -timeDiffHoursAgo = - { $number -> - [one] 1 तासापूर्वी - *[other] { $number } तासांपूर्वी - } -timeDiffDaysAgo = - { $number -> - [one] काल - *[other] { $number } दिवसांपूर्वी - } -timeDiffFutureSeconds = काही सेकंदात -timeDiffFutureMinutes = - { $number -> - [one] 1 मिनिटात - *[other] { $number }मिनिटे मध्ये - } -timeDiffFutureHours = - { $number -> - [one] 1 तासात - *[other] { $number } तासांमध्ये - } -timeDiffFutureDays = - { $number -> - [one] उद्या - *[other] { $number } दिवसात - } -errorThirdPartyCookiesEnabled = जर आपण हा स्क्रीनशॉट घेतला असाल आणि नष्ट करू शकत नसाल तर आपल्याला ब्राउझर प्राधान्यतेमधून तृतीयपक्षीय कुकीज तात्पुरत्या सक्षम कराव्या लागतील. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = नोंद घ्या! -promoMessage = अद्ययावत संपादन साधने आपल्याला स्क्रीनशॉट कापू, प्रकाशमय करू देतात आणि मजकूरही जोडू देतात. -promoLink = वापरून पहा -promoCloseButton = - .title = सूचना बंद करा - -## Annotations - -annotationPenButton = - .title = पेन -annotationHighlighterButton = - .title = हाइलाइटर -annotationUndoButton = - .title = पूर्ववत् करा -annotationRedoButton = - .title = पुन्हा करा -annotationTextButton = - .title = मजकूर जोडा -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = नष्ट करा -annotationCropButton = - .title = क्रॉप करा -annotationSaveEditButton = जतन करा - .title = संपादन जतन करा -annotationCancelEditButton = रद्द करा - .title = संपादन रद्द करा -annotationCropConfirmButton = निश्चित करा - .title = निवड निश्चित करा -annotationCropCancelButton = रद्द करा - .title = निवड रद्द करा -annotationColorWhite = - .title = पांढरा -annotationColorBlack = - .title = काळा -annotationColorRed = - .title = लाल -annotationColorGreen = - .title = हिरवा -annotationColorBlue = - .title = निळा -annotationColorYellow = - .title = पिवळा -annotationColorPurple = - .title = जांभळा -annotationColorSeaGreen = - .title = शेवाळी -annotationColorGrey = - .title = करडा -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = मजकूर आकार -# Values shown in text size selection dropdown -textSizeSmall = छोटा -textSizeMedium = मध्यम -textSizeLarge = मोठा -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = निश्चित करा - .title = निश्चित करा -textToolCancelButton = रद्द करा - .title = रद्द करा -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = नमस्कार - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - - -## Settings Page - -settingsDisconnectButton = जोडणी मोडा - .title = जोडणी मोडा -settingsGuestAccountMessage = अतिथी खाते -settingsSignInButton = साइन इन - .title = साइन इन -SettingsPageHeader = Firefox स्क्रीनशॉट्स सेटिंग्ज -settingsFirefoxAccountSubHeader = Firefox खाते -settingsClosePreferences = - .title = प्राधान्यता बंद करा - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = शॉट हटविताना त्रुटी: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = माझे शॉट्स: { $searchTerm } साठी शोधा -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = पृष्ठ सादर करताना त्रुटी:{ $error } -shotIndexPageSearchPlaceholder = - .placeholder = माझे शॉट्स शोधा -shotIndexPageNoShotsMessage = कोणतेही जतन केलेले शॉट्स नाहीत -shotIndexPageNoShotsInvitation = चला, काही तरी तयार करा. -shotIndexPageLookingForShots = आपले शॉट्स शोधत आहे... -shotIndexPageNoSearchResultsIntro = हम्म -shotIndexPageNoSearchResults = आम्ही आपल्या शोधाशी जुळणारे कोणतेही शॉट्स शोधू शकत नाही. -shotIndexPageMyShotsButton = - .title = माझे शॉट -shotIndexPageClearSearchButton = - .title = शोध नष्ट करा -shotIndexPageConfirmShotDelete = हा शॉट हटवायचा? -shotIndexPagePreviousPage = - .title = मागील पृष्ठ -shotIndexPageNextPage = - .title = पुढील पृष्ठ -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = हा शॉट आवडता आहे आणि कालबाह्य होत नाही - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = आपल्याला खात्री आहे की आपण हा शॉट हटवू इच्छिता? -shotDeleteCancel = रद्द करा - .title = रद्द करा -shotDeleteConfirm = नष्ट करा - .title = नष्ट करा - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots मेट्रिक्स -metricsPageTotalsQueryTitle = एकूण -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Screenshots चा आढावा -metricsPageTotalsQueryDevices = नोंदवलेले एकुण साधने -metricsPageTotalsQueryActiveShots = चालु शॉट्स -metricsPageTotalsQueryExpiredShots = कालबाह्य (पण पुनर्प्राप्त करण्याजोगे) -metricsPageTotalsQueryExpiredDeletedShots = कालबाह्य (आणि नष्ट झालेले) -metricsPageShotsQueryTitle = दिवसानुसार शॉट्स -metricsPageShotsQueryDescription = प्रत्येक दिवसाला तयार केलेले शॉट्स (मागील 30 दिवसांसाठी) -metricsPageShotsQueryCount = शॉट्सची संख्या -metricsPageShotsQueryDay = दिवस -metricsPageUsersQueryTitle = दिवसा नुसार वापरकर्ते -metricsPageUsersQueryDescription = वापरकर्त्यांची संख्या ज्यांनी किमान एक शॉट तरी तयार केला, दिवसानुसार (मागील 30 दिवसांसाठी) -metricsPageUsersQueryCount = वापरकर्त्यांची संख्या -metricsPageUsersQueryDay = दिवस -metricsPageUserShotsQueryTitle = प्रति वापरकर्ता शॉट संख्या -metricsPageUserShotsQueryDescription = एकूण N शॉट्स असलेल्या वापरकर्त्यांची संख्या -metricsPageUserShotsQueryCount = वापरकर्त्यांची संख्या -metricsPageUserShotsQueryShots = सक्रिय (अनावृत्त) शॉट्सची अंदाजे संख्या -metricsPageRetentionQueryTitle = आठवड्यातून धारणा -metricsPageRetentionQueryDescription = वापरकर्त्याच्या पहिल्या स्क्रीनशॉट पासून नवीनतम पर्यंतच्या दिवसांची संख्या, प्रारंभी आठवड्याद्वारे एकत्रीत. -metricsPageRetentionQueryUsers = वापरकर्त्यांची संख्या -metricsPageRetentionQueryDays = वापरकर्त्याच्या प्रथमपासून सर्वात अलीकडील शॉट्स चे दिवस -metricsPageRetentionQueryFirstWeek = वापरकर्त्याने पहिला शॉट बनवला तो आठवडा -metricsPageTotalRetentionQueryTitle = एकूण धारणा -metricsPageTotalRetentionQueryDescription = वापरकर्ते शॉट बनवत आहेत तो कालावधी, आठवड्यानुसार एकत्रीत -metricsPageTotalRetentionQueryUsers = वापरकर्त्यांची संख्या -metricsPageTotalRetentionQueryDays = वापरकर्त्यांनी शॉट्स तयार केले ते दिवस -metricsPageVersionQueryTitle = अॅड-ऑन आवृत्ती -metricsPageVersionQueryDescription = गेल्या 14 दिवसांमध्ये लॉगिन दरम्यान वापरली गेलेली ऍड-ऑनची आवृत्ती -metricsPageVersionQueryUsers = लॉगिन करणाऱ्या वापरकर्त्यांची संख्या -metricsPageVersionQueryVersion = ॲड-ऑन आवृत्ती -metricsPageVersionQueryLastSeen = दिवस -metricsPageHeader = मेट्रिक्स -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = येथे तयार झाले: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (database time: { $time }ms) diff --git a/locales/ms/server.ftl b/locales/ms/server.ftl deleted file mode 100644 index e9852785f3..0000000000 --- a/locales/ms/server.ftl +++ /dev/null @@ -1,387 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Syot Saya -gHomeLink = Halaman utama -gNoShots = - .alt = Tiada syot ditemukan -gScreenshotsDescription = Skrinsyot menjadi mudah. Ambil, simpan dan kongsi skrinsyot tanpa keluar daripada Firefox. - -## Header - -buttonSettings = - .title = Tetapan -buttonSignIn = - .title = Daftar Masuk -screenshotsLogo = - .title = Laman Screenshots -bannerSignIn = Daftar masuk atau mendaftar untuk mengakses syot dalam peranti dan simpan syot kegemaran selama-lamanya. -bannerUpsell = { gScreenshotsDescription } Dapatkan Firefox sekarang -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Apa yang baharu dalam Firefox Screenshots? -onboardingPromoMessage = Sekarang, log masuk ke Screenshota dengan Akaun Firefox dan lakukan: -onboardingPromoMessageListItem1 = Akses pustaka dalam semua peranti anda -onboardingPromoMessageListItem2 = Simpan syot kegemaran anda selama-lamanya -onboardingPromoDismissButton = Abai - .title = Abai -onboardingPromoSigninButton = Daftar masuk - .title = Daftar masuk - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Terma -footerLinkPrivacy = Notis Privasi -footerReportShot = Laporkan Syot - .title = Laporkan syot ini kerana salah guna, spam atau masalah lain -footerLinkFaqs = Soalan Lazim -footerLinkDMCA = Lapor Pencerobohan IP -footerLinkDiscourse = Beri maklum balas -footerLinkRemoveAllData = Buang Semua Data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Mencipta { $title } -creatingPageTitleDefault = halaman -creatingPageWaitMessage = Menyimpan syot anda... - -## Home page - -homePageDescription = - .content = Skrinsyot intuitif dihasilkan terus ke dalam pelayar. Ambil, simpan dan kongsi skrinsyot sambil anda melayari Web menggunakan Firefox. -homePageButtonMyShots = Pergi Ke Syot Saya -homePageTeaser = Akan Datang... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Muat turun Percuma -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Bagaimana Firefox Screenshots Berfungsi -homePageGetStartedTitle = Mulakan -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescription = Cari ikon baru Screenshots pada bar alatan anda. Pilih, dan menu Screenshots akan muncul pada bahagian atas tetingkap pelayar anda. -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Pilih ikon Screenshots dalam menu tindakan halaman di dalam bar alamat, tetingkap menu Screenshots akan diserlahkan pada bahagian atas tetingkap pelayar. -homePageCaptureRegion = Ambil gambar Lingkungan -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klik dan seret untuk memilih kawasan yang mahu ambil gambar. Atau hanya hela dan klik - Screenshots akan pilihkan kawasan untuk anda. Suka dengan gambar itu? Pilih Simpan untuk mengakses skrinsyot dalam talian atau butang anak panah ke bawah untuk memuatturun ke komputer anda. -homePageCapturePage = Ambil gambar Halaman -homePageCapturePageDescription = Gunakan butang yang muncul pada bahagian atas kanan untuk mengambil gambar penuh halaman. Butang Simpan Tampak akan mengambil gambar kawasan yang anda nampak tanpa skrol, dan Simpan Halaman Penuh akan mengambil gambar keseluruhan halaman. -homePageSaveShare = Simpan dan Kongsi -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageShaveShareFavoriteDescription = Ambil syot yang terbaik. Kemudian simpan ke pustaka atas talian Screenshots, dan Firefox akan menyalin pautan ke klip supaya mudah untuk dikongsi. Syot dalam pustaka secara automatik akan luput selepas dua minggu, tetapi anda boleh hapuskannya pada bila-bila masa atau pilih untuk menyimpannya lebih lama. -homePageSignInTitle = Syot Anda Di Mana Sahaja -homePageSignInDescription = Daftar masuk ke Screenshots dengan Akaun Firefox untuk mengakses semua syot di mana sahaja anda menggunakan Firefox. Bonus tambahan: anda juga boleh simpan syot selama-lamanya. -homePageLegalLink = Perundangan -homePagePrivacyLink = Privasi -homePageTermsLink = Terma -homePageCookiesLink = Kuki - -## Leave Screenshots page - -leavePageRemoveAllData = Buang Semua Data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Anda perlu ada Firefox Screenshots yang dipasang atau sudah log masuk ke Akaun Firefox untuk membuang akaun -leavePageErrorGeneric = Ada ralat -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Ini akan menghapuskan semua data Firefox Screenshots anda secara kekal. -leavePageButtonProceed = Teruskan -leavePageButtonCancel = Batal -leavePageDeleted = Semua skrinsyot anda telah dihapuskan! - -## Not Found page - -notFoundPageTitle = Halaman Tidak Ditemukam -notFoundPageIntro = Ooops. -notFoundPageDescription = Halaman tidak ditemui - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Skrinsyot: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Ralat menyimpan tempoh tamat -shotPageAlertErrorDeletingShot = Ralat menghapuskan syot -shotPageAlertErrorUpdatingTitle = Ralat menyimpan tajuk -shotPageConfirmDelete = Anda pasti mahu menghapuskan syot ini secara kekal? -shotPageShareButton = - .title = Kongsi -shotPageCopyButton = - .title = Salin imej ke klipbod -shotPageCopyActionLabel = Salin -shotPageCopied = Disalin -shotPageShareFacebook = - .title = Kongsi di Facebook -shotPageShareTwitter = - .title = Kongsi di Twitter -shotPageSharePinterest = - .title = Kongsi di Pinterest -shotPageShareEmail = - .title = Kongsi pautan via e-mel -shotPageShareLink = Dapatkan pautan untuk kongsi syot ini: -shotPagePrivacyMessage = Sesiapa yang ada pautan ini boleh melihat syot ini. -shotPageCopyImageText = - .label = Salin teks imej -shotPageConfirmDeletion = Anda pasti mahu menghapuskan syot ini secara kekal? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Jika tiada tindakan, syot ini akan dihapuskan secara kekal . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = pulih hingga { $date } -shotPageExpiredMessage = Syot ini sudah tamat tempoh. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Ini halaman asal yang diambil: -shotPageDeleteButton = - .title = Buang syot ini -shotPageDownloadShot = - .title = Muat turun -shotPageEditButton = - .title = Edit imej ini -shotPagefavoriteButton = - .title = Syot ini kegemaran -shotPageBackToHomeButton = - .title = Laman -shotPageAllShotsButton = - .title = Semua Syot -shotPageScreenshotsDescription = Skrinsyot menjadi mudah. Ambil, simpan dan kongsi skrinsyot tanpa keluar daripada Firefox. -shotPageDMCAMessage = Syot ini tidak lagi tersedia kerana tuntutan harta intelek pihak ketiga. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Sila e-mel { $dmca } untuk mendapatkan maklumat lanjut. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = JIka Syot anda tertakluk kepada pelbagai tuntutan, kami boleh menarik balik akses anda ke Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Sila sertakan URL syot ini dalam e-mel anda: { $url } -shotPageKeepFor = Berapa lama syot ini perlu disimpan? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Pilih masa -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = ∞ selama-lamanya -shotPageKeepTenMinutes = 10 minit -shotPageKeepOneHour = 1 Jam -shotPageKeepOneDay = I Hari -shotPageKeepOneWeek = 1 Minggu -shotPageKeepTwoWeeks = 2 Minggu -shotPageKeepOneMonth = 1 Bulan -shotPageSaveExpiration = simpan -shotPageCancelExpiration = batal -shotPageDoesNotExpire = tiada tamat tempoh -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = tamat tempoh -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = tamat tempoh -timeDiffJustNow = sebentar tadi -timeDiffMinutesAgo = - { $number -> - *[other] 1 minit lepas - } -timeDiffHoursAgo = - { $number -> - *[other] 1 jam lepas - } -timeDiffDaysAgo = - { $number -> - *[other] semalam - } -timeDiffFutureSeconds = dalam beberapa saat -timeDiffFutureMinutes = - { $number -> - *[other] dalam 1 minit - } -timeDiffFutureHours = - { $number -> - *[other] dalam 1 jam - } -timeDiffFutureDays = - { $number -> - *[other] esok - } -errorThirdPartyCookiesEnabled = Jika anda ambil syot ini dan tidak boleh dibuang, anda mungkin perlu dayakan sementara kuki pihak ketiga dalam keutamaan pelayar anda. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Perhatian! -promoMessage = Alatan edit yang dikemaskini membolehkan anda memotong, menyerlah dan menambah teks. -promoLink = Anda perlu cuba -promoCloseButton = - .title = Tutup notifikasi - -## Annotations - -annotationPenButton = - .title = Pen -annotationHighlighterButton = - .title = Penyerlah -annotationUndoButton = - .title = Batal -annotationRedoButton = - .title = Ulang -annotationTextButton = - .title = Tambah teks -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Buang -annotationCropButton = - .title = Potong -annotationSaveEditButton = Simpan - .title = Simpan edit -annotationCancelEditButton = Batal - .title = Batal mengedit -annotationCropConfirmButton = Sahkan - .title = Sahkan pemilihan -annotationCropCancelButton = Batal - .title = Batalkan pemilihan -annotationColorWhite = - .title = Putih -annotationColorBlack = - .title = Hitam -annotationColorRed = - .title = Merah -annotationColorGreen = - .title = Hijau -annotationColorBlue = - .title = Biru -annotationColorYellow = - .title = Kuning -annotationColorPurple = - .title = Ungu -annotationColorSeaGreen = - .title = Hijau Laut -annotationColorGrey = - .title = Kelabu -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Saiz teks -# Values shown in text size selection dropdown -textSizeSmall = Kecil -textSizeMedium = Sederhana -textSizeLarge = Besar -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Sahkan - .title = Sahkan -textToolCancelButton = Batal - .title = Batal -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Helo - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Ada sesuatu yang silap -copyImageErrorMessage = Tidak dapat menyalin syot anda ke klipbod. - -## Settings Page - -settingsDisconnectButton = Memutuskan - .title = Memutuskan -settingsGuestAccountMessage = Akaun Tetamu -settingsSignInInvite = Daftar masuk untuk sync semua peranti -settingsSignInButton = Daftar masuk - .title = Daftar masuk -SettingsPageHeader = Tetapan Firefox Screenshots -settingsDescription = Anda boleh daftar masuk dengan Akaun Firefox untuk sync skrinsyot semua peranti dan akses secara peribadi. -settingsFirefoxAccountSubHeader = Akaun Firefox -settingsClosePreferences = - .title = Tutup keutamaan -settingsFxaDisconnectAlertMessage = Adakah anda pasti mahu memutuskan sambungan peranti ini dengan Akaun Firefox anda? -settingsFxaDisconnectDescription = Jika log keluar, anda perlu log masuk sekali lagi untuk mendapatkan semula akses ke skrinsyot anda. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Ralat menghapuskan syot: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Syot Saya: cari { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Ralat mentafsir halaman: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Carian syot saya -shotIndexPageNoShotsMessage = Tiada syot disimpan. -shotIndexPageNoShotsInvitation = Ayuh, ambil gambar. -shotIndexPageLookingForShots = Mencari syot anda... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Kami tidak menemui syot yang sepadan dengan carian anda. -shotIndexPageMyShotsButton = - .title = Syot Saya -shotIndexPageClearSearchButton = - .title = Padam carian -shotIndexPageConfirmShotDelete = Buang syot ini? -shotIndexPagePreviousPage = - .title = Halaman dahulu -shotIndexPageNextPage = - .title = Halaman berikut -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Ini bukan syot kegemaran dan akan luput -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Ini syot kegemaran saya dan tidak akan luput -shotIndexSyncedShot = - .title = Syot diambil pada peranti lain -shotIndexAlertErrorFavoriteShot = Ralat mengemaskini status syot kegemaran - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Adakah anda pasti mahu menghapuskan syot ini? -shotDeleteCancel = Batal - .title = Batal -shotDeleteConfirm = Buang - .title = Buang - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Matriks Firefox Screenshots -metricsPageTotalsQueryTitle = Jumlah -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Tinjauan Screenshots -metricsPageTotalsQueryDevices = Bilangan peranti didaftar -metricsPageTotalsQueryActiveShots = Syot aktif -metricsPageTotalsQueryExpiredShots = Luput (tapi boleh dikembalikan) -metricsPageTotalsQueryExpiredDeletedShots = Luput (dan telah dibuang) -metricsPageShotsQueryTitle = Syot mengikut Hari -metricsPageShotsQueryDescription = Bilangan syot diambil setiap hari (sepanjang 30 hari lepas) -metricsPageShotsQueryCount = Bilangan syot diambil -metricsPageShotsQueryDay = Hari -metricsPageUsersQueryTitle = Pengguna mengikut hari -metricsPageUsersQueryDescription = Bilangan pengguna yang mengambil paling kurang satu syot, mengikut hari (30 hari lepas) -metricsPageUsersQueryCount = Bilangan pengguna -metricsPageUsersQueryDay = Hari -metricsPageUserShotsQueryTitle = Bilangan Syot setiap Pengguna -metricsPageUserShotsQueryDescription = Bilangan pengguna yang ada sejumlah N syot -metricsPageUserShotsQueryCount = Bilangan pengguna -metricsPageUserShotsQueryShots = Anggaran bilangan syot aktif (tiada tamat tempoh) -metricsPageRetentionQueryTitle = Dikekalkan mengikut Minggu -metricsPageRetentionQueryDescription = Bilangan hari bermula syot pertama pengguna hingga ke syot terkini, dihimpun mengikut permulaan minggu -metricsPageRetentionQueryUsers = Bilangan pengguna -metricsPageRetentionQueryDays = Bilangan hari sejak syot pengguna yang pertama hingga ke syot terkini -metricsPageRetentionQueryFirstWeek = Minggu pengguna kali pertama ambil syot -metricsPageTotalRetentionQueryTitle = Jumlah Dikekalkan -metricsPageTotalRetentionQueryDescription = Tempoh pengguna mencipta syot, dihimpun mengikut minggu -metricsPageTotalRetentionQueryUsers = Bilangan pengguna -metricsPageTotalRetentionQueryDays = Hari pengguna mencipta syot -metricsPageVersionQueryTitle = Versi Add-on -metricsPageVersionQueryDescription = Versi add-on yang digunakan semasa log masuk, dalam tempoh 14 hari lepas -metricsPageVersionQueryUsers = Bilangan pengguna menglog masuk -metricsPageVersionQueryVersion = Versi add-on -metricsPageVersionQueryLastSeen = Hari -metricsPageHeader = Matriks -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Dijana pada: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (masa pangkalan data: { $time }ms) diff --git a/locales/my/server.ftl b/locales/my/server.ftl deleted file mode 100644 index ac8e285e66..0000000000 --- a/locales/my/server.ftl +++ /dev/null @@ -1,391 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = ကိုယ်တိုင်ရိုက်ဓါတ်ပုံများ -gHomeLink = မူလ -gNoShots = - .alt = ရိုက်ကူးထားခြင်း မရှိပါ -gScreenshotsDescriptionServerless = Screenshots ကို အရိုးရှင်းဆုံး ပြုလုပ်ထားသည်။ Firefox ကို ပိတ်စရာမလိုပဲ မျက်နှာပြင် ပုံဖမ်းချက်များကို ရိုက်ကူးပြီး ဆွဲယူနိုင်သည်။ - -## Header - -buttonSettings = - .title = အပြင်အဆင်များ -buttonSignIn = - .title = ဝင်ရန် -screenshotsLogo = - .title = Screenshots မူလစာမျက်နှာ -bannerSignIn = သင့်ရိုက်ချက်အသုံးပြုခြင်းရရှိရန် အကောင့်အသစ်ဝင်ရောက်ခြင်း သို့မဟုတ် အကောင့်ဝင်ရောက်ခြင်းကိုလုပ်ဆောင်ပြီး သင့်ကြိုက်နှစ်သက်ရာများကို အမြဲသိမ်းမည် -bannerUpsell = { gScreenshotsDescription } Firefox ကို ယခုပင် ရယူပါ -shutdownWarning = သိမ်းထားသည့် ပုံဖမ်းချက်များသည် မကြာမီ သက်တမ်းကုန်ဆုံးပါတော့မည်။ ဂျွန်လမှစတင်ပြီး Screenshots သည် အွန်လိုင်းပေါ်တွင် သိမ်းစေနိုင်မည် မဟုတ်ပါ။ သင့်စာကြည့်တိုက်ထဲမှ ဖမ်းယူချက်များကို သိမ်းထားလိုပါသလား။ ၎င်းတို့ကို သင့်ကွန်ပျူတာထဲသို့ ဆွဲယူပါ။ -shutdownPageTitle = Screenshots သည် ပြောင်းလဲနေသည် -shutdownPageDescription = ဂျွန်လက စတင်ပြီး Screenshots သည် အွန်လိုင်းပေါ်တွင် သိမ်းစေနိုင်မည် မဟုတ်ပါ။ သင့်စာကြည့်တိုက်ထဲမှ ပုံဖမ်းချက်များကို သိမ်းထားလိုပါသလား။ ပုံဖမ်းချက်များကို သီးခြားစီ သို့မဟုတ် ဖိုင်တွဲလိုက် ဆွဲယူပါ။ ယခုလုပ်ဆောင်ချက်ကို အသုံးပြုသည့်အတွက် ကျေးဇူးတင်ပါသည်။ ထို့ပြင် အဆင်မပြေမှုများအတွက်လည်း တောင်းပန်ပါသည်။ -shutdownPageContinue = ပုံဖမ်းချက်များကို ရိုက်ကူး၊ ကူးပွား၊ ဆွဲယူရန် Screenshots ကို ဆက်လက်အသုံးပြုမည်ကို မျှော်လင့်ပါသည်။ -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefoxရဲ့ရိုက်ချက်များနှင့်ပတ်သက်၍ အသစ်များ -onboardingPromoMessage = အခုFirefox ကိုသင့်အကောင့်နှင့် Screenshots အတွက်လက်မှတ်ရေးထိုးခြင်းနှင့်ပိုမိုလုပ်ဆောင် -onboardingPromoMessageListItem1 = သင့်ကိရိယာများအားလုံးပေါ်တွင်သင်၏စာကြည့်တိုက်ကိုဝင်ရောက် -onboardingPromoMessageListItem2 = အမြဲသင်အကြိုက်ဆုံးရိုက်ချက်များကိုသိုလှောင်မည် -onboardingPromoDismissButton = ထုတ်ပစ်ပါ - .title = ထုတ်ပစ်ပါ -onboardingPromoSigninButton = ၀င်ပါ - .title = ၀င်ပါ - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = စည်းမျဉ်းများ -footerLinkPrivacy = ကိုယ်ရေးကာကွယ်မှု သတိပေးချက် -footerReportShot = ယခုဖမ်းယူချက်ကို သတင်းပို့ရန် - .title = လိမ်လည်၊ နှောင့်ယှက် သို့မဟုတ် အခြားပြဿနာအတွက် ယခုဖမ်းယူချက်ကို သတင်းပို့ရန် -footerLinkFaqs = မေးလေ့ရှိသော မေးခွန်းများ -footerLinkDMCA = ဉာဏမူပိုင်ခွင့် ဥပဒေချိုးဖောက်မှုကို တိုင်ကြားရန် -footerLinkDiscourse = တုံ့ပြန်ချက်ပေးရန် -footerLinkRemoveAllData = ဒေတာအားလုံးကို ဖယ်ရှားပါ - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } ကို ဖန်တီးနေသည် -creatingPageTitleDefault = စာမျက်နှာ -creatingPageWaitMessage = ရိုက်ကူးချက်ကို သိမ်းနေသည်... - -## Home page - -homePageDescription = - .content = FireFox အသုံးပြုခြင်းဖြင့် ဝက်ပေါ်တွင် သင့်ရိုက်ချက်များကို ဖမ်းထားပြီးသိမ်းဆဲ မှျဝေပါ -homePageButtonMyShots = မိမိရိုက်ထားသော ပုံများဆီ ပို့ပေးပါ -homePageTeaser = မကြာမီ လာမည်... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = အခမဲ့ ဆွဲယူပါ -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots အလုပ်လုပ်ပုံ -homePageGetStartedTitle = စတင်ပါ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = လိပ်စာဘားတန်းရှိ စာမျက်နှာဆိုင်ရာ လုပ်ဆောင်ချက်များ မီနူးထဲမှ Screenshots ပုံငယ်ကို ရွေးပါ။ ထိုအခါ Screenshots မီနူး သင့်ဘရောင်ဇာ၏ အပေါ်ဘက်နားတွင် ပေါ်လာပါမည်။ -homePageCaptureRegion = နယ်ပယ် တစ်ခုကို ပုံဖမ်းရန် -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = မိမိပုံဖမ်းလိုသော အကျယ်အဝန်းကို တိုင်းတာရွေးရန် ကလစ်နှိပ်ပြီး ဖိဆွဲပါ။ သို့မဟုတ် ပွိုင်တာမြားကို နှစ်သက်ရာပေါ်သို့ ရွှေ့တင်ပြီး ကလစ်နှိပ်ပါ — Screenshots က သင့်အတွက် အကျယ်အဝန်းကို တိုင်းတာရွေးချယ်ပေးပါမည်။ ၎င်းလုပ်ဆောင်ချက်ကို နှစ်သက်ပါသလား။ မျက်နှာပြင်ပုံဖမ်းချက်ကို အွန်လိုင်းပေါ်တွင် အသုံးပြုရန် သိမ်းပါ ကို ရွေးပါ သို့မဟုတ် ကွန်ပျူတာထဲသို့ ဆွဲယူသိမ်းရန် အောက်ညွှန်ပြမြားကို ရွေးပါ။ -homePageCapturePage = စာမျက်နှာကို ပုံဖမ်းရန် -homePageCapturePageDescription = စာမျက်နှာများကို အပြည့်ဖမ်းယူရန် ညာဘက်အပေါ်ဘက်ရှိ ခလုတ်များကို အသုံးပြုပါ။ မြင်ရသည်ကို သိမ်းပါ သည် အပေါ်အောက်ရွှေ့စရာမလိုပဲ မြင်ရသော အကျယ်အဝန်းကို ဖမ်းယူပါမည်။ ထို့ပြင် စာမျက်နှာအပြည့်သိမ်းပါ သည် လက်ရှိစာမျက်နှာတွင် မြင်ရသည်အကုန်လုံးကို ဖမ်းယူပါမည်။ -homePageDownloadCopy = ဆွဲယူ သို့မဟုတ် ပွားယူပါ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = အကောင်းဆုံး ဖမ်းယူပါ။ Screenshots သည် ရွေးချယ်ထားသည့် ဖမ်းယူချက်ကို ဆွဲယူ သို့မဟုတ် ကလစ်ဘုတ်ပေါ်သို့ ကူးယူနိုင်စေသည်။ -homePageLegalLink = ဥပဒေရေးရာ -homePagePrivacyLink = ကိုယ်ရေးလုံခြုံမှု -homePageTermsLink = စည်းမျဉ်းများ -homePageCookiesLink = ကွတ်ကီးများ - -## Leave Screenshots page - -leavePageRemoveAllData = ဒေတာအားလုံးကို ဖျက်ရန် -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = သင့်အကောင့်ဖျက်သိမ်းရန် အကောင့်ကိုဝင်ရောက်ခြင်း သို့မဟုတ် ရိုက်ချက်များအသုံးပြုမှု ထည့်သွင်းထားခြင်း ရှိရမည် -leavePageErrorGeneric = အမှားတစ်ခု ဖြစ်ခဲ့သည် -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = ဒီဟာက firefox မှ သင့်ရိုက်ချက်များကို အရှင်းဖျက်ပစ်လိမ့်မည် -leavePageButtonProceed = ဆောင်ရွက်ရန် -leavePageButtonCancel = မလုပ်တော့ပါ -leavePageDeleted = မျက်နှာပြင်ဖမ်းယူချက်များ အားလုံးကို ရှင်းလင်းပြီးပြီ။ - -## Not Found page - -notFoundPageTitle = စာမျက်နှာကို မတွေ့ပါ -notFoundPageIntro = ဟိုက်။ -notFoundPageDescription = စာမျက်နှာကို မတွေ့ပါ။ - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = စာမျက်နှာ ရိုက်ချက်၊ { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = သိမ်းဆဲကာလလွန် မှားယွင်းမှု -shotPageAlertErrorDeletingShot = ရိုက်ကူးချက် ဖျက်နေစဉ် အမှားဖြစ်ပေါ်ခဲ့သည် -shotPageAlertErrorUpdatingTitle = ခေါင်းစဉ်ကို သိမ်းနေစဉ် အမှားဖြစ်ပေါ်ခဲ့သည် -shotPageConfirmDelete = ယခုရိုက်ကူးချက်ကို အပြီးတိုင် ဖျက်မည်မှာ သေချာပါသလား။ -shotPageShareButton = - .title = မျှဝေရန် -shotPageCopyButton = - .title = ရုပ်ပုံကို ကလစ်ဘုတ်သို့ ကူးယူရန် -shotPageCopyActionLabel = ကူးယူပါ -shotPageCopied = ကူးထားသည် -shotPageShareFacebook = - .title = Facebook ပေါ်သို့ မျှဝေပါ -shotPageShareTwitter = - .title = Twitter ပေါ်သို့ မျှဝေပါ -shotPageSharePinterest = - .title = Pinterest ပေါ်သို့ မျှဝေပါ -shotPageShareEmail = - .title = အီးမေးလ်ဖြင့် ဒီလင့်ခ်ကို မျှဝေပါ -shotPageShareLink = ဒီရိုက်ချက်ကို မှျဝေနိုင်သောလင့်ခ် ရယူပါ -shotPagePrivacyMessage = ဒီရိုက်ချက် လင့်ခ်ဖြင့် မည်သူမဆိုကြည့်နိုင်သည် -shotPageCopyImageText = - .label = ပုံစာသားကို ကူးယူပါ -shotPageConfirmDeletion = သင် ဒီရိုက်ချက်ကို အရှင်းဖျက်သိမ်းချင်တာ သေချာလား -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = သင်ဘာမှမလုပ်လှျင် ဒီရိုက်ချက်ကို အတွင်း အရှင်းဖျက်ပစ်လိမ့်မည် -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date } မတိုင်ခင် ပြန်လည်သိမ်းဆဲပါ -shotPageExpiredMessage = ဒီရိုက်ချက် သက်တမ်းကုန်ပြီ -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = ဒီနေရာက ဒီဟာ စတင်ဖန်တီးခဲ့တဲ့ စာမျက်နှာပါ -shotPageDeleteButton = - .title = ဒီရိုက်ကူးချက်ကို ဖျက်ပါ -shotPageDownloadShot = - .title = ဆွဲယူပါ -shotPageEditButton = - .title = ဒီပုံကို ပြုပြင်ပါ -shotPagefavoriteButton = - .title = ယခုဖမ်းယူချက်ကို နှစ်သက်ရာစာရင်းသို့ ထည့်ရန် -shotPageBackToHomeButton = - .title = အဖွင့်စာမျက်နှာ -shotPageAllShotsButton = - .title = ရိုက်ကူးထားသော ပုံများ -shotPageScreenshotsDescriptionServerless = Screenshots ကို အရိုးရှင်းဆုံး ပြုလုပ်ထားသည်။ Firefox ကနေ ထွက်စရာမလိုပဲ မျက်နှာပြင်ပုံဖမ်းချက်များကို ရိုက်ယူပြီး ဆွဲယူပါ။ -shotPageDMCAMessage = ဖောက်ဖျက်မှုတစ်ခုခုဖြင့် အဆိုတင်သွင်းမှုကြောင့် ဒီရိုက်ချက်အား မရရှိနိုင်တော့ပါ -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = နောက်ထပ်အချက်အလက်များ တောင်းဆိုလိုပါက { $dmca } သို့ ကျေးဇူးပြု၍ အီးမေးလ်ပို့ပါ။ -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = သင့်ပုံဖမ်းချက်များသည် အခြားသူများပိုင်ဖြစ်ကြောင်း တောင်းဆိုမှုများ ရှိပါက Firefox Screenshots အသုံးပြုခြင်းကို ရုတ်သိမ်းနိုင်သည်။ -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = ကျေးဇူးပြုပြီး သင့်အီးမေးလ်ထဲတွင် ဒီရိုက်ချက် လိပ်စာလင့် ကို ထည့်ပါ: { $url } -shotPageKeepFor = ဒီရိုက်ချက်ကို ဘယ်လောက်ထိန်းသိမ်းထားသင့်လဲ -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = အချိန်ရွေးချယ်ခြင်း -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = သက်တမ်းကုန်ဆုံးခြင်းမရှိ -shotPageKeepTenMinutes = ဆယ်မိနစ် -shotPageKeepOneHour = တစ်နာရီ -shotPageKeepOneDay = တစ်ရက် -shotPageKeepOneWeek = တစ်ပတ် -shotPageKeepTwoWeeks = နှစ်ပတ် -shotPageKeepOneMonth = တစ်လ -shotPageSaveExpiration = သိမ်းဆဲပါ -shotPageCancelExpiration = မလုပ်ဆောင်ပါ -shotPageDoesNotExpire = သက်တမ်းမကုန်ဆုံးပါ -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = သက်တမ်းကုန်ဆုံးခြင်း -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = သက်တမ်းကုန်ဆုံးခြင်း -timeDiffJustNow = ယခုလေးတင် -timeDiffMinutesAgo = - { $number -> - *[other] ပြီးခဲ့သော { $number } မိနစ် - } -timeDiffHoursAgo = - { $number -> - *[other] ပြီးခဲ့သော { $number } နာရီ - } -timeDiffDaysAgo = - { $number -> - *[other] ပြီးခဲ့သော { $number } နေ့ - } -timeDiffFutureSeconds = စက္ကန့်အနည်းငယ်အတွင်း -timeDiffFutureMinutes = - { $number -> - *[other] { $number } မိနစ်ပိုင်းအတွင်း - } -timeDiffFutureHours = - { $number -> - *[other] { $number } နာရီပိုင်းအတွင်း - } -timeDiffFutureDays = - { $number -> - *[other] { $number } နေ့အတွင်း - } -errorThirdPartyCookiesEnabled = ယခုပုံကို သင်ဖမ်းယူထားပြီး ဖျက်၍မရနိုင်ပါက အခြားကွတ်ကီးအသုံးပြုမှုကို သင့်ဘရောက်ဇာ အပြင်အဆင်ထံမှ ယာယီဖွင့်ပေးရန် လိုအပ်သည်။ - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = မှတ်စုယူရန် -promoMessage = မွမ်းမံထားသော တည်းဖြတ်ကိရိယာများသည် ဖမ်းယူထားသည့်ပုံများကို ဖြတ်ညှပ်၊ အရောင်တင်၊ စာထည့် စသည်တို့ကို ဆောင်ရွက်နိုင်စေသည်။ -promoLink = စမ်းကြည့်ရန် -promoCloseButton = - .title = အသိပေးချက်ကို ပိတ်ရန် - -## Annotations - -annotationPenButton = - .title = ဘောပင် -annotationHighlighterButton = - .title = အရေးကြီးသုံးသပ်ချက် -annotationUndoButton = - .title = မလုပ်တော့ပါ -annotationRedoButton = - .title = ပြန်လည်လုပ်ပါ -annotationTextButton = - .title = စာထည့်ရန် -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = ဖယ်ရှားပါ -annotationCropButton = - .title = ဖြတ်တောက် -annotationSaveEditButton = သိမ်းဆဲ - .title = သိမ်းဆဲ -annotationCancelEditButton = မလုပ်တော့ပါ - .title = မလုပ်တော့ပါ -annotationCropConfirmButton = သေချာပါသည် - .title = သေချာပါသည် -annotationCropCancelButton = ဖယ်ရှားပါ - .title = ဖယ်ရှားပါ -annotationColorWhite = - .title = အဖြူရောင် -annotationColorBlack = - .title = အမည်းရောင် -annotationColorRed = - .title = အနီရောင် -annotationColorGreen = - .title = အစိမ်းရောင် -annotationColorBlue = - .title = အပြာရောင် -annotationColorYellow = - .title = အဝါရောင် -annotationColorPurple = - .title = ခရမ်းရောင် -annotationColorSeaGreen = - .title = စိမ်းပြာ -annotationColorGrey = - .title = မီးခိုးရောင် -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = စာလုံးအရွယ်အစား -# Values shown in text size selection dropdown -textSizeSmall = အသေး -textSizeMedium = အလတ် -textSizeLarge = အကြီး -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = အတည်ပြုရန် - .title = အတည်ပြုရန် -textToolCancelButton = မလုပ်ဆောင်တော့ပါ - .title = မလုပ်ဆောင်တော့ပါ -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = မင်္ဂလာပါ - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = တစ်ခုခု မှားသွားသည် -copyImageErrorMessage = သင့်ဖမ်းယူချက်ကို ကလစ်ဘုတ်ပေါ်သို့ မကူးယူနိုင်ပါ။ - -## Settings Page - -settingsDisconnectButton = မချိတ်ဆက်ပါ - .title = မချိတ်ဆက်ပါ -settingsGuestAccountMessage = ဧည့်သည် အကောင့် -settingsSignInButton = ဝင်ပါ - .title = ဝင်ပါ -SettingsPageHeader = Firefox မှ ပုံဖမ်းရိုက်ချက် အပြင်အဆင်များ -settingsFirefoxAccountSubHeader = Firefox အကောင့် -settingsClosePreferences = - .title = စိတ်ကြိုက်ပြင်ဆင်မှုများ ပိတ်ပါ -settingsFxaDisconnectAlertMessage = သင့် Firefox အကောင့်ကို သင့်ကိရိယာမှ ချိတ်ဆက်မှုရပ်တန့်ခြင်းလုပ်ချင်ပါသလား? -settingsFxaDisconnectDescription = သင့်အကောင့်ထွက်ခဲ့လှျင် ရိုက်ချက်အသုံးပြုခြင်းလုပ်ဆောင်ရန် နောက်တစ်ကြိမ်ပြန်လည်ဝင်ရောက်ရလိမ့်မည် -settingsFxaConnectDescription = သင့်မျက်နှာပြင်ဖမ်းယူချက်များကို ကိရိယာအားလုံးတွင် အသုံးပြုရန် ဝင်ရောက်နိုင်သည်။ - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = ရိုက်ချက်ဖျက်ခြင်း အမှားများ :{ $status }{ $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = ကိုယ်ပိုင်ရိုက်ချက်: { $searchTerm } ရှာဖွေခြင်း -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = စာမျက်နှာ မှားယွင်းမှု: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = ကိုယ်ပိုင်ရိုက်ချက်များ ရှာဖွေပါ -shotIndexPageNoShotsMessage = သိမ်းဆဲထားသောရိုက်ချက်များမရှိပါ -shotIndexPageNoShotsInvitation = ဆက်လက်သွားပြီး ဖန်တီးပါ -shotIndexPageLookingForShots = သင့်ရိုက်ချက်များ ကြည့်ရှုခြင်း -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = သင့်ရှာဖွေမှုနှင့်ကိုက်ညီသော ရိုက်ချက်များ မတွေ့ပါ -shotIndexPageMyShotsButton = - .title = ရိုက်ကူးထားသော ပုံများ -shotIndexPageClearSearchButton = - .title = ရှာဖွေ ဖယ်ရှားပါ -shotIndexPageConfirmShotDelete = ဒီရိုက်ချက် ဖျက်မလား -shotIndexPagePreviousPage = - .title = ပြီးခဲ့သောစာမျက်နှာ -shotIndexPageNextPage = - .title = ရှေ့လာမည့်စာမျက်နှာ -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = ယခုဖမ်းယူချက်သည် အကြိုက်ဆုံးရိုက်ကူးချက် မဟုတ်ပါ။ ထို့ပြင် ၎င်းပုံ၏ သိမ်းဆည်းမှုသက်တမ်း ကုန်ဆုံးပါမည်။ -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = ယခုပုံသည် ရိုက်ကူးသူအကြိုက် ပုံဖြစ်ပြီး သက်တမ်း မကုန်ဆုံးပါ။ -shotIndexSyncedShot = - .title = ဖမ်းယူချက်ကို အခြားကိရိယာတွင် ရိုက်ကူးထားသည်။ -shotIndexAlertErrorFavoriteShot = အကြိုက်ဆုံးရိုက်ကူးချက်များ၏ အခြေအနေကို မှတ်တမ်းတင်ရာတွင် အမှား ဖြစ်ပေါ်ခဲ့သည် - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = ဒီရိုက်ချက် ဖျက်မလား -shotDeleteCancel = မလုပ်ဆောင်ပါ - .title = မလုပ်ဆောင်ပါ -shotDeleteConfirm = ဖျက်သိမ်းပါ - .title = ဖျက်သိမ်းပါ - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = ထုတ်ယူရန် ဖိုင် > စာမျက်နှာကို သိမ်းမည်... ကို အသုံးပြုပါ၊ သင့် ဖမ်းယူချက်များကို { $folder } ဖိုင်တွဲအတွင်းတွင် တွေ့နိုင်ပါသည်။ - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefoxမှ ပုံဖမ်းရိုက်ခြင်းတိုင်းတာချက် -metricsPageTotalsQueryTitle = စုစုပေါင်း -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = ရိုက်ချက်များ ခြုံငုံကြည့်ခြင်း -metricsPageTotalsQueryDevices = စက်ကိရိယာအားလုံးကို စာရင်းမှတ်ခဲ့သည် -metricsPageTotalsQueryActiveShots = လုပ်ဆောင်နေသော ရိုက်ချက်များ -metricsPageTotalsQueryExpiredShots = သက်တမ်းကုန်ဆုံးခြင်း(ပြန်လည်ရယူခြင်း) -metricsPageTotalsQueryExpiredDeletedShots = သက်တမ်းကုန်ဆုံးခြင်း(ဖျက်ခြင်း) -metricsPageShotsQueryTitle = နေ့အလိုက် ရိုက်ချက်များ -metricsPageShotsQueryDescription = တစ်နေ့ချင်းစီအလိုက် ဖန်တီးထားသောရိုက်ချက်များ(ရက်၃၀ အတွက်သာ) -metricsPageShotsQueryCount = ရိုက်ချက်များအရေအတွက် -metricsPageShotsQueryDay = နေ့ -metricsPageUsersQueryTitle = နေ့အလိုက် အသုံးပြုသူများ -metricsPageUsersQueryDescription = အနည်းဆုံးပုံတစ်ပုံ ရိုက်ခဲ့သူ အသုံးပြုသူ အရေအတွက်၊ ရက်အားဖြင့် (ရက် ၃၀ အတွင်း) -metricsPageUsersQueryCount = သုံးစွဲသူအရေအတွက် -metricsPageUsersQueryDay = နေ့ -metricsPageUserShotsQueryTitle = သုံးစွဲသူတစ်ဦးတွင် ရိုက်ချက်အရေအတွက် -metricsPageUserShotsQueryDescription = အားလုံးပေါင်းရိုက်ချက်များတွင်ရှိသော သုံးစွဲသူအရေအတွက် -metricsPageUserShotsQueryCount = သုံးစွဲသူအရေအတွက် -metricsPageUserShotsQueryShots = သက်တမ်းမကုန်ဆုံးသေးသော ရိုက်ချက်များ အနီးစပ်ဆုံးအရေအတွက် -metricsPageRetentionQueryTitle = သိုလှောင်မှုမူဝါဒ (ရက်သတ္တပတ်အားဖြင့်) -metricsPageRetentionQueryDescription = အသုံးပြုသူ၏ ပထမဆုံးဖမ်းယူသောပုံမှ နောက်ဆုံးဖမ်းယူသောပုံအထိ ရက်အရေအတွက်၊ ရက်သတ္တပတ်အစနှင့် အစုဖွဲ့ထားသည် -metricsPageRetentionQueryUsers = သုံးစွဲသူအရေအတွက် -metricsPageRetentionQueryDays = သုံးစွဲသူ စတင်ရိုက်သော နေ့မှ နောက်ဆုံးရိုက်ခဲ့သောနေ့ -metricsPageRetentionQueryFirstWeek = သုံးစွဲသူစတင်ရိုက်ချက်ဖန်တီးခဲ့သည့် ရက်သတ္တပတ် -metricsPageTotalRetentionQueryTitle = စုစုပေါင်း ရယူမှုများ -metricsPageTotalRetentionQueryDescription = သုံးစွဲသူများ စတင်ရိုက်ချက်ဖန်တီးမှု ပြုလုပ်သည့်အချိန် (ရက်သတ္တပတ်ဖြင့်) -metricsPageTotalRetentionQueryUsers = အသုံးပြုသူများ အရေအတွက် -metricsPageTotalRetentionQueryDays = သုံးစွဲသူ ပုံဖမ်းရိုက်ချက်များ ပြုလုပ်သည့်နေ့များ -metricsPageVersionQueryTitle = အက်ပ်အွန် ပုံစံ -metricsPageVersionQueryDescription = နောက်ဆုံး ၁၄ ရက် ဝင်ရောက်မှုကာလအတွင်း အက်ပ်အွန်ပုံစံ သုံးခဲ့သည် -metricsPageVersionQueryUsers = ဝင်ရောက်သုံးစွဲသူ အရေအတွက် -metricsPageVersionQueryVersion = အက်ပ်အွန် ပုံစံ -metricsPageVersionQueryLastSeen = နေ့ -metricsPageHeader = အတိုင်းအတာ -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = စီမံချက်အတိအကျ: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = ဒေတာသိမ်းဆဲချိန် { $time } မီလီစက္ကန့် diff --git a/locales/nb-NO/server.ftl b/locales/nb-NO/server.ftl deleted file mode 100644 index c810d491f0..0000000000 --- a/locales/nb-NO/server.ftl +++ /dev/null @@ -1,385 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mine skjermbilder -gHomeLink = Hjem -gNoShots = - .alt = Ingen skjermbilder funnet -gScreenshotsDescription = Skjermbilder gjort enkelt. Ta, lagre og del skjermbilder uten å forlate Firefox. - -## Header - -buttonSettings = - .title = Innstillinger -buttonSignIn = - .title = Logg inn -screenshotsLogo = - .title = Startside for Screenshots -bannerSignIn = Logg på eller registrer deg for å få tilgang til bildene dine på tvers av enheter og lagre favorittene dine for alltid. -bannerUpsell = { gScreenshotsDescription } Hent Firefox nå -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Nyheter i Firefox Screenshots -onboardingPromoMessage = Logg inn på Screenshots med en Firefox-konto og gjør mer: -onboardingPromoMessageListItem1 = Få tilgang til biblioteket på alle enhetene dine -onboardingPromoMessageListItem2 = Lagre favorittbildene dine for alltid -onboardingPromoDismissButton = Lukk - .title = Lukk -onboardingPromoSigninButton = Logg inn - .title = Logg inn - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Vilkår -footerLinkPrivacy = Personvernbestemmelser -footerReportShot = Rapporter skjermbilde - .title = Rapporter dette skjermbildet for misbruk, spam eller andre problemer -footerLinkFaqs = FAQ -footerLinkDMCA = Rapporter åndsverkovertredelse -footerLinkDiscourse = Gi tilbakemelding -footerLinkRemoveAllData = Slett alle data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Lager { $title } -creatingPageTitleDefault = side -creatingPageWaitMessage = Lagrer ditt skjermbilde... - -## Home page - -homePageDescription = - .content = Intuitive skjermbilder bakt rett inn i nettleseren. Ta, lagre og del skjermbilder mens du surfer på nettet ved hjelp av Firefox. -homePageButtonMyShots = Gå til mine skjermbilder -homePageTeaser = Kommer snart… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Gratis nedlasting -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Slik fungerer Firefox Screenshots -homePageGetStartedTitle = Kom i gang -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Velg ikonet Screenshots fra sidehandlingsmenyen i adressefeltet og menyen Screenshots vil vises oppå ditt nettleservindu. -homePageCaptureRegion = Ta skjermbilde av et område -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klikk og dra for å velge området du vil ta skjermbilde av. Eller bare holde musen over og klikk — Screenshots vil velge området for deg. Liker du hva du ser? Velg Lagre for å få tilgang til skjermdumpet ditt på nettet eller pil ned-knappen for å laste den ned til datamaskinen. -homePageCapturePage = Ta skjermbilde av en side -homePageCapturePageDescription = Bruk knappene øverst til høyre for å ta skjermbilde av hele sider. Knappen «Lagre synlig område» tar skjermbilde av området du kan se uten å rulle, og «Lagre hele siden» vil ta skjermbilde av alt på siden. -homePageSaveShare = Lagre og del -homePageSignInTitle = Dine skjermbilder overalt -homePageLegalLink = Juridisk -homePagePrivacyLink = Personvern -homePageTermsLink = Vilkår -homePageCookiesLink = Infokapsler - -## Leave Screenshots page - -leavePageRemoveAllData = Fjern alle data -leavePageErrorGeneric = Det oppstod en feil -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Dette vil permanent slette alle dine data for Firefox Screenshots. -leavePageButtonProceed = Fortsett -leavePageButtonCancel = Avbryt -leavePageDeleted = Alle skjermbildene dine er slettet! - -## Not Found page - -notFoundPageTitle = Siden ikke funnet -notFoundPageIntro = Ups. -notFoundPageDescription = Fant ikke siden. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Skjermbilde: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Feil ved lagring av utløpsdato -shotPageAlertErrorDeletingShot = Feil ved sletting av skjermbilde -shotPageAlertErrorUpdatingTitle = Feil ved lagring av tittel -shotPageConfirmDelete = Er du sikker på at du vil slette dette skjermbildet permanent? -shotPageShareButton = - .title = del -shotPageCopyButton = - .title = Kopier bilde til utklippstavlen -shotPageCopyActionLabel = Kopier -shotPageCopied = Kopiert -shotPageShareFacebook = - .title = Del på Facebook -shotPageShareTwitter = - .title = Del på Twitter -shotPageSharePinterest = - .title = Del på Pinterest -shotPageShareEmail = - .title = Del lenke via e-post -shotPageShareLink = Få en delbar lenke til dette skjermbildet: -shotPagePrivacyMessage = Alle som har denne lenken kan se dette skjermbildet. -shotPageCopyImageText = - .label = Kopier bildetekst -shotPageConfirmDeletion = Er du sikker på at du vil slette dette skjermbildet permanent? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Hvis du ikke gjør noe, vil dette bildet bli slettet permanent . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = gjenopprett til -shotPageExpiredMessage = Dette skjermbildet har utløpt. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Her er siden den ble opprinnelig generert fra: -shotPageDeleteButton = - .title = Slett dette skjermbildet -shotPageDownloadShot = - .title = Last ned -shotPageEditButton = - .title = Rediger dette bildet -shotPagefavoriteButton = - .title = Marker dette skjermbildet som favoritt -shotPageBackToHomeButton = - .title = Startside -shotPageAllShotsButton = - .title = Alle skjermbilder -shotPageScreenshotsDescription = Skjermbilder gjort enkelt. Ta, lagre og del skjermbilder uten å forlate Firefox. -shotPageDMCAMessage = Dette bildet er ikke lenger tilgjengelig på grunn av en tredjeparts immaterielle krav. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Send en e-post til { $dmca } for å be om ytterligere informasjon. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Hvis bildene dine er gjenstand for flere krav, kan vi trekke tilbake din tilgang til Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Ta med nettadressen til dette bildet i e-posten din: { $url } -shotPageKeepFor = Hvor lenge skal dette skjermbildet beholdes? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Velg tid -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Uendelig ∞ -shotPageKeepTenMinutes = 10 minutter -shotPageKeepOneHour = 1 time -shotPageKeepOneDay = 1 dag -shotPageKeepOneWeek = 1 uke -shotPageKeepTwoWeeks = 2 uker -shotPageKeepOneMonth = 1 måned -shotPageSaveExpiration = lagre -shotPageCancelExpiration = avbryt -shotPageDoesNotExpire = utløper ikke -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = utløper -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = utløpt -timeDiffJustNow = akkurat nå -timeDiffMinutesAgo = - { $number -> - [one] 1 minutt siden - *[other] { $number } minutter siden - } -timeDiffHoursAgo = - { $number -> - [one] 1 time siden - *[other] { $number } timer siden - } -timeDiffDaysAgo = - { $number -> - [one] i går - *[other] { $number } dager siden - } -timeDiffFutureSeconds = om noen få sekunder -timeDiffFutureMinutes = - { $number -> - [one] om 1 minutt - *[other] om { $number } minutter - } -timeDiffFutureHours = - { $number -> - [one] om 1 time - *[other] om { $number } timer - } -timeDiffFutureDays = - { $number -> - [one] i morgen - *[other] om { $number } dager - } -errorThirdPartyCookiesEnabled = Hvis du tok dette skjermbildet og ikke kan slette det, må du kanskje midlertidig aktivere tredjeparts infokapsler fra nettleserens innstillinger. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Noter! -promoMessage = Oppdaterte redigeringsverktøy lar deg beskjære, markere og til og med legge til tekst i bildet ditt. -promoLink = Prøv dem -promoCloseButton = - .title = Lukk varselet - -## Annotations - -annotationPenButton = - .title = Penn -annotationHighlighterButton = - .title = Merkepenn -annotationUndoButton = - .title = Angre -annotationRedoButton = - .title = Gjør om -annotationTextButton = - .title = Legg til tekst -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Tøm -annotationCropButton = - .title = Beskjær -annotationSaveEditButton = Lagre - .title = Lagre redigering -annotationCancelEditButton = Avbryt - .title = Avbryt redigering -annotationCropConfirmButton = Bekreft - .title = Bekreft valg -annotationCropCancelButton = Avbryt - .title = Avbryt valg -annotationColorWhite = - .title = Hvit -annotationColorBlack = - .title = Svart -annotationColorRed = - .title = Rød -annotationColorGreen = - .title = Grønn -annotationColorBlue = - .title = Blå -annotationColorYellow = - .title = Gul -annotationColorPurple = - .title = Lilla -annotationColorSeaGreen = - .title = Havgrønn -annotationColorGrey = - .title = Grå -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tekststørrelse -# Values shown in text size selection dropdown -textSizeSmall = Liten -textSizeMedium = Mellomstor -textSizeLarge = Stor -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Bekreft - .title = Bekreft -textToolCancelButton = Avbryt - .title = Avbryt -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hallo - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Noe gikk galt -copyImageErrorMessage = Kan ikke kopiere skjermbildet ditt til utklippstavlen. - -## Settings Page - -settingsDisconnectButton = Koble fra - .title = Koble fra -settingsGuestAccountMessage = Gjestekonto -settingsSignInButton = Logg inn - .title = Logg inn -SettingsPageHeader = Innstillinger for Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox-konto -settingsClosePreferences = - .title = Lukk innstillinger -settingsFxaDisconnectAlertMessage = Er du sikker på at du vil koble denne enheten fra din Firefox-konto? -settingsFxaDisconnectDescription = Hvis du logger ut, må du logge inn igjen for å få tilgang til skjermbildene dine. -settingsFxaConnectDescription = Du kan logge inn for å få tilgang til skjermbilder mellom av enheter. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Feil ved sletting av bilde: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mine skjermbilder: søk etter { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Feil ved opptegning av siden: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Søk mine skjermbilder -shotIndexPageNoShotsMessage = Ingen lagrede bilder. -shotIndexPageNoShotsInvitation = Kom igjen, lag noen. -shotIndexPageLookingForShots = Leter etter bildene dine… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Vi kan ikke finne noen bilder som passer med søket ditt. -shotIndexPageMyShotsButton = - .title = Mine skjermbilder -shotIndexPageClearSearchButton = - .title = Tøm søk -shotIndexPageConfirmShotDelete = Slett dette skjermbildet -shotIndexPagePreviousPage = - .title = Forrige side -shotIndexPageNextPage = - .title = Neste side -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Dette er ikke et favorittskjermbilde, og det vil utløpe -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Dette er et favorittskjermbilde, og det vil ikke utløpe -shotIndexSyncedShot = - .title = Skjermbilde tatt på en annen enhet -shotIndexAlertErrorFavoriteShot = Feil ved oppdatering av favorittskjermbildestatus - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Er du sikker på at du vil slette dette skjermbildet? -shotDeleteCancel = Avbryt - .title = Avbryt -shotDeleteConfirm = Slett - .title = Slett - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots Metrics -metricsPageTotalsQueryTitle = Totals -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = An overview of Screenshots -metricsPageTotalsQueryDevices = Total devices registered -metricsPageTotalsQueryActiveShots = Active shots -metricsPageTotalsQueryExpiredShots = Expired (but recoverable) -metricsPageTotalsQueryExpiredDeletedShots = Expired (and deleted) -metricsPageShotsQueryTitle = Shots by Day -metricsPageShotsQueryDescription = Number of shots created each day (for the last 30 days) -metricsPageShotsQueryCount = Number of shots -metricsPageShotsQueryDay = Day -metricsPageUsersQueryTitle = Users by Day -metricsPageUsersQueryDescription = Number of users who created at least one shot, by day (last 30 days) -metricsPageUsersQueryCount = Number of users -metricsPageUsersQueryDay = Day -metricsPageUserShotsQueryTitle = Number of Shots per User -metricsPageUserShotsQueryDescription = The number of users who have about N total shots -metricsPageUserShotsQueryCount = Number of users -metricsPageUserShotsQueryShots = Approximate number of active (unexpired) shots -metricsPageRetentionQueryTitle = Retention by Week -metricsPageRetentionQueryDescription = Number of days from a userʼs first shot to most recent shot, grouped by starting week -metricsPageRetentionQueryUsers = Number of users -metricsPageRetentionQueryDays = Days from the userʼs first to most recent shot -metricsPageRetentionQueryFirstWeek = Week the user first created a shot -metricsPageTotalRetentionQueryTitle = Total Retention -metricsPageTotalRetentionQueryDescription = Length of time users have been creating shots, grouped by week -metricsPageTotalRetentionQueryUsers = Number of users -metricsPageTotalRetentionQueryDays = Days the user has been creating shots -metricsPageVersionQueryTitle = Add-on Version -metricsPageVersionQueryDescription = The version of the add-on used during login, in the last 14 days -metricsPageVersionQueryUsers = Number of users logging in -metricsPageVersionQueryVersion = Add-on version -metricsPageVersionQueryLastSeen = Day -metricsPageHeader = Metrics -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generated at: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (database time: { $time }ms) diff --git a/locales/ne-NP/server.ftl b/locales/ne-NP/server.ftl deleted file mode 100644 index 9aa0317c7b..0000000000 --- a/locales/ne-NP/server.ftl +++ /dev/null @@ -1,80 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = मेरा सटहरू -gHomeLink = गृह - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = सर्तहरू -footerLinkPrivacy = गोपनीयता सूचना - -## Creating page - -creatingPageTitleDefault = पृष्ठ - -## Home page - -homePageTeaser = छिट्टै अाउँदै -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = स्वतन्त्र डाउनलोड -homePageLegalLink = कानुनी -homePagePrivacyLink = गोपनीयता - -## Leave Screenshots page - -leavePageButtonProceed = अघि बढ्नुहोस् -leavePageButtonCancel = रद्द गर्नुहोस् - -## Not Found page - -notFoundPageTitle = पृष्ठ फेला परेन -notFoundPageIntro = ओहो। -notFoundPageDescription = पृष्ठ फेला परेन । - -## Shot page - -shotPageShareButton = - .title = साझेदारी गर्नुहोस् -shotPageCopy = प्रतिलिपि गर्नुहोस् -shotPageCopied = प्रतिलिपि गरियो -shotPageShareFacebook = - .title = Facebook मा साझेदारी गर्नुहोस् -shotPageShareTwitter = - .title = Twitter मा साझेदारी गर्नुहोस् -shotPageSharePinterest = - .title = Pinterest मा साझेदारी गर्नुहोस् -shotPageShareEmail = - .title = इमेलबाट लिङ्क साझेदारी गर्नुहोस् -shotPageKeepOneHour = १ घन्टा -shotPageKeepOneDay = १ दिन -shotPageKeepOneWeek = १ हप्ता -shotPageKeepTwoWeeks = २ हप्ता -shotPageKeepOneMonth = १ महिना -shotPageSaveExpiration = सङ्ग्रह गर्नुहोस् -shotPageCancelExpiration = रद्द गर्नुहोस् -shotPageDoesNotExpire = कहिले पनि समाप्त नहुने - -## Annotations - -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = खाली गर्नुहोस् - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/nl/server.ftl b/locales/nl/server.ftl deleted file mode 100644 index 439abc9f63..0000000000 --- a/locales/nl/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mijn afbeeldingen -gHomeLink = Startpagina -gNoShots = - .alt = Geen afbeeldingen gevonden -gScreenshotsDescriptionServerless = Schermafbeeldingen op een simpele manier. Leg schermafbeeldingen vast en download ze zonder Firefox te verlaten. - -## Header - -buttonSettings = - .title = Instellingen -buttonSignIn = - .title = Aanmelden -screenshotsLogo = - .title = Startpagina van Screenshots -bannerSignIn = Meld u aan of registreer om uw afbeeldingen op meerdere apparaten te benaderen en uw favorieten voor altijd op te slaan. -bannerUpsell = { gScreenshotsDescription } Firefox nu downloaden -shutdownWarning = De opgeslagen schermafbeeldingen verlopen binnenkort. Vanaf juni biedt Screenshots geen online opslag meer aan. Wilt u afbeeldingen uit uw bibliotheek bewaren? Download ze dan naar uw computer. -shutdownPageTitle = Screenshots gaat veranderen -shutdownPageDescription = Vanaf juni biedt Screenshots geen offlineopslag meer. Wilt u afbeeldingen uit uw bibliotheek behouden? Download ze apart of gebundeld. Bedankt voor het gebruik van deze functie, en excuses voor het eventuele ongemak. -shutdownPageContinue = We hopen dat u Screenshots blijft gebruiken voor het vastleggen, kopiëren en downloaden van afbeeldingen. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Wat is er nieuw bij Firefox Screenshots? -onboardingPromoMessage = U kunt zich nu aanmelden bij Screenshots met een Firefox-account en meer doen: -onboardingPromoMessageListItem1 = Uw bibliotheek benaderen op al uw apparaten -onboardingPromoMessageListItem2 = Uw favoriete afbeeldingen voor altijd bewaren -onboardingPromoDismissButton = Sluiten - .title = Sluiten -onboardingPromoSigninButton = Aanmelden - .title = Aanmelden - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Voorwaarden -footerLinkPrivacy = Privacyverklaring -footerReportShot = Afbeelding rapporteren - .title = Deze afbeelding rapporteren wegens misbruik, spam of andere problemen -footerLinkFaqs = FAQ’s -footerLinkDMCA = IE-inbreuk melden -footerLinkDiscourse = Feedback geven -footerLinkRemoveAllData = Alle gegevens verwijderen - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } wordt gemaakt -creatingPageTitleDefault = pagina -creatingPageWaitMessage = Uw afbeelding opslaan… - -## Home page - -homePageDescription = - .content = Intuïtieve schermafbeeldingen, rechtstreeks in de browser. Terwijl u met Firefox op het web surft, kunt u schermafbeeldingen maken, opslaan en delen. -homePageButtonMyShots = Naar mijn afbeeldingen -homePageTeaser = Binnenkort beschikbaar... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Gratis downloaden -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Hoe Firefox Screenshots werkt -homePageGetStartedTitle = Aan de slag -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Selecteer het Screenshots-pictogram vanuit het menu Pagina-acties in de adresbalk, en het Screenshots-menu verschijnt boven in uw browservenster. -homePageCaptureRegion = Een gebied vastleggen -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klik en sleep om het gebied dat u wilt vastleggen te verslepen. Of wijs aan en klik – Screenshots selecteert het gebied voor u. Tevreden met wat u ziet? Selecteer Opslaan om uw schermafbeelding online te benaderen, of het pijltje naar beneden om deze naar uw computer op te slaan. -homePageCapturePage = Een pagina vastleggen -homePageCapturePageDescription = Gebruik de knoppen in de rechterbovenhoek om volledige pagina’s vast te leggen. De knop Zichtbaar gebied opslaan legt het gebied vast dat u zonder scrollen kunt zien, en Volledige pagina opslaan legt alles op de pagina vast. -homePageDownloadCopy = Downloaden of kopiëren -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Met Screenshots kunt u uw selectie downloaden of deze rechtstreeks naar uw klembord kopiëren. -homePageLegalLink = Juridisch -homePagePrivacyLink = Privacy -homePageTermsLink = Voorwaarden -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Alle gegevens verwijderen -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = U moet Firefox Screenshots hebben geïnstalleerd of bij uw Firefox-account zijn aangemeld om uw account te verwijderen -leavePageErrorGeneric = Er is een fout opgetreden -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Hierdoor worden al uw Firefox Screenshots-gegevens definitief verwijderd. -leavePageButtonProceed = Doorgaan -leavePageButtonCancel = Annuleren -leavePageDeleted = Al uw schermafbeeldingen zijn gewist! - -## Not Found page - -notFoundPageTitle = Pagina niet gevonden -notFoundPageIntro = Oeps. -notFoundPageDescription = Pagina niet gevonden. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Schermafbeelding: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Fout bij opslaan van vervaldatum -shotPageAlertErrorDeletingShot = Fout bij opslaan van afbeelding -shotPageAlertErrorUpdatingTitle = Fout bij opslaan van titel -shotPageConfirmDelete = Weet u zeker dat u deze afbeelding definitief wilt verwijderen? -shotPageShareButton = - .title = Delen -shotPageCopyButton = - .title = Afbeelding naar klembord kopiëren -shotPageCopyActionLabel = Kopiëren -shotPageCopied = Gekopieerd -shotPageShareFacebook = - .title = Delen op Facebook -shotPageShareTwitter = - .title = Delen op Twitter -shotPageSharePinterest = - .title = Delen op Pinterest -shotPageShareEmail = - .title = Koppeling delen via e-mail -shotPageShareLink = Een deelbare koppeling naar deze afbeelding verkrijgen: -shotPagePrivacyMessage = Iedereen met de koppeling kan deze afbeelding bekijken. -shotPageCopyImageText = - .label = Afbeeldingstekst kopiëren -shotPageConfirmDeletion = Weet u zeker dat u deze afbeelding definitief wilt verwijderen? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Als u niets doet, wordt deze afbeelding definitief verwijderd. -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = terugzetten tot { $date } -shotPageExpiredMessage = Deze afbeelding is verlopen. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Dit is de pagina van waaraf deze oorspronkelijk is gemaakt: -shotPageDeleteButton = - .title = Deze afbeelding verwijderen -shotPageDownloadShot = - .title = Downloaden -shotPageEditButton = - .title = Deze afbeelding bewerken -shotPagefavoriteButton = - .title = Deze afbeelding favoriet maken -shotPageBackToHomeButton = - .title = Startpagina -shotPageAllShotsButton = - .title = Alle afbeeldingen -shotPageScreenshotsDescriptionServerless = Schermafbeeldingen op een simpele manier. Leg schermafbeeldingen vast en download ze zonder Firefox te verlaten. -shotPageDMCAMessage = Deze afbeelding is vanwege een claim op intellectueel eigendom door een externe partij niet meer beschikbaar. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Stuur een e-mail naar { $dmca } om meer informatie op te vragen. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Als uw afbeeldingen aan meerdere claims onderhevig zijn, kunnen we uw toegang tot Firefox Screenshots intrekken. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Voeg de URL van deze afbeelding bij in uw e-mail: { $url } -shotPageKeepFor = Hoe lang moet deze afbeelding worden behouden? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Tijd selecteren -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Oneindig ∞ -shotPageKeepTenMinutes = 10 minuten -shotPageKeepOneHour = 1 uur -shotPageKeepOneDay = 1 dag -shotPageKeepOneWeek = 1 week -shotPageKeepTwoWeeks = 2 weken -shotPageKeepOneMonth = 1 maand -shotPageSaveExpiration = opslaan -shotPageCancelExpiration = annuleren -shotPageDoesNotExpire = verloopt niet -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = verloopt -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = verlopen -timeDiffJustNow = zojuist -timeDiffMinutesAgo = - { $number -> - [one] 1 minuut geleden - *[other] { $number } minuten geleden - } -timeDiffHoursAgo = - { $number -> - [one] 1 uur geleden - *[other] { $number } uur geleden - } -timeDiffDaysAgo = - { $number -> - [one] gisteren - *[other] { $number } dagen geleden - } -timeDiffFutureSeconds = over enkele seconden -timeDiffFutureMinutes = - { $number -> - [one] over 1 minuut - *[other] over { $number } minuten - } -timeDiffFutureHours = - { $number -> - [one] over 1 uur - *[other] over { $number } uur - } -timeDiffFutureDays = - { $number -> - [one] morgen - *[other] over { $number } dagen - } -errorThirdPartyCookiesEnabled = Als u deze afbeelding hebt gemaakt en niet kunt verwijderen, dient u wellicht tijdelijk cookies van derden in te schakelen vanuit de voorkeuren van uw browser. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Let op! -promoMessage = Met bijgewerkte hulpmiddelen voor bewerking kunt u een schermafbeelding bijsnijden, markeren, en er zelfs tekst aan toevoegen. -promoLink = Probeer ze eens -promoCloseButton = - .title = Melding sluiten - -## Annotations - -annotationPenButton = - .title = Pen -annotationHighlighterButton = - .title = Markeerder -annotationUndoButton = - .title = Ongedaan maken -annotationRedoButton = - .title = Opnieuw uitvoeren -annotationTextButton = - .title = Tekst toevoegen -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Wissen -annotationCropButton = - .title = Bijsnijden -annotationSaveEditButton = Opslaan - .title = Bewerking opslaan -annotationCancelEditButton = Annuleren - .title = Bewerken annuleren -annotationCropConfirmButton = Bevestigen - .title = Selectie bevestigen -annotationCropCancelButton = Annuleren - .title = Selectie annuleren -annotationColorWhite = - .title = Wit -annotationColorBlack = - .title = Zwart -annotationColorRed = - .title = Rood -annotationColorGreen = - .title = Groen -annotationColorBlue = - .title = Blauw -annotationColorYellow = - .title = Geel -annotationColorPurple = - .title = Paars -annotationColorSeaGreen = - .title = Zeegroen -annotationColorGrey = - .title = Grijs -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tekengrootte -# Values shown in text size selection dropdown -textSizeSmall = Klein -textSizeMedium = Normaal -textSizeLarge = Groot -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Bevestigen - .title = Bevestigen -textToolCancelButton = Annuleren - .title = Annuleren -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hallo - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Er is iets misgegaan -copyImageErrorMessage = Kan uw afbeelding niet naar het klembord kopiëren. - -## Settings Page - -settingsDisconnectButton = Verbinding verbreken - .title = Verbinding verbreken -settingsGuestAccountMessage = Gastaccount -settingsSignInButton = Aanmelden - .title = Aanmelden -SettingsPageHeader = Instellingen van Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox-account -settingsClosePreferences = - .title = Voorkeuren sluiten -settingsFxaDisconnectAlertMessage = Weet u zeker dat u dit apparaat van uw Firefox-account wilt loskoppelen? -settingsFxaDisconnectDescription = Als u zich afmeldt, dient u zich opnieuw aan te melden om weer toegang tot uw schermafbeeldingen te krijgen. -settingsFxaConnectDescription = U kunt zich aanmelden om uw schermafbeeldingen op meerdere apparaten te benaderen. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Fout bij verwijderen van deze afbeelding: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mijn afbeeldingen: zoeken naar { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Fout bij weergeven van pagina: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Mijn afbeeldingen doorzoeken -shotIndexPageNoShotsMessage = Geen opgeslagen afbeeldingen. -shotIndexPageNoShotsInvitation = Toe maar, maak er een paar. -shotIndexPageLookingForShots = Zoeken naar uw afbeeldingen… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = We kunnen geen afbeeldingen vinden die aan uw zoekopdracht voldoen. -shotIndexPageMyShotsButton = - .title = Mijn afbeeldingen -shotIndexPageClearSearchButton = - .title = Zoekopdracht wissen -shotIndexPageConfirmShotDelete = Deze afbeelding verwijderen? -shotIndexPagePreviousPage = - .title = Vorige pagina -shotIndexPageNextPage = - .title = Volgende pagina -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Deze afbeelding is geen favoriet en zal verlopen -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Deze afbeelding is een favoriet en verloopt niet -shotIndexSyncedShot = - .title = Op ander apparaat gemaakte afbeelding -shotIndexAlertErrorFavoriteShot = Fout bij bijwerken van favorietstatus - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Weet u zeker dat u deze afbeelding wilt verwijderen? -shotDeleteCancel = Annuleren - .title = Annuleren -shotDeleteConfirm = Verwijderen - .title = Verwijderen - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Om te exporteren: gebruik Bestand > Pagina opslaan als… en u vindt uw schermafbeeldingen in de map { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metrische gegevens van Firefox Screenshots -metricsPageTotalsQueryTitle = Totalen -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Een overzicht van Screenshots -metricsPageTotalsQueryDevices = Totaal geregistreerde apparaten -metricsPageTotalsQueryActiveShots = Actieve afbeeldingen -metricsPageTotalsQueryExpiredShots = Verlopen (maar herstelbaar) -metricsPageTotalsQueryExpiredDeletedShots = Verlopen (en verwijderd) -metricsPageShotsQueryTitle = Afbeeldingen op dag -metricsPageShotsQueryDescription = Aantal afbeeldingen dat elke dag is gemaakt (voor de afgelopen 30 dagen) -metricsPageShotsQueryCount = Aantal afbeeldingen -metricsPageShotsQueryDay = Dag -metricsPageUsersQueryTitle = Gebruikers op dag -metricsPageUsersQueryDescription = Aantal gebruikers dat minstens één afbeelding heeft gemaakt, op dag (afgelopen 30 dagen) -metricsPageUsersQueryCount = Aantal gebruikers -metricsPageUsersQueryDay = Dag -metricsPageUserShotsQueryTitle = Aantal afbeeldingen per gebruiker -metricsPageUserShotsQueryDescription = Het aantal gebruikers die ongeveer N afbeeldingen hebben -metricsPageUserShotsQueryCount = Aantal gebruikers -metricsPageUserShotsQueryShots = Geschat aantal actieve (niet-verlopen) afbeeldingen -metricsPageRetentionQueryTitle = Retentie op week -metricsPageRetentionQueryDescription = Aantal dagen vanaf eerste afbeelding van een gebruiker tot meest recente afbeelding, gegroepeerd op beginweek -metricsPageRetentionQueryUsers = Aantal gebruikers -metricsPageRetentionQueryDays = Dagen vanaf eerste afbeelding van een gebruiker tot meest recente afbeelding -metricsPageRetentionQueryFirstWeek = Week waarin de gebruiker voor het eerst een afbeelding heeft gemaakt -metricsPageTotalRetentionQueryTitle = Totale retentie -metricsPageTotalRetentionQueryDescription = Lengte van tijd dat gebruikers afbeeldingen hebben gemaakt, gegroepeerd op week -metricsPageTotalRetentionQueryUsers = Aantal gebruikers -metricsPageTotalRetentionQueryDays = Dagen dat de gebruiker afbeelding heeft gemaakt -metricsPageVersionQueryTitle = Add-onversie -metricsPageVersionQueryDescription = De versie van de tijdens aanmelding gebruikte add-on, in de afgelopen 14 dagen -metricsPageVersionQueryUsers = Aantal aangemelde gebruikers -metricsPageVersionQueryVersion = Add-onversie -metricsPageVersionQueryLastSeen = Dag -metricsPageHeader = Metrische gegevens -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Gegenereerd: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (databasetijd: { $time }ms) diff --git a/locales/nn-NO/server.ftl b/locales/nn-NO/server.ftl deleted file mode 100644 index 5e470d7b70..0000000000 --- a/locales/nn-NO/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mine skjermbilde -gHomeLink = Heim -gNoShots = - .alt = Fann ingen skjermbilde -gScreenshotsDescriptionServerless = Skjermbilde gjort enkelt. Ta og last ned skjermbilde utan å forlate Firefox. - -## Header - -buttonSettings = - .title = Innstillingar -buttonSignIn = - .title = Logg inn -screenshotsLogo = - .title = Startside for Screenshots -bannerSignIn = Logg på eller registrer deg for å få tilgang til bilda dine på tvers av einingar, og lagre favorittane dine for alltid. -bannerUpsell = { gScreenshotsDescription } Hent Firefox no -shutdownWarning = Lagra skjermbilde går ut snart.Frå og med juni tilbyr Screenshots ikkje lenger lagring på nettet. Vil du behalde bilde frå biblioteket ditt? Last dei ned til datamaskina di. -shutdownPageTitle = Screenshots vert endra -shutdownPageDescription = Frå og med juni vil Screenshots ikkje lenger tilby lagring på nettet. Vil du behalde bilde frå biblioteket ditt? Last ned bilde individuellt eller i gruppe. Takk for at du brukar denne funksjonen, og vi beklagar eventuelle ulemper. -shutdownPageContinue = Vi håper at du vil halde fram med å bruke Screenshots for å ta, kopiere og laste ned bilde. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Nyheiter i Firefox Screenshots -onboardingPromoMessage = Logg inn på Screenshots med ein Firefox-konto og gjer meir: -onboardingPromoMessageListItem1 = Få tilgang til biblioteket på alle einingane dine -onboardingPromoMessageListItem2 = Lagre favorittbilda dine for alltid -onboardingPromoDismissButton = Lat att - .title = Lat att -onboardingPromoSigninButton = Logg inn - .title = Logg inn - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Vilkår -footerLinkPrivacy = Personvernmerknad -footerReportShot = Rapporter skjermbilde - .title = Rapporter dette skjermbildet for misbruk, spam eller andre problem -footerLinkFaqs = Vanlege spørsmål (FAQ) -footerLinkDMCA = Rapporter brot på åndsverklova -footerLinkDiscourse = Gje tilbakemelding -footerLinkRemoveAllData = Slett alle data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Lagar { $title } -creatingPageTitleDefault = side -creatingPageWaitMessage = Lagrar bildet ditt… - -## Home page - -homePageDescription = - .content = Intuitive skjermbilde direkte i nettlesaren. Knips, lagre og del skjermbilde når du surfar på nettet med Firefox. -homePageButtonMyShots = Gå til skjermbilda mine -homePageTeaser = Kjem snart… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Gratis nedlasting -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Slik fungerer Firefox Screenshots -homePageGetStartedTitle = Kom i gang -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Vel ikonet «Ta eit skjermbilde» frå menyen Sidehandlingar for sida i adresselinja og skjermbilde-menyen vil visast utanpå nettlesarvindauget ditt. -homePageCaptureRegion = Knips eit områdde -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klikk og dra for å velje området du vil ta skjermbilde av. Eller berre hald musa over og klikk — Screenshots vil velje området for deg. Likar du det du ser? Vel Lagre for å få tilgang til dei knipsa bilda dine på nettet eller pil ned-knappen for å laste dei ned til datamaskina di. -homePageCapturePage = Knips ei side -homePageCapturePageDescription = Bruk knappene øvst til høgre for å ta skjermbilde av heile sider. Knappen «Lagre synleg område» tar skjermbilde av området du kan sjå utan å rulle, og «Lagre heile sida» vil ta skjermbilde av alt på sida. -homePageDownloadCopy = Last ned eller kopier -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Ta eit godt skjermbilde. Med Screenshots kan du laste ned di markering eller kopiere direkte til utklippstavla. -homePageLegalLink = Juridisk -homePagePrivacyLink = Personvern -homePageTermsLink = Vilkår -homePageCookiesLink = Infokapslar - -## Leave Screenshots page - -leavePageRemoveAllData = Fjern alle data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Du må ha Firefox Screenshots installerat eller vere innlogga på Firefox-kontoen din for å slette kontoen din -leavePageErrorGeneric = Det oppstod ein feil -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Dette vil permanent slette alle dataa dine i Firefox Screenshots. -leavePageButtonProceed = Fortset -leavePageButtonCancel = Avbryt -leavePageDeleted = Alle skjermbilda dine er sletta! - -## Not Found page - -notFoundPageTitle = Fann ikkje sida -notFoundPageIntro = Ops. -notFoundPageDescription = Fann ikkje sida. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Skjermbilde: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Feil ved lagring av utløpsdato -shotPageAlertErrorDeletingShot = Feil ved sletting av skjermbilde -shotPageAlertErrorUpdatingTitle = Feil ved lagring av tittel -shotPageConfirmDelete = Er du sikker på at du vil slette dette skjermbildet permanent? -shotPageShareButton = - .title = Del -shotPageCopyButton = - .title = Kopier bildet til utklippstavla -shotPageCopyActionLabel = Kopier -shotPageCopied = Kopiert -shotPageShareFacebook = - .title = Del på Facebook -shotPageShareTwitter = - .title = Del på Twitter -shotPageSharePinterest = - .title = Del på Pinterest -shotPageShareEmail = - .title = Del lenke via e-post -shotPageShareLink = Få ei delbar lenkje til dette skjermbildet: -shotPagePrivacyMessage = Alle som har denne lenka kan sjå dette skjermbildet. -shotPageCopyImageText = - .label = Kopier bildetekst -shotPageConfirmDeletion = Er du sikker på at du vil slette dette skjermbildet permanent? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Viss du ikkje gjer noko, vil dette bildet slettast permanent . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = bygg oppatt til og med { $date } -shotPageExpiredMessage = Dette bildet har gått ut. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Her er sida det vart generert frå: -shotPageDeleteButton = - .title = Slett dette skjermbildet -shotPageDownloadShot = - .title = Last ned -shotPageEditButton = - .title = Rediger dette bildet -shotPagefavoriteButton = - .title = Marker dette skjermbildet som favoritt -shotPageBackToHomeButton = - .title = Startside -shotPageAllShotsButton = - .title = Alle skjermbilde -shotPageScreenshotsDescriptionServerless = Skjermbilde gjort enkelt. Ta og last ned skjermbilde utan å forlate. Firefox. -shotPageDMCAMessage = Dette bildet er ikkje lenger tilgjengeleg på grunn av ein tredjepart sitt immaterielle krav. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Send ein e-post til { $dmca } for å be om ytterlegare informasjon. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Viss bilda dine er emne for fleire krav, kan vi trekkje tilbake tilgangen din til Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Ta med nettadressa til dette bildet i e-posten din: { $url } -shotPageKeepFor = Kor lenge skal dette skjermbildet behaldast? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Vel tid -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Uendeleg ∞ -shotPageKeepTenMinutes = 10 minutt -shotPageKeepOneHour = 1 time -shotPageKeepOneDay = 1 dag -shotPageKeepOneWeek = 1 veke -shotPageKeepTwoWeeks = 2 veker -shotPageKeepOneMonth = 1 månad -shotPageSaveExpiration = lagre -shotPageCancelExpiration = avbryt -shotPageDoesNotExpire = går ikkje ut -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = går ut -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = gått ut -timeDiffJustNow = akkurat no -timeDiffMinutesAgo = - { $number -> - [one] 1 minutt sidan - *[other] { $number } minutt sidan - } -timeDiffHoursAgo = - { $number -> - [one] 1 time sidan - *[other] { $number } timar sidan - } -timeDiffDaysAgo = - { $number -> - [one] i går - *[other] { $number } dagar sidan - } -timeDiffFutureSeconds = om nokre få sekund -timeDiffFutureMinutes = - { $number -> - [one] om 1 minutt - *[other] om { $number } minutt - } -timeDiffFutureHours = - { $number -> - [one] om 1 time - *[other] om { $number } timar - } -timeDiffFutureDays = - { $number -> - [one] i morgon - *[other] om { $number } dagar - } -errorThirdPartyCookiesEnabled = Viss du tok dette skjermbildet og ikkje kan slette det, må du kanskje kortvarig aktivere tredjeparts infokapslar frå innstillingane i nettlesaren. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Noter! -promoMessage = Oppdaterte redigeringsverktøy lèt deg skjere til, markere og til og med leggje til tekst i bildet ditt. -promoLink = Prøv dei -promoCloseButton = - .title = Lat att varselet - -## Annotations - -annotationPenButton = - .title = Penn -annotationHighlighterButton = - .title = Merkepenn -annotationUndoButton = - .title = Angre -annotationRedoButton = - .title = Gjer om -annotationTextButton = - .title = Legg til tekst -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Tøm -annotationCropButton = - .title = Sker til -annotationSaveEditButton = Lagre - .title = Lagre redigeringa -annotationCancelEditButton = Avbryt - .title = Avbryt redigering -annotationCropConfirmButton = Stadfest - .title = Stadfest val -annotationCropCancelButton = Avbryt - .title = Avbryt val -annotationColorWhite = - .title = Kvit -annotationColorBlack = - .title = Svart -annotationColorRed = - .title = Raud -annotationColorGreen = - .title = Grøn -annotationColorBlue = - .title = Blå -annotationColorYellow = - .title = Gul -annotationColorPurple = - .title = Lilla -annotationColorSeaGreen = - .title = Havgrøn -annotationColorGrey = - .title = Grå -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tekststorleik -# Values shown in text size selection dropdown -textSizeSmall = Liten -textSizeMedium = Mellomstor -textSizeLarge = Stor -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Stadfest - .title = Stadfest -textToolCancelButton = Avbryt - .title = Avbryt -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hallo - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Noko gjekk gale -copyImageErrorMessage = Klarte ikkje å kopiere skjermbildet ditt til utklippstavla. - -## Settings Page - -settingsDisconnectButton = Kople frå - .title = Kople frå -settingsGuestAccountMessage = Gjestekonto -settingsSignInButton = Logg inn - .title = Logg inn -SettingsPageHeader = Innstillingar for Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox-konto -settingsClosePreferences = - .title = Lat att innstillingar -settingsFxaDisconnectAlertMessage = Er du sikker på at du vil kople frå denne eininga frå Firefox-kontoen din? -settingsFxaDisconnectDescription = Om du loggar ut, må du logge inn att for å få tilgang til skjermbilda dine. -settingsFxaConnectDescription = Du kan logge inn og få tilgang til skjermbilda dine på alle einingar. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Feil ved sletting av bilde: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Skjermbilda mine: søk etter { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Feil med rendering av sida: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Søk i bilde -shotIndexPageNoShotsMessage = Ingen lagra bilde. -shotIndexPageNoShotsInvitation = Kom igjen, lag nokre. -shotIndexPageLookingForShots = Leitar etter bilda dine… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Vi kan ikkje finne bilde som passar med søket ditt. -shotIndexPageMyShotsButton = - .title = Mine skjermbilde -shotIndexPageClearSearchButton = - .title = Tøm søk -shotIndexPageConfirmShotDelete = Slette dette bildet? -shotIndexPagePreviousPage = - .title = Føregåande side -shotIndexPageNextPage = - .title = Neste side -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Dette er ikkje eit favorittskjermbilde, og det vil gå ut -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Dette er eit favorittskjermbilde, og det vil ikkje gå ut -shotIndexSyncedShot = - .title = Skjermbilde tatt på ei anna eining -shotIndexAlertErrorFavoriteShot = Feil ved oppdatering av favorittskjermbildestatus - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Er du sikker på at du vil slette dette skjermbildet? -shotDeleteCancel = Avbryt - .title = Avbryt -shotDeleteConfirm = Slett - .title = Slett - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = For å eksportere: bruk Fil > Lagre sida som… og du vil finne skjermbilda dine i mappa { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Statistikk for Firefox-skjermbilde -metricsPageTotalsQueryTitle = Totalt -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Ei oversikt over skjermbilde -metricsPageTotalsQueryDevices = Totalt tal på registrerte einingar -metricsPageTotalsQueryActiveShots = Aktive bilde -metricsPageTotalsQueryExpiredShots = Gått ut (men kan tilbakestillast) -metricsPageTotalsQueryExpiredDeletedShots = Gått ut (og sletta) -metricsPageShotsQueryTitle = Bilde pr. dag -metricsPageShotsQueryDescription = Tal på bilde laga kvar dag (dei siste 30 dagane) -metricsPageShotsQueryCount = Tal på bilde -metricsPageShotsQueryDay = Dag -metricsPageUsersQueryTitle = Brukarar pr. dag -metricsPageUsersQueryDescription = Tal på brukarar som har laga minst eitt bilde, dagleg (dei siste 30 dagane) -metricsPageUsersQueryCount = Tal på brukarar -metricsPageUsersQueryDay = Dag -metricsPageUserShotsQueryTitle = Tal på bilde pr. brukar -metricsPageUserShotsQueryDescription = Tal på brukarar som har cirka N tal av bilde -metricsPageUserShotsQueryCount = Tal på brukarar -metricsPageUserShotsQueryShots = Cirka-tal på aktive (ikkje utgåtte) bilde -metricsPageRetentionQueryTitle = Tilbakekalla etter veke -metricsPageRetentionQueryDescription = Tal på dagar frå ein brukar sitt første bilde til siste bilde, gruppert etter startveke -metricsPageRetentionQueryUsers = Tal på brukarar -metricsPageRetentionQueryDays = Dagar frå brukaren sitt første bilde til siste bilde -metricsPageRetentionQueryFirstWeek = Veka då brukaren laga det første bildet -metricsPageTotalRetentionQueryTitle = Totalt tilbakekalla -metricsPageTotalRetentionQueryDescription = Kor lenge brukaren har laga bilde, gruppert etter veke -metricsPageTotalRetentionQueryUsers = Tal på brukarar -metricsPageTotalRetentionQueryDays = Dagar brukaren har laga bilde -metricsPageVersionQueryTitle = Utvidingsversjon -metricsPageVersionQueryDescription = Versjonen av utvidinga som vart brukt under innlogginga, dei siste 14 dagane -metricsPageVersionQueryUsers = Tal på brukarar som loggar inn -metricsPageVersionQueryVersion = Utvidingsversjon -metricsPageVersionQueryLastSeen = Dag -metricsPageHeader = Statistikk -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generert: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (databasetid: { $time } ms) diff --git a/locales/or/server.ftl b/locales/or/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/or/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/pa-IN/server.ftl b/locales/pa-IN/server.ftl deleted file mode 100644 index 883c3238c6..0000000000 --- a/locales/pa-IN/server.ftl +++ /dev/null @@ -1,303 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = ਮੇਰੇ ਸ਼ਾਟ -gHomeLink = ਘਰ -gNoShots = - .alt = ਕੋਈ ਸ਼ਾਟ ਨਹੀਂ ਲੱਭਿਆ - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = ਮੌਜ਼ੀਲਾ -footerLinkTerms = ਸ਼ਰਤਾਂ -footerLinkPrivacy = ਪਰਦੇਦਾਰੀ ਨੋਟਿਸ -footerLinkFaqs = ਸਵਾਲ-ਜਵਾਬ -footerLinkDMCA = IP ਉਲੰਘਣ ਦੀ ਰਿਪੋਰਟ ਕਰੋ -footerLinkDiscourse = ਸੁਝਾਅ ਦਿਓ -footerLinkRemoveAllData = ਸਾਰਾ ਡਾਟਾ ਹਟਾਓ - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ -creatingPageTitleDefault = ਸਫ਼ਾ -creatingPageWaitMessage = ਤੁਹਾਡੇ ਸ਼ਾਟ ਨੂੰ ਸੰਭਾਲਿਆ ਜਾ ਰਿਹਾ ਹੈ ... - -## Home page - -homePageButtonMyShots = ਮੇਰੇ ਸ਼ੌਟਸ ਤੇ ਜਾਓ -homePageTeaser = ਜਲਦੀ ਆ ਰਿਹਾ.... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = ਮੁਫ਼ਤ ਡਾਊਨਲੋਡ ਕਰੋ -homePageGetStarted = ਸ਼ੁਰੂ ਕਰੋ -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox ਸਕਰੀਨਸ਼ਾਟ ਵਰਕਸ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ -homePageGetStartedTitle = ਸ਼ੁਰੂਆਤ ਕਰੋ -homePageCaptureRegion = ਕਿਸੇ ਖੇਤਰ ਨੂੰ ਕੈਪਚਰ ਕਰੋ -homePageCapturePage = ਕੋਈ ਕੈਪਚਰ ਕਰੋ -homePageSaveShare = ਸੰਭਾਲੋ ਅਤੇ ਸਾਂਝਾ ਕਰੋ -homePageLegalLink = ਕਨੂੰਨੀ -homePagePrivacyLink = ਪਰਦੇਦਾਰੀ -homePageTermsLink = ਸ਼ਰਤਾਂ -homePageCookiesLink = ਕੂਕੀਜ਼ - -## Leave Screenshots page - -leavePageRemoveAllData = ਸਾਰਾ ਡਾਟਾ ਹਟਾਓ -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAddonRequired = ਤੁਹਾਡੇ ਖਾਤੇ ਨੂੰ ਮਿਟਾਉਣ ਲਈ ਤੁਹਾਡੇ ਕੋਲ Firefox ਸਕਰੀਨਸ਼ਾਟ ਸਥਾਪਤ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ -leavePageErrorGeneric = ਇੱਕ ਗਲਤੀ ਆਈ ਹੈ -leavePageButtonProceed = ਅੱਤੇ ਵੱਧਣਾ -leavePageButtonCancel = ਰੱਦ ਕਰੋ -leavePageDeleted = ਤੁਹਾਡੇ ਸਾਰੇ ਸਕ੍ਰੀਨਸ਼ੋਟਸ ਮਿਟ ਗਏ ਹਨ! - -## Not Found page - -notFoundPageTitle = ਸਫਾ ਨਹੀਂ ਲੱਭਿਆ -notFoundPageIntro = Oops. -notFoundPageDescription = ਸਫਾ ਨਹੀਂ ਲੱਭਿਆ। - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = ਸਕਰੀਨਸ਼ਾੱਟ: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = ਸਮਾਪਤੀ ਦੀ ਸੰਭਾਲ ਕਰਨ ਵਿੱਚ ਗਲਤੀ -shotPageAlertErrorDeletingShot = ਸ਼ਾੱਟ ਨੂੰ ਮਿਟਾਉਣ ਵਿੱਚ ਗਲਤੀ -shotPageAlertErrorUpdatingTitle = ਸਿਰਲੇਖ ਸੰਭਾਲ ਵਿੱਚ ਗਲਤੀ -shotPageConfirmDelete = ਕੀ ਤੁਸੀਂ ਯਕੀਨਨ ਹੀ ਇਸ ਸ਼ਾੱਟ ਨੂੰ ਹਮੇਸ਼ਾ ਲਈ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋਂ? -shotPageShareButton = - .title = ਸਾਂਝਾ ਕਰੋ -shotPageCopy = ਕਾਪੀ ਕਰੋ -shotPageCopied = ਕਾਪੀ ਕੀਤਾ -shotPageShareFacebook = - .title = ਫੇਸਬੁੱਕ ਉੱਤੇ ਸਾਂਝਾ ਕਰੋ -shotPageShareTwitter = - .title = ਟਵਿਟਰ ਉੱਤੇ ਸਾਂਝਾ ਕਰੋ -shotPageSharePinterest = - .title = Pinterest ਉੱਤੇ ਸਾਂਝਾ ਕਰੋ -shotPageShareEmail = - .title = ਈਮੇਲ ਦੁਆਰਾ ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ -shotPageShareLink = ਇਸ ਸ਼ਾੱਟ ਲਈ ਸਾਂਝਾ ਕਰਨ ਯੋਗ ਲਿੰਕ ਪ੍ਰਾਪਤ ਕਰੋ: -shotPagePrivacyMessage = ਲਿੰਕ ਵਾਲਾ ਕੋਈ ਵੀ ਵਿਅਕਤੀ ਇਸ ਸ਼ਾਟ ਨੂੰ ਦੇਖ ਸਕਦਾ ਹੈ। -shotPageCopyImageText = - .label = ਚਿੱਤਰ ਟੈਕਸਟ ਕਾਪੀ ਕਰੋ -shotPageConfirmDeletion = ਕੀ ਤੁਸੀਂ ਯਕੀਨਨ ਹੀ ਇਸ ਸ਼ਾੱਟ ਨੂੰ ਹਮੇਸ਼ਾ ਲਈ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋਂ? -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date } ਤੱਕ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰੋ -shotPageExpiredMessage = ਇਹ ਸ਼ਾੱਟ ਖਤਮ ਹੋ ਗਿਆ ਹੈ। -shotPageDeleteButton = - .title = ਇਹ ਸ਼ਾੱਟ ਮਿਟਾਓ -shotPageAbuseButton = - .title = ਇਸ ਸ਼ਾਟ ਨੂੰ ਦੁਰਵਿਹਾਰ, ਸਪੈਮ ਜਾਂ ਹੋਰ ਸਮੱਸਿਆਵਾਂ ਲਈ ਰਿਪੋਰਟ ਕਰੋ -shotPageDownloadShot = - .title = ਡਾਊਨਲੋਡ ਕਰੋ -shotPageEditButton = - .title = ਇਹ ਚਿੱਤਰ ਨੂੰ ਸੋਧੋ -shotPageDownload = ਡਾਊਨਲੋਡ ਕਰੋ -shotPageUpsellFirefox = Firefox ਹੁਣੇ ਪ੍ਰਾਪਤ ਕਰੋ -shotPageKeepFor = ਕਿੰਨੀ ਦੇਰ ਤੱਕ ਇਸ ਸ਼ਾਟ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = ਸਮਾਂ ਚੁਣੋ -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = ਅਨਿਸ਼ਚਿਤ ਤੌਰ ਤੇ ∞ -shotPageKeepTenMinutes = 10 ਮਿੰਟ -shotPageKeepOneHour = 1 ਘੰਟਾ -shotPageKeepOneDay = 1 ਦਿਨ -shotPageKeepOneWeek = 1 ਹਫਤਾ -shotPageKeepTwoWeeks = 2 ਹਫਤੇ -shotPageKeepOneMonth = 1 ਮਹੀਨਾ -shotPageSaveExpiration = ਸੰਭਾਲੋ -shotPageCancelExpiration = ਰੱਦ ਕਰੋ -shotPageDoesNotExpire = ਮਿਆਦ ਖਤਮ ਨਹੀਂ ਹੁੰਦੀ -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = ਮਿਆਦ ਖਤਮ -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = ਮਿਆਦ ਖਤਮ ਹੋਈ -timeDiffJustNow = ਸਿਰਫ ਹੁਣ -timeDiffMinutesAgo = - { $number -> - [one] 1 ਮਿੰਟ ਪਹਿਲਾਂ - *[other] { $number }ਮਿੰਟ ਪਹਿਲਾਂ - } -timeDiffHoursAgo = - { $number -> - [one] 1 ਘੰਟਾ ਪਹਿਲਾਂ - *[other] { $number }ਘੰਟੇ ਪਹਿਲਾਂ - } -timeDiffDaysAgo = - { $number -> - [one] ਕੱਲ੍ਹ - *[other] { $number }ਦਿਨ ਪਹਿਲਾਂ - } -timeDiffFutureSeconds = ਕੁੱਝ ਸਕਿੰਟਾਂ ਵਿੱਚ -timeDiffFutureMinutes = - { $number -> - [one] 1 ਮਿੰਟ ਵਿੱਚ - *[other] { $number }ਮਿੰਟਾਂ ਵਿੱਚ - } -timeDiffFutureHours = - { $number -> - [one] 1 ਘੰਟੇ ਵਿੱਚ - *[other] { $number }ਘੰਟਿਆਂ ਵਿੱਚ - } -timeDiffFutureDays = - { $number -> - [one] ਕੱਲ੍ਹ - *[other] { $number }ਦਿਨਾਂ ਵਿੱਚ - } - -## Annotations - -annotationPenButton = - .title = ਪੈਨ -annotationHighlighterButton = - .title = ਹਾਇਲਾਈਟਰ -annotationUndoButton = - .title = ਪਹਿਲੇ ਵਰਗਾ ਕਰੋ -annotationRedoButton = - .title = ਦੁਬਾਰਾ ਕਰੋ -annotationTextButton = - .title = ਟੈਕਸਟ ਜੋੜੋ -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = ਸਾਫ ਕਰੋ -annotationCropButton = - .title = ਕੱਟੋ -annotationSaveEditButton = ਸੰਭਾਲੋ - .title = ਸੰਪਾਦਨ ਨੂੰ ਸੰਭਾਲੋ -annotationCancelEditButton = ਰੱਦ ਕਰੋ - .title = ਸੰਪਾਦਨ ਨੂੰ ਰੱਦ ਕਰੋ -annotationCropConfirmButton = ਪੁਸ਼ਟੀ ਕਰੋ - .title = ਚੋਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ -annotationCropCancelButton = ਰੱਦ ਕਰੋ - .title = ਚੋਣ ਨੂੰ ਰੱਦ ਕਰੋ -annotationColorWhite = - .title = ਚਿੱਟਾ -annotationColorBlack = - .title = ਕਾਲਾ -annotationColorRed = - .title = ਲਾਲ -annotationColorGreen = - .title = ਹਰਾ -annotationColorBlue = - .title = ਨੀਲਾ -annotationColorYellow = - .title = ਖੱਟਾ -annotationColorPurple = - .title = ਜਾਮਨੀ -annotationColorSeaGreen = - .title = ਸਮੁੰਦਰੀ ਹਰਾ -annotationColorGrey = - .title = ਸਰਮਈ -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = ਅੱਖਰ ਆਕਾਰ -# Values shown in text size selection dropdown -textSizeSmall = ਛੋਟਾ -textSizeMedium = ਵਿਚਕਾਰਲਾ -textSizeLarge = ਵੱਡਾ -# Confirm and Cancel button title shown when using text tool -annotationTextConfirmButton = - .title = ਪੁਸ਼ਟੀ ਕਰਨਾ -annotationTextCancelButton = - .title = ਰੱਦ ਕਰੋ -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = ਹੈਲੋ - -## Settings Page - -settingsDisconnectButton = ਡਿਸਕਨੈਕਟ ਕਰੋ - .title = ਡਿਸਕਨੈਕਟ ਕਰੋ -settingsGuestAccountMessage = ਮਹਿਮਾਨ ਖਾਤੇ -settingsSignInButton = ਸਾਇਨ ਇਨ - .title = ਸਾਇਨ ਇਨ -SettingsPageHeader = ਫਾਇਰਫਾਕਸ ਸਕਰੀਨਸ਼ਾੱਟ ਸੈਟਿੰਗਾਂ -settingsPageSubHeader = ਸਿੰਕ ਅਤੇ ਖਾਤੇ - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = ਸ਼ਾੱਟ ਮਿਟਾਉਣ ਵਿੱਚ ਗਲਤੀ:{ $status }{ $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = ਮੇਰੇ ਸ਼ਾੱਟ: ਖੋਜ ਲਈ { $searchTerm } -shotIndexPageSearchPlaceholder = - .placeholder = ਮੇਰੇ ਸ਼ਾੱਟ ਖੋਜੋ -shotIndexPageSearchButton = - .title = ਖੋਜਣਾ -shotIndexPageNoShotsMessage = ਸ਼ਾੱਟ ਸੰਭਾਲੇ ਨਹੀਂ। -shotIndexPageNoShotsInvitation = ਜਾਓ, ਕੁਝ ਬਣਾਉ। -shotIndexPageLookingForShots = ਆਪਣੇ ਸ਼ਾਟਾਂ ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ ... -shotIndexPageNoSearchResultsIntro = ਹਾਂ -shotIndexPageNoSearchResults = ਅਸੀਂ ਤੁਹਾਡੀ ਖੋਜ ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਕੋਈ ਵੀ ਸ਼ਾਟ ਨਹੀਂ ਲੱਭ ਸਕਦੇ। -shotIndexPageClearSearchButton = - .title = ਖੋਜ ਸਾਫ ਕਰੋ -shotIndexPageConfirmShotDelete = ਇਹ ਸ਼ਾੱਟ ਮਿਟਾਓ? -shotIndexPagePreviousPage = - .title = ਪਹਿਲਾ ਸਫਾ -shotIndexPageNextPage = - .title = ਅਗਲਾ ਸਫਾ -# This symbol is used in the lower right corner of the card for a shot on the -# My Shots page to indicate that the shot does not expire. It should be a -# single character (or simply nothing if no such symbol is available for a -# language/culture). -shotIndexNoExpirationSymbol = ∞ - .title = ਇਸ ਸ਼ਾੱਟ ਦੀ ਮਿਆਦ ਖਤਮ ਨਹੀਂ ਹੋਈ - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = ਕੀ ਤੁਸੀਂ ਯਕੀਨਨ ਹੀ ਇਹ ਸ਼ਾੱਟ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋਂ? -shotDeleteCancel = ਰੱਦ ਕਰੋ - .title = ਰੱਦ ਕਰੋ -shotDeleteConfirm = ਮਿਟਾਓ - .title = ਮਿਟਾਓ - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = ਫਾਇਰਫਾਕਸ ਸਕਰੀਨਸ਼ਾਟ ਮੈਟ੍ਰਿਕਸ -metricsPageTotalsQueryTitle = ਕੁੱਲ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = ਸਕਰੀਨਸ਼ਾੱਟਸ ਦੀ ਇੱਕ ਸੰਖੇਪ ਜਾਣਕਾਰੀ -metricsPageTotalsQueryDevices = ਕੁੱਲ ਯੰਤਰ ਰਜਿਸਟਰ ਕੀਤੇ -metricsPageTotalsQueryActiveShots = ਐਕਟਿਵ ਸ਼ਾਟ -metricsPageTotalsQueryExpiredShots = ਮਿਆਦ ਖਤਮ (ਪਰ ਮੁੜ ਪ੍ਰਾਪਤੀਯੋਗ) -metricsPageTotalsQueryExpiredDeletedShots = ਮਿਆਦ ਖਤਮ (ਅਤੇ ਮਿਟਾਓ) -metricsPageShotsQueryTitle = ਦਿਨ ਦੁਆਰਾ ਸ਼ਾੱਟ -metricsPageShotsQueryDescription = ਹਰ ਰੋਜ਼ ਬਣਾਏ ਗਏ ਸ਼ਾਟਾਂ ਦੀ ਗਿਣਤੀ (ਪਿਛਲੇ 30 ਦਿਨਾਂ ਤੋਂ) -metricsPageShotsQueryCount = ਸ਼ਾੱਟਾਂ ਦੀ ਗਿਣਤੀ -metricsPageShotsQueryDay = ਦਿਨ -metricsPageUsersQueryTitle = ਦਿਨ ਦੁਆਰਾ ਯੂਜ਼ਰ -metricsPageUsersQueryDescription = ਉਹਨਾਂ ਯੂਜ਼ਰਾਂ ਦੀ ਸੰਖਿਆ ਜੋ ਦਿਨ ਵਿੱਚ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਸ਼ਾਟ ਬਣਾਉਂਦੇ ਹਨ (ਪਿਛਲੇ 30 ਦਿਨ) -metricsPageUsersQueryCount = ਯੂਜ਼ਰਾਂ ਦੀ ਗਿਣਤੀ -metricsPageUsersQueryDay = ਦਿਨ -metricsPageUserShotsQueryTitle = ਹਰੇਕ ਯੂਜ਼ਰ ਦੇ ਸ਼ਾੱਟਾਂ ਦੀ ਗਿਣਤੀ -metricsPageUserShotsQueryDescription = ਉਹਨਾਂ ਯੂਜ਼ਰਾਂ ਦੀ ਗਿਣਤੀ ਜਿਨ੍ਹਾਂ ਕੋਲ ਐਨ ਕੁੱਲ ਸ਼ਾਟ ਹਨ -metricsPageUserShotsQueryCount = ਯੂਜ਼ਰਾਂ ਦੀ ਗਿਣਤੀ -metricsPageUserShotsQueryShots = ਐਕਟਿਵ (ਬੇਲੋੜੇ) ਸ਼ਾੱਟਾਂ ਦੀ ਲਗਭਗ ਗਿਣਤੀ -metricsPageRetentionQueryTitle = ਹਫਤੇ ਤਕ ਰੀਟੇਸ਼ਨ -metricsPageRetentionQueryUsers = ਯੂਜ਼ਰਾਂ ਦੀ ਗਿਣਤੀ -metricsPageTotalRetentionQueryTitle = ਕੁੱਲ ਰੀਟੇਸ਼ਨ -metricsPageTotalRetentionQueryUsers = ਯੂਜ਼ਰਾਂ ਦੀ ਗਿਣਤੀ -metricsPageTotalRetentionQueryDays = ਦਿਨ, ਯੂਜ਼ਰ ਸ਼ਾੱਟ ਬਣਾ ਰਹੇ ਹਨ -metricsPageVersionQueryTitle = ਐਡ-ਆਨ ਵਰਜਨ -metricsPageVersionQueryDescription = ਐਡ-ਆੱਨ ਦਾ ਵਰਜਨ ਲਾਗਇਨ ਦੌਰਾਨ ਵਰਤਿਆ, ਪਿਛਲੇ 14 ਦਿਨ ਵਿਚ -metricsPageVersionQueryUsers = ਲਾਗਇਨ ਕਰਨ ਵਾਲੇ ਯੂਜ਼ਰਾਂ ਦੀ ਗਿਣਤੀ -metricsPageVersionQueryVersion = ਐਡ-ਆੱਨ ਵਰਜਨ -metricsPageVersionQueryLastSeen = ਦਿਨ -metricsPageHeader = ਮੈਟ੍ਰਿਕਸ -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = ਪੈਦਾ ਕੀਤਾ: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (ਡਾਟਾਬੇਸ ਟਾਈਮ: { $time }ਐਮਐਸ) diff --git a/locales/pl/server.ftl b/locales/pl/server.ftl deleted file mode 100644 index 54a97f0205..0000000000 --- a/locales/pl/server.ftl +++ /dev/null @@ -1,403 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Moje zrzuty -gHomeLink = Strona główna -gNoShots = - .alt = Brak zrzutów -gScreenshotsDescriptionServerless = Proste zrzuty ekranu. Wykonuj i pobieraj zrzuty bez wychodzenia z Firefoksa. - -## Header - -buttonSettings = - .title = Ustawienia -buttonSignIn = - .title = Zaloguj się -screenshotsLogo = - .title = Strona główna Screenshots -bannerSignIn = Zaloguj się lub zarejestruj, aby mieć dostęp do swoich zrzutów na wszystkich urządzeniach i zachować ulubione na zawsze. -bannerUpsell = { gScreenshotsDescription } Pobierz Firefoksa -shutdownWarning = Zapisane zrzuty ekranu niedługo ulegną przeterminowaniu. Od czerwca serwis Screenshots nie będzie zawierał funkcji przechowywania zrzutów. Chcesz zachować zrzuty ze swojej kolekcji? Pobierz je na komputer. -shutdownPageTitle = Screenshots się zmienia -shutdownPageDescription = Od czerwca serwis Screenshots nie będzie zawierał funkcji przechowywania zrzutów. Chcesz zachować zrzuty ze swojej kolekcji? Pobierz je pojedynczo lub wszystkie razem. Dziękujemy za korzystanie z tej funkcji i przepraszamy za wszelkie niedogodności. -shutdownPageContinue = Mamy nadzieję, że serwis Screenshots nadal będzie przydatny do tworzenia, kopiowania i pobierania zrzutów. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Co nowego w Firefox Screenshots? -onboardingPromoMessage = Teraz możesz zalogować się w serwisie Screenshots za pomocą konta Firefoksa i mieć więcej możliwości: -onboardingPromoMessageListItem1 = Dostęp do swojej kolekcji na wszystkich urządzeniach -onboardingPromoMessageListItem2 = Zachowywanie ulubionych zrzutów na zawsze -onboardingPromoDismissButton = Zamknij - .title = Zamknij -onboardingPromoSigninButton = Zaloguj się - .title = Zaloguj się - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Warunki korzystania z usługi -footerLinkPrivacy = Prywatność -footerReportShot = Zgłoś zrzut - .title = Zgłoś ten zrzut z powodu naruszenia zasad, spamu lub innego problemu -footerLinkFaqs = Najczęściej zadawane pytania -footerLinkDMCA = Zgłoś naruszenie własności intelektualnej -footerLinkDiscourse = Wyślij opinię -footerLinkRemoveAllData = Usuń wszystkie dane - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Tworzenie { $title } -creatingPageTitleDefault = strony -creatingPageWaitMessage = Zapisywanie zrzutu… - -## Home page - -homePageDescription = - .content = Intuicyjne tworzenie zrzutów ekranu z poziomu przeglądarki. Wykonuj, zapisuj i udostępniaj zrzuty podczas przeglądania Internetu za pomocą Firefoksa. -homePageButtonMyShots = Przejdź do moich zrzutów -homePageTeaser = Wkrótce… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Darmowe pobieranie -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Jak działa Firefox Screenshots -homePageGetStartedTitle = Wprowadzenie -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Wybierz ikonę Screenshots z menu interakcji na pasku adresu, a menu Screenshots pojawi się na górze przeglądarki. -homePageCaptureRegion = Zrzut obszaru -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Kliknij i przeciągnij nad obszarem, który chcesz przechwycić. Możesz również kliknąć dowolny element strony — Screenshots wybierze obszar automatycznie. Może być? Kliknij Zapisz, aby zapisać zrzut w Internecie lub ikonę strzałki, aby pobrać go na komputer. -homePageCapturePage = Zrzut strony -homePageCapturePageDescription = Użyj przycisków u góry po prawej, aby tworzyć zrzuty całych stron. Przycisk „Zapisz widoczne” umożliwia tworzenie jedynie wyświetlanego obszaru, a „Zapisz całą stronę” utworzy zrzut całej zawartości strony. -homePageDownloadCopy = Pobierz lub skopiuj -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Zrób najlepsze ujęcie. Screenshots umożliwia pobranie wybranego obszaru lub skopiowanie go prosto do schowka. -homePageLegalLink = Podstawa prawna -homePagePrivacyLink = Prywatność -homePageTermsLink = Warunki korzystania z usługi -homePageCookiesLink = Ciasteczka - -## Leave Screenshots page - -leavePageRemoveAllData = Usuń wszystkie dane -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Usunięcie konta wymaga zainstalowania Firefox Screenshots lub zalogowania na koncie Firefoksa -leavePageErrorGeneric = Wystąpił błąd -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Twoje dane w Firefox Screenshots zostaną trwale usunięte. -leavePageButtonProceed = Kontynuuj -leavePageButtonCancel = Anuluj -leavePageDeleted = Wszystkie zrzuty ekranu zostały usunięte. - -## Not Found page - -notFoundPageTitle = Nie odnaleziono strony -notFoundPageIntro = Błąd -notFoundPageDescription = Nie odnaleziono strony. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Zrzut ekranu: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Błąd podczas zapisywania daty przeterminowania -shotPageAlertErrorDeletingShot = Błąd podczas usuwania zrzutu -shotPageAlertErrorUpdatingTitle = Błąd podczas zapisywania tytułu -shotPageConfirmDelete = Czy na pewno trwale usunąć ten zrzut? -shotPageShareButton = - .title = Udostępnij -shotPageCopyButton = - .title = Kopiuj obraz do schowka -shotPageCopyActionLabel = Kopiuj -shotPageCopied = Skopiowano -shotPageShareFacebook = - .title = Udostępnij na Facebooku -shotPageShareTwitter = - .title = Udostępnij na Twitterze -shotPageSharePinterest = - .title = Udostępnij na Pintereście -shotPageShareEmail = - .title = Wyślij odnośnik pocztą -shotPageShareLink = Odnośnik do udostępniania tego zrzutu: -shotPagePrivacyMessage = Wszyscy z tym odnośnikiem mogą wyświetlić ten zrzut. -shotPageCopyImageText = - .label = Kopiuj tekst obrazu -shotPageConfirmDeletion = Czy na pewno trwale usunąć ten zrzut? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ten zrzut zostanie automatycznie usunięty . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = przywróć do { $date } -shotPageExpiredMessage = Ten zrzut uległ przeterminowaniu. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Strona, z której został utworzony: -shotPageDeleteButton = - .title = Usuń ten zrzut -shotPageDownloadShot = - .title = Pobierz -shotPageEditButton = - .title = Edytuj ten obraz -shotPagefavoriteButton = - .title = Dodaj ten zrzut do ulubionych -shotPageBackToHomeButton = - .title = Strona główna -shotPageAllShotsButton = - .title = Wszystkie zrzuty -shotPageScreenshotsDescriptionServerless = Proste zrzuty ekranu. Wykonuj i pobieraj zrzuty bez wychodzenia z Firefoksa. -shotPageDMCAMessage = Ten zrzut został usunięty z powodu roszczeń prawnych strony trzeciej. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Wyślij wiadomość do { $dmca } w celu uzyskania dalszych informacji. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Jeśli Twoje zrzuty wywołają wiele roszczeń prawnych innych podmiotów, możemy zablokować Twój dostęp do Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Załącz odnośnik do tego zrzutu w wiadomości: { $url } -shotPageKeepFor = Jak długo mamy zachować ten zrzut? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Wybierz czas -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Bezterminowo ∞ -shotPageKeepTenMinutes = 10 minut -shotPageKeepOneHour = 1 godzina -shotPageKeepOneDay = 1 dzień -shotPageKeepOneWeek = 1 tydzień -shotPageKeepTwoWeeks = 2 tygodnie -shotPageKeepOneMonth = 1 miesiąc -shotPageSaveExpiration = zapisz -shotPageCancelExpiration = anuluj -shotPageDoesNotExpire = nie ulega przeterminowaniu -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = ulega przeterminowaniu -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = uległ przeterminowaniu -timeDiffJustNow = przed chwilą -timeDiffMinutesAgo = - { $number -> - [one] minutę temu - [few] { $number } minuty temu - *[other] { $number } minut temu - } -timeDiffHoursAgo = - { $number -> - [one] godzinę temu - [few] { $number } godziny temu - *[other] { $number } godzin temu - } -timeDiffDaysAgo = - { $number -> - [one] wczoraj - [few] { $number } dni temu - *[other] { $number } dni temu - } -timeDiffFutureSeconds = za kilka sekund -timeDiffFutureMinutes = - { $number -> - [one] za minutę - [few] za { $number } minuty - *[other] za { $number } minut - } -timeDiffFutureHours = - { $number -> - [one] za godzinę - [few] za { $number } godziny - *[other] za { $number } godzin - } -timeDiffFutureDays = - { $number -> - [one] jutro - [few] za { $number } dni - *[other] za { $number } dni - } -errorThirdPartyCookiesEnabled = Jeśli to Twój zrzut i nie możesz go usunąć, to musisz tymczasowo włączyć ciasteczka witryn zewnętrznych podmiotów w preferencjach przeglądarki. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Nowość! -promoMessage = Zaktualizowane narzędzia edycji umożliwiają kadrowanie, zakreślanie, a nawet dodawanie tekstu do zrzutu. -promoLink = Wypróbuj je -promoCloseButton = - .title = Zamknij powiadomienie - -## Annotations - -annotationPenButton = - .title = Długopis -annotationHighlighterButton = - .title = Zakreślacz -annotationUndoButton = - .title = Cofnij -annotationRedoButton = - .title = Ponów -annotationTextButton = - .title = Dodaj tekst -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Wyczyść -annotationCropButton = - .title = Przytnij -annotationSaveEditButton = Zapisz - .title = Zapisz modyfikację -annotationCancelEditButton = Anuluj - .title = Anuluj modyfikowanie -annotationCropConfirmButton = Potwierdź - .title = Potwierdź zaznaczenie -annotationCropCancelButton = Anuluj - .title = Anuluj zaznaczenie -annotationColorWhite = - .title = Biały -annotationColorBlack = - .title = Czarny -annotationColorRed = - .title = Czerwony -annotationColorGreen = - .title = Zielony -annotationColorBlue = - .title = Niebieski -annotationColorYellow = - .title = Żółty -annotationColorPurple = - .title = Fioletowy -annotationColorSeaGreen = - .title = Morski -annotationColorGrey = - .title = Szary -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Rozmiar tekstu -# Values shown in text size selection dropdown -textSizeSmall = Mały -textSizeMedium = Średni -textSizeLarge = Duży -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Potwierdź - .title = Potwierdź -textToolCancelButton = Anuluj - .title = Anuluj -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Cześć - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Coś się nie powiodło -copyImageErrorMessage = Nie można skopiować zrzutu do schowka. - -## Settings Page - -settingsDisconnectButton = Rozłącz - .title = Rozłącz -settingsGuestAccountMessage = Konto gościa -settingsSignInButton = Zaloguj się - .title = Zaloguj się -SettingsPageHeader = Ustawienia Firefox Screenshots -settingsFirefoxAccountSubHeader = Konto Firefoksa -settingsClosePreferences = - .title = Zamknij preferencje -settingsFxaDisconnectAlertMessage = Czy na pewno rozłączyć to urządzenie od konta Firefoksa? -settingsFxaDisconnectDescription = Po wylogowaniu odzyskanie dostępu do zrzutów użytkownika będzie wymagało ponownego zalogowania. -settingsFxaConnectDescription = Można się zalogować, aby mieć dostęp do swoich zrzutów ekranu na wszystkich urządzeniach. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Błąd podczas usuwania zrzutu: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Moje zrzuty: wyszukaj „{ $searchTerm }” -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Błąd podczas wyświetlania strony: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Przeszukaj moje zrzuty -shotIndexPageNoShotsMessage = Brak zrzutów. -shotIndexPageNoShotsInvitation = Może jakiś utworzymy? -shotIndexPageLookingForShots = Wyszukiwanie zrzutów… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Nie możemy znaleźć zrzutów pasujących do wyszukiwania. -shotIndexPageMyShotsButton = - .title = Moje zrzuty -shotIndexPageClearSearchButton = - .title = Wyczyść wyszukiwanie -shotIndexPageConfirmShotDelete = Usunąć ten zrzut? -shotIndexPagePreviousPage = - .title = Poprzednia strona -shotIndexPageNextPage = - .title = Następna strona -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = To nie jest ulubiony zrzut, ulegnie on przeterminowaniu -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = To ulubiony zrzut, nie ulega on przeterminowaniu -shotIndexSyncedShot = - .title = Zrzut wykonany na innym urządzeniu -shotIndexAlertErrorFavoriteShot = Błąd podczas aktualizowania stanu „ulubiony” zrzutu - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Czy na pewno usunąć ten zrzut? -shotDeleteCancel = Anuluj - .title = Anuluj -shotDeleteConfirm = Usuń - .title = Usuń - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Aby wyeksportować, kliknij Plik → Zapisz stronę jako…, a zrzut ekranu znajdzie się w folderze „{ $folder }” - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Statystyki Firefox Screenshots -metricsPageTotalsQueryTitle = Razem -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Przegląd Screenshots -metricsPageTotalsQueryDevices = Liczba zarejestrowanych urządzeń -metricsPageTotalsQueryActiveShots = Aktywne zrzuty -metricsPageTotalsQueryExpiredShots = Przeterminowane (do odzysku) -metricsPageTotalsQueryExpiredDeletedShots = Przeterminowane (usunięte) -metricsPageShotsQueryTitle = Zrzuty dziennie -metricsPageShotsQueryDescription = Liczba zrzutów tworzonych codziennie (przez ostatnich 30 dni) -metricsPageShotsQueryCount = Liczba zrzutów -metricsPageShotsQueryDay = Dzień -metricsPageUsersQueryTitle = Liczba użytkowników dziennie -metricsPageUsersQueryDescription = Liczba użytkowników tworzących przynajmniej jeden zrzut, dziennie (ostatnich 30 dni) -metricsPageUsersQueryCount = Liczba użytkowników -metricsPageUsersQueryDay = Dzień -metricsPageUserShotsQueryTitle = Liczba zrzutów na użytkownika -metricsPageUserShotsQueryDescription = Liczba użytkowników, którzy utworzyli około N zrzutów -metricsPageUserShotsQueryCount = Liczba użytkowników -metricsPageUserShotsQueryShots = Przybliżona liczba aktywnych (nieprzeterminowanych) zrzutów -metricsPageRetentionQueryTitle = Tygodniowa retencja -metricsPageRetentionQueryDescription = Liczba dni od pierwszego do najnowszego zrzutu użytkownika, według pierwszego tygodnia -metricsPageRetentionQueryUsers = Liczba użytkowników -metricsPageRetentionQueryDays = Dni od pierwszego do najnowszego zrzutu użytkownika -metricsPageRetentionQueryFirstWeek = Tydzień, w którym użytkownik utworzył pierwszy zrzut -metricsPageTotalRetentionQueryTitle = Całkowita retencja -metricsPageTotalRetentionQueryDescription = Czas tworzenia zrzutów przez użytkowników, według tygodnia -metricsPageTotalRetentionQueryUsers = Liczba użytkowników -metricsPageTotalRetentionQueryDays = Liczba dni, podczas których użytkownik tworzył zrzuty -metricsPageVersionQueryTitle = Wersja dodatku -metricsPageVersionQueryDescription = Wersja dodatku użyta podczas zalogowania, podczas ostatnich 14 dni -metricsPageVersionQueryUsers = Liczba zalogowanych użytkowników -metricsPageVersionQueryVersion = Wersja dodatku -metricsPageVersionQueryLastSeen = Dzień -metricsPageHeader = Statystyki -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Utworzono: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (czas bazy danych: { $time } ms) diff --git a/locales/pt-BR/server.ftl b/locales/pt-BR/server.ftl deleted file mode 100644 index 274ca8a3ab..0000000000 --- a/locales/pt-BR/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Minhas capturas -gHomeLink = Início -gNoShots = - .alt = Capturas não encontradas -gScreenshotsDescriptionServerless = Captura de tela simplificada. Faça e baixe capturas de tela sem deixar o Firefox. - -## Header - -buttonSettings = - .title = Configurações -buttonSignIn = - .title = Entrar -screenshotsLogo = - .title = Página inicial do Screenshots -bannerSignIn = Entre ou cadastre-se para acessar suas capturas em outros dispositivos e salvar suas preferidas para sempre. -bannerUpsell = { gScreenshotsDescription } Baixe o Firefox agora mesmo -shutdownWarning = Capturas salvas expirarão em breve. A partir de junho, o Screenshots não oferecerá mais armazenamento online. Quer guardar capturas da sua biblioteca? Baixe para seu computador. -shutdownPageTitle = O Screenshots está mudando -shutdownPageDescription = A partir de junho, o Screenshots não oferecerá mais armazenamento online. Quer guardar capturas de sua biblioteca? Baixe capturas, individualmente ou em lote. Obrigado por usar este recurso, desculpe qualquer inconveniência. -shutdownPageContinue = Esperamos que você continue usando o Screenshots para fazer, copiar e baixar capturas de tela. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Quais as novidades no Firefox Screenshots? -onboardingPromoMessage = Entre no Screenshots com uma Conta Firefox e faça mais: -onboardingPromoMessageListItem1 = Acesse sua biblioteca em todos os seus dispositivos -onboardingPromoMessageListItem2 = Guarde suas capturas preferidas para sempre -onboardingPromoDismissButton = Dispensar - .title = Dispensar -onboardingPromoSigninButton = Entrar - .title = Entrar - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Termos -footerLinkPrivacy = Política de Privacidade -footerReportShot = Reportar captura - .title = Reportar esta captura por abuso, spam ou outros problemas -footerLinkFaqs = Perguntas frequentes -footerLinkDMCA = Reportar infrações de IP -footerLinkDiscourse = Enviar opinião -footerLinkRemoveAllData = Remover todos os dados - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Criando { $title } -creatingPageTitleDefault = página -creatingPageWaitMessage = Salvando captura… - -## Home page - -homePageDescription = - .content = Capturas de tela intuitivas diretamente no navegador. Capture, salve e compartilhe telas enquanto navega na web usando o Firefox. -homePageButtonMyShots = Ir para minhas capturas -homePageTeaser = Em breve… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Download grátis -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Como o Firefox Screenshots funciona -homePageGetStartedTitle = Início -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Selecione o ícone do Screenshots no menu de ações da página, na barra de endereços. O menu do Screenshots aparecerá no topo da janela do seu navegador. -homePageCaptureRegion = Capture uma Região -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Clique e arraste para selecionar a área que deseja capturar. Ou simplesmente passe o mouse e clique — o Screenshots irá selecionar a área automaticamente pra você. Gostou do que escolheu? Clique em Salvar para acessar sua captura on-line, ou no botão com a seta para baixo para baixar para seu computador. -homePageCapturePage = Capture uma Página -homePageCapturePageDescription = Use os botões no canto superior direito para capturar telas inteiras. O botão Salvar Área Visível irá capturar a área que você vê sem rolar a página. O botão Salvar Página Inteira irá capturar toda a página. -homePageDownloadCopy = Baixar ou copiar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Faça sua melhor captura. O Screenshots permite baixar sua seleção, ou copiar direto para a área de transferência. -homePageLegalLink = Jurídico -homePagePrivacyLink = Privacidade -homePageTermsLink = Termos -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Remover todos os dados -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Você deve ter o Firefox Screenshots instalado ou conectado à conta do Firefox para excluir sua conta -leavePageErrorGeneric = Ocorreu um erro -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Isso irá apagar permanentemente todos os seus dados do Firefox Screenshots. -leavePageButtonProceed = Prosseguir -leavePageButtonCancel = Cancelar -leavePageDeleted = Todas as suas capturas foram apagadas! - -## Not Found page - -notFoundPageTitle = Página não encontrada -notFoundPageIntro = Oops. -notFoundPageDescription = Página não encontrada. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Captura de tela: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Erro ao salvar tempo limite -shotPageAlertErrorDeletingShot = Erro ao excluir captura -shotPageAlertErrorUpdatingTitle = Erro ao salvar título -shotPageConfirmDelete = Tem certeza que deseja excluir essa captura permanentemente? -shotPageShareButton = - .title = Compartilhar -shotPageCopyButton = - .title = Copiar a imagem para área de transferência -shotPageCopyActionLabel = Copiar -shotPageCopied = Copiado -shotPageShareFacebook = - .title = Compartilhar no Facebook -shotPageShareTwitter = - .title = Compartilhar no Twitter -shotPageSharePinterest = - .title = Compartilhar no Pinterest -shotPageShareEmail = - .title = Compartilhar link via e-mail -shotPageShareLink = Obter um link para compartilhar essa captura: -shotPagePrivacyMessage = Qualquer pessoa com o link pode ver essa captura. -shotPageCopyImageText = - .label = Copiar texto da imagem -shotPageConfirmDeletion = Tem certeza que deseja excluir essa captura permanentemente? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Se você não fizer nada, esta captura será excluída em . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaurar até { $date } -shotPageExpiredMessage = Essa captura expirou. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Esta é a página onde a captura foi criada originalmente: -shotPageDeleteButton = - .title = Excluir esta captura -shotPageDownloadShot = - .title = Baixar -shotPageEditButton = - .title = Editar esta imagem -shotPagefavoriteButton = - .title = Adicionar esta captura de tela aos favoritos -shotPageBackToHomeButton = - .title = Página inicial -shotPageAllShotsButton = - .title = Todas capturas de tela -shotPageScreenshotsDescriptionServerless = Captura de tela simplificada. Faça e baixe capturas de tela sem deixar o Firefox. -shotPageDMCAMessage = Essa captura não está mais disponível devido a reclamação de Direitos Autorais de terceiros. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Envie um e-mail para { $dmca } para pedir mais informações. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Se suas capturas estiverem associadas a múltiplas reclamações, poderemos revogar seu acesso ao Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Por favor, inclua a URL desta captura no seu e-mail: { $url } -shotPageKeepFor = Quanto tempo essa captura deve ficar armazenada? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Selecionar tempo -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinidamente ∞ -shotPageKeepTenMinutes = 10 minutos -shotPageKeepOneHour = 1 hora -shotPageKeepOneDay = 1 dia -shotPageKeepOneWeek = 1 semana -shotPageKeepTwoWeeks = 2 semanas -shotPageKeepOneMonth = 1 mês -shotPageSaveExpiration = salvar -shotPageCancelExpiration = cancelar -shotPageDoesNotExpire = não expira -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expira -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = expirou há -timeDiffJustNow = agora -timeDiffMinutesAgo = - { $number -> - [one] 1 minuto atrás - *[other] { $number } minutos atrás - } -timeDiffHoursAgo = - { $number -> - [one] 1 hora atrás - *[other] { $number } horas atrás - } -timeDiffDaysAgo = - { $number -> - [one] ontem - *[other] { $number } dias atrás - } -timeDiffFutureSeconds = em poucos segundos -timeDiffFutureMinutes = - { $number -> - [one] em 1 minuto - *[other] em { $number } minutos - } -timeDiffFutureHours = - { $number -> - [one] em 1 hora - *[other] em { $number } horas - } -timeDiffFutureDays = - { $number -> - [one] amanhã - *[other] em { $number } dias - } -errorThirdPartyCookiesEnabled = Se tirou esta captura e não consegue excluí-la, talvez seja necessário habilitar temporariamente os cookies de terceiros nas preferências do seu navegador. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Anote! -promoMessage = As ferramentas de edição atualizadas permitem que você recorte, destaque e até adicione texto à sua captura de tela. -promoLink = Faça um teste -promoCloseButton = - .title = Fechar notificação - -## Annotations - -annotationPenButton = - .title = Pintar -annotationHighlighterButton = - .title = Destacar -annotationUndoButton = - .title = Desfazer -annotationRedoButton = - .title = Refazer -annotationTextButton = - .title = Adicionar texto -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Limpar -annotationCropButton = - .title = Recortar -annotationSaveEditButton = Salvar - .title = Salvar edição -annotationCancelEditButton = Cancelar - .title = Cancelar edição -annotationCropConfirmButton = Confirmar - .title = Confirmar seleção -annotationCropCancelButton = Cancelar - .title = Cancelar seleção -annotationColorWhite = - .title = Branco -annotationColorBlack = - .title = Preto -annotationColorRed = - .title = Vermelho -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Azul -annotationColorYellow = - .title = Amarelo -annotationColorPurple = - .title = Roxo -annotationColorSeaGreen = - .title = Oceano -annotationColorGrey = - .title = Cinza -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tamanho do texto -# Values shown in text size selection dropdown -textSizeSmall = Pequeno -textSizeMedium = Médio -textSizeLarge = Grande -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirmar - .title = Confirmar -textToolCancelButton = Cancelar - .title = Cancelar -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Olá - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Algo deu errado -copyImageErrorMessage = Não foi possível copiar a captura para a área de transferência - -## Settings Page - -settingsDisconnectButton = Desconectar - .title = Desconectar -settingsGuestAccountMessage = Conta de convidado -settingsSignInButton = Entrar - .title = Entrar -SettingsPageHeader = Configurações do Firefox Screenshots -settingsFirefoxAccountSubHeader = Conta Firefox -settingsClosePreferences = - .title = Fechar preferências -settingsFxaDisconnectAlertMessage = Tem certeza que deseja desconectar este dispositivo da sua Conta Firefox? -settingsFxaDisconnectDescription = Se você sair, precisará entrar novamente para voltar a acessar suas capturas de tela. -settingsFxaConnectDescription = Você pode entrar para acessar suas capturas em outros dispositivos. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Erro ao excluir captura: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Minhas capturas: procurar por { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Erro ao renderizar página: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Procurar minhas capturas -shotIndexPageNoShotsMessage = Não há capturas salvas. -shotIndexPageNoShotsInvitation = Vamos, crie algumas. -shotIndexPageLookingForShots = Procurando por suas capturas... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Não encontramos capturas que correspondam com sua busca. -shotIndexPageMyShotsButton = - .title = Minhas capturas de tela -shotIndexPageClearSearchButton = - .title = Limpar pesquisa -shotIndexPageConfirmShotDelete = Excluir esta captura? -shotIndexPagePreviousPage = - .title = Página anterior -shotIndexPageNextPage = - .title = Próxima página -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Esta captura de tela expirará pois não foi marcada como favorita -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Esta captura de tela não expira pois foi marcada como favorita -shotIndexSyncedShot = - .title = Captura obtida em outro dispositivo -shotIndexAlertErrorFavoriteShot = Erro ao atualizar o status da captura de tela favorita - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Tem certeza de que deseja excluir esta captura? -shotDeleteCancel = Cancelar - .title = Cancelar -shotDeleteConfirm = Excluir - .title = Excluir - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Para exportar: use Arquivo > Salvar página como… e você encontrará suas capturas na pasta { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Métricas do Firefox Screenshots -metricsPageTotalsQueryTitle = Totais -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Visão geral do Screenshots -metricsPageTotalsQueryDevices = Total de dispositivos registrados -metricsPageTotalsQueryActiveShots = Capturas ativas -metricsPageTotalsQueryExpiredShots = Expirado (mas é recuperável) -metricsPageTotalsQueryExpiredDeletedShots = Expirado (e excluído) -metricsPageShotsQueryTitle = Capturas por dia -metricsPageShotsQueryDescription = Número de capturas criados por dia (nos últimos 30 dias) -metricsPageShotsQueryCount = Número de capturas -metricsPageShotsQueryDay = Dia -metricsPageUsersQueryTitle = Usuários por dia -metricsPageUsersQueryDescription = Número de usuários que criaram pelo menos uma captura, por dia (últimos 30 dias) -metricsPageUsersQueryCount = Número de usuários -metricsPageUsersQueryDay = Dia -metricsPageUserShotsQueryTitle = Número de capturas por usuário -metricsPageUserShotsQueryDescription = Número de usuários que têm cerca de N capturas no total -metricsPageUserShotsQueryCount = Número de usuários -metricsPageUserShotsQueryShots = Número aproximado de capturas ativas (não expiradas) -metricsPageRetentionQueryTitle = Retenção por semana -metricsPageRetentionQueryDescription = Número de dias da primeiro captura de um usuário até a mais recente, agrupadas por semana -metricsPageRetentionQueryUsers = Número de usuários -metricsPageRetentionQueryDays = Dias da primeira captura do usuário até a mais recente -metricsPageRetentionQueryFirstWeek = Semana da criação da primeira captura do usuário -metricsPageTotalRetentionQueryTitle = Retenção total -metricsPageTotalRetentionQueryDescription = Período de tempo em que usuários criaram capturas, agrupadas por semana -metricsPageTotalRetentionQueryUsers = Número de usuários -metricsPageTotalRetentionQueryDays = Dias que o usuário tem criado capturas -metricsPageVersionQueryTitle = Versão da extensão -metricsPageVersionQueryDescription = A versão da extensão usado durante o login, nos últimos 14 dias -metricsPageVersionQueryUsers = Número de usuários autenticados -metricsPageVersionQueryVersion = Versão da Extensão -metricsPageVersionQueryLastSeen = Dia -metricsPageHeader = Métricas -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Gerado em: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (hora no banco de dados: { $time }ms) diff --git a/locales/pt-PT/server.ftl b/locales/pt-PT/server.ftl deleted file mode 100644 index e44982650d..0000000000 --- a/locales/pt-PT/server.ftl +++ /dev/null @@ -1,401 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Minhas capturas -gHomeLink = Início -gNoShots = - .alt = Sem capturas encontradas -gScreenshotsDescriptionServerless = Capturas de ecrã simples. Capture e transfira capturas de ecrã sem sair do Firefox. - -## Header - -buttonSettings = - .title = Definições -buttonSignIn = - .title = Iniciar sessão -screenshotsLogo = - .title = Início do Screenshots -bannerSignIn = Inicie sessão ou registe-se para aceder às suas capturas entre dispositivos e guardar as suas favoritas para sempre. -bannerUpsell = { gScreenshotsDescription } Obter o Firefox agora -shutdownWarning = - As capturas de ecrã guardadas vão expirar brevemente. A começar em junho, o Screenshots não irá mais oferecer armazenamento online. Pretende manter capturas da sua biblioteca? - Transfira-as para o seu computador. -shutdownPageTitle = O Screenshots está a alterar -shutdownPageDescription = - A partir de junho, o Screenshots não irá mais oferecer armazenamento online. Pretende manter capturas da sua biblioteca? Transfira capturas individualmente ou em lote. - Obrigado por utilizar esta funcionalidade e pedimos desculpa por qualquer inconveniência. -shutdownPageContinue = Esperamos que continue a utilizar o Screenshots para capturar, copiar e transferir capturas. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = O que há de novo no Firefox Screenshots? -onboardingPromoMessage = Agora, inicie sessão no Screenshots com uma Conta Firefox e faça mais: -onboardingPromoMessageListItem1 = Aceda à sua biblioteca em todos os seus dispositivos -onboardingPromoMessageListItem2 = Armazene as suas capturas favoritas para sempre -onboardingPromoDismissButton = Dispensar - .title = Dispensar -onboardingPromoSigninButton = Iniciar sessão - .title = Iniciar sessão - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Termos -footerLinkPrivacy = Aviso de privacidade -footerReportShot = Reportar captura - .title = Reportar esta captura por abuso, spam, ou outros problemas -footerLinkFaqs = Perguntas frequentes -footerLinkDMCA = Reportar violação de PI -footerLinkDiscourse = Dar feedback -footerLinkRemoveAllData = Remover todos os dados - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = A criar { $title } -creatingPageTitleDefault = página -creatingPageWaitMessage = A guardar a sua captura... - -## Home page - -homePageDescription = - .content = Capturas de ecrã intuitivas embutidas no navegador. Capture, guarde e partilhe capturas de ecrã enquanto navega na Web utilizando o Firefox. -homePageButtonMyShots = Ir para as minhas capturas -homePageTeaser = Brevemente... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Transferência gratuita -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Como é que o Firefox Screenshots funciona -homePageGetStartedTitle = Começar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Selecione o ícone do Screenshots a partir do menu de ações da página na barra de endereço e o menu do Screenshots irá aparecer por cima da janela do seu navegador. -homePageCaptureRegion = Capturar uma região -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Clique e arraste para selecionar a área que deseja capturar ou paire e clique — O Screenshots irá selecionar a área por si. Gosta do que está a ver? Selecione Guardar para aceder à sua captura de ecrã na Internet ou no botão de seta para baixo para a transferir para o seu computador. -homePageCapturePage = Capturar uma página -homePageCapturePageDescription = Utilize os botões no canto superior direito para capturar páginas inteiras. O botão Guardar visível irá capturar a área que pode ver sem deslocar e Guardar página inteira irá capturar tudo na página. -homePageDownloadCopy = Transferir ou copiar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Dê o seu melhor tiro. As capturas de ecrã permitem-lhe transferir a sua seleção ou copiá-la diretamente para a área de transferência. -homePageLegalLink = Informação legal -homePagePrivacyLink = Privacidade -homePageTermsLink = Termos -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Remover todos os dados -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Precisa de ter o Firefox Screenshots instalado ou sessão iniciada no Contas Firefox para apagar a sua conta -leavePageErrorGeneric = Ocorreu um erro -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Isto irá apagar permanentemente todos os seus dados do Firefox Screenshots. -leavePageButtonProceed = Proceder -leavePageButtonCancel = Cancelar -leavePageDeleted = Todas as suas capturas de ecrã foram apagadas! - -## Not Found page - -notFoundPageTitle = Página não encontrada -notFoundPageIntro = Oops. -notFoundPageDescription = Página não encontrada. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Captura de ecrã: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Erro ao guardar a expiração -shotPageAlertErrorDeletingShot = Erro ao apagar a captura -shotPageAlertErrorUpdatingTitle = Erro ao guardar o título -shotPageConfirmDelete = Tem a certeza de que deseja apagar esta captura permanentemente? -shotPageShareButton = - .title = Partilhar -shotPageCopyButton = - .title = Copiar imagem para a área de transferência -shotPageCopyActionLabel = Copiar -shotPageCopied = Copiada -shotPageShareFacebook = - .title = Partilhar no Facebook -shotPageShareTwitter = - .title = Partilhar no Twitter -shotPageSharePinterest = - .title = Partilhar no Pinterest -shotPageShareEmail = - .title = Partilhar ligação via email -shotPageShareLink = Obtenha uma ligação partilhável para esta captura: -shotPagePrivacyMessage = Qualquer pessoa com a ligação pode ver esta captura. -shotPageCopyImageText = - .label = Copiar texto da imagem -shotPageConfirmDeletion = Tem certeza de que deseja apagar esta captura permanentemente? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Se não fizer nada, esta captura irá ser apagada permanentemente . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaurar até { $date } -shotPageExpiredMessage = Esta captura expirou. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Aqui está a página de onde foi criada originalmente: -shotPageDeleteButton = - .title = Apagar esta captura -shotPageDownloadShot = - .title = Transferir -shotPageEditButton = - .title = Editar esta imagem -shotPagefavoriteButton = - .title = Adicionar esta captura aos favoritos -shotPageBackToHomeButton = - .title = Página inicial -shotPageAllShotsButton = - .title = Todas as capturas -shotPageScreenshotsDescriptionServerless = Capturas de ecrã simples. Capture e transfira capturas de ecrã sem sair do Firefox. -shotPageDMCAMessage = Esta captura já não está disponível devido a uma reivindicação de propriedade intelectual de terceiros. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Por favor envie um email para { $dmca } para solicitar mais informação. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Se as suas capturas estão sujeitas a múltiplas reivindicações, poderemos revogar o seu acesso ao Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Por favor inclua o URL desta captura no seu email: { $url } -shotPageKeepFor = Por quanto tempo deve esta captura ser retida? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Selecionar tempo -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Indefinidamente ∞ -shotPageKeepTenMinutes = 10 minutos -shotPageKeepOneHour = 1 hora -shotPageKeepOneDay = 1 dia -shotPageKeepOneWeek = 1 semana -shotPageKeepTwoWeeks = 2 semanas -shotPageKeepOneMonth = 1 mês -shotPageSaveExpiration = guardar -shotPageCancelExpiration = cancelar -shotPageDoesNotExpire = não expira -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expira -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = expirou -timeDiffJustNow = agora mesmo -timeDiffMinutesAgo = - { $number -> - [one] 1 minuto atrás - *[other] { $number } minutos atrás - } -timeDiffHoursAgo = - { $number -> - [one] 1 hora atrás - *[other] { $number } horas atrás - } -timeDiffDaysAgo = - { $number -> - [one] ontem - *[other] { $number } dias atrás - } -timeDiffFutureSeconds = em alguns segundos -timeDiffFutureMinutes = - { $number -> - [one] num minuto - *[other] em { $number } minutos - } -timeDiffFutureHours = - { $number -> - [one] numa hora - *[other] em { $number } horas - } -timeDiffFutureDays = - { $number -> - [one] amanhã - *[other] em { $number } dias - } -errorThirdPartyCookiesEnabled = Se tirou esta captura e não consegue apagá-la, poderá ter de ativar temporariamente os cookies de terceiros a partir das preferências do seu navegador. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Tome nota! -promoMessage = As ferramentas de edição atualizadas permitem-lhe recortar, destacar, e até adicionar texto à sua captura. -promoLink = Experimente-as -promoCloseButton = - .title = Fechar notificação - -## Annotations - -annotationPenButton = - .title = Caneta -annotationHighlighterButton = - .title = Marcador -annotationUndoButton = - .title = Desfazer -annotationRedoButton = - .title = Refazer -annotationTextButton = - .title = Adicionar texto -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Limpar -annotationCropButton = - .title = Recortar -annotationSaveEditButton = Guardar - .title = Guardar edição -annotationCancelEditButton = Cancelar - .title = Cancelar edição -annotationCropConfirmButton = Confirmar - .title = Confirmar seleção -annotationCropCancelButton = Cancelar - .title = Cancelar seleção -annotationColorWhite = - .title = Branco -annotationColorBlack = - .title = Preto -annotationColorRed = - .title = Vermelho -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Azul -annotationColorYellow = - .title = Amarelo -annotationColorPurple = - .title = Roxo -annotationColorSeaGreen = - .title = Verde Mar -annotationColorGrey = - .title = Cinzento -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Tamanho do texto -# Values shown in text size selection dropdown -textSizeSmall = Pequeno -textSizeMedium = Médio -textSizeLarge = Grande -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirmar - .title = Confirmar -textToolCancelButton = Cancelar - .title = Cancelar -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Olá - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Algo correu mal -copyImageErrorMessage = Não foi possível copiar a sua captura para a área de transferência. - -## Settings Page - -settingsDisconnectButton = Desligar - .title = Desligar -settingsGuestAccountMessage = Conta de convidado -settingsSignInButton = Iniciar sessão - .title = Iniciar sessão -SettingsPageHeader = Definições do Firefox Screenshots -settingsFirefoxAccountSubHeader = Conta Firefox -settingsClosePreferences = - .title = Fechar preferências -settingsFxaDisconnectAlertMessage = Tem a certeza de que pretende desligar este dispositivo da sua Conta Firefox? -settingsFxaDisconnectDescription = Se terminar sessão, irá precisar de iniciar sessão novamente para recuperar o acesso às suas capturas de ecrã. -settingsFxaConnectDescription = Pode iniciar sessão para aceder às suas capturas de ecrã entre dispositivos. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Erro ao apagar captura: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Minhas capturas: pesquisar por { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Erro ao renderizar a página: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Pesquisar nas minhas capturas -shotIndexPageNoShotsMessage = Sem capturas guardadas. -shotIndexPageNoShotsInvitation = Vá, crie algumas. -shotIndexPageLookingForShots = À procura das suas capturas... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Não conseguimos encontrar quaisquer capturas que correspondam à sua pesquisa. -shotIndexPageMyShotsButton = - .title = Minhas capturas -shotIndexPageClearSearchButton = - .title = Limpar pesquisa -shotIndexPageConfirmShotDelete = Apagar esta captura? -shotIndexPagePreviousPage = - .title = Página anterior -shotIndexPageNextPage = - .title = Página seguinte -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Esta não é uma captura favorita e irá expirar -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Esta é uma captura favorita e não expira. -shotIndexSyncedShot = - .title = Captura tirada noutro dispositivo -shotIndexAlertErrorFavoriteShot = Erro ao atualizar o estado de captura favorita - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Tem a certeza de que pretende apagar esta captura? -shotDeleteCancel = Cancelar - .title = Cancelar -shotDeleteConfirm = Apagar - .title = Apagar - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Para exportar: utilize Ficheiro > Guardar página como… e você irá encontrar as suas capturas de ecrã na pasta { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Métricas do Firefox Screenshots -metricsPageTotalsQueryTitle = Totais -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Uma visão geral do Screenshots -metricsPageTotalsQueryDevices = Dispositivos totais registados -metricsPageTotalsQueryActiveShots = Capturas ativas -metricsPageTotalsQueryExpiredShots = Expiradas (mas recuperáveis) -metricsPageTotalsQueryExpiredDeletedShots = Expiradas (e apagadas) -metricsPageShotsQueryTitle = Capturas por dia -metricsPageShotsQueryDescription = Número de capturas criadas a cada dia (para os últimos 30 dias) -metricsPageShotsQueryCount = Número de capturas -metricsPageShotsQueryDay = Dia -metricsPageUsersQueryTitle = Utilizadores por dia -metricsPageUsersQueryDescription = Número de utilizadores que criaram pelo menos uma captura, por dia (últimos 30 dias) -metricsPageUsersQueryCount = Número de utilizadores -metricsPageUsersQueryDay = Dia -metricsPageUserShotsQueryTitle = Número de capturas por utilizador -metricsPageUserShotsQueryDescription = O número de utilizadores que têm cerca de N capturas totais -metricsPageUserShotsQueryCount = Número de utilizadores -metricsPageUserShotsQueryShots = Número aproximado de capturas ativas (não expiradas) -metricsPageRetentionQueryTitle = Retenção por semana -metricsPageRetentionQueryDescription = Número de dias desde a primeira captura de um utilizador até à mais recente captura, agrupado pela semana inicial -metricsPageRetentionQueryUsers = Número de utilizadores -metricsPageRetentionQueryDays = Dias desde a primeira captura à mais recente do utilizador -metricsPageRetentionQueryFirstWeek = Semana em que o utilizador primeiro criou uma captura -metricsPageTotalRetentionQueryTitle = Retenção total -metricsPageTotalRetentionQueryDescription = Período de tempo em que os utilizadores têm criado capturas, agrupado por semana -metricsPageTotalRetentionQueryUsers = Número de utilizadores -metricsPageTotalRetentionQueryDays = Dias que o utilizador tem criado capturas -metricsPageVersionQueryTitle = Versão do extra -metricsPageVersionQueryDescription = A versão do extra utilizada durante o início de sessão, nos últimos 14 dias -metricsPageVersionQueryUsers = Número de utilizadores com sessão iniciada -metricsPageVersionQueryVersion = Versão do extra -metricsPageVersionQueryLastSeen = Dia -metricsPageHeader = Métricas -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Geradas em: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (tempo da base de dados: { $time }ms) diff --git a/locales/rm/server.ftl b/locales/rm/server.ftl deleted file mode 100644 index 6d6a285a69..0000000000 --- a/locales/rm/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mes maletgs dal visur -gHomeLink = Pagina da partenza -gNoShots = - .alt = Chattà nagins maletgs dal visur -gScreenshotsDescriptionServerless = Maletgs dal visur senza schaschin. Fa e telechargia maletgs dal visur senza bandunar Firefox. - -## Header - -buttonSettings = - .title = Parameters -buttonSignIn = - .title = S'annunziar -screenshotsLogo = - .title = Pagina da partenza da Screenshots -bannerSignIn = T'annunzia u ta registrescha per acceder a tes maletgs dal visur cun agid da mintga apparat e memorisar tes favurits per adina. -bannerUpsell = { gScreenshotsDescription } Telechargiar Firefox -shutdownWarning = Ils maletgs dal visur memorisads vegnan prest eliminads. A partir dal zercladur na porscha Screenshots nagin arcun online pli. Vuls ti salvar ils maletgs da tia biblioteca? Als telechargia sin tes computer. -shutdownPageTitle = Screenshots sa mida -shutdownPageDescription = A partir dal zercladur na porscha Screenshots nagina memoria online pli. Vuls ti preservar maletgs da tia biblioteca? Telechargia ils maletgs in ad in u tuts en ina. Grazia per utilisar questa funcziunalitad. Nus ans perstgisain per las fadias che quest pass chaschuna. -shutdownPageContinue = Nus sperain che ti cuntinueschias ad utilisar Screenshots per far, copiar e telechargiar maletgs dal visur. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Tge datti da nov en Firefox Screenshots? -onboardingPromoMessage = Ussa pon ins s'annunziar en Screenshots cun in conto da Firefox per far dapli: -onboardingPromoMessageListItem1 = Acceda a tia biblioteca cun tut tes apparats -onboardingPromoMessageListItem2 = Memorisescha per adina tes maletgs favurits -onboardingPromoDismissButton = Sbittar - .title = Sbittar -onboardingPromoSigninButton = S'annunziar - .title = S'annunziar - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Cundiziuns d'utilisaziun -footerLinkPrivacy = Infurmaziuns davart la protecziun da datas -footerReportShot = Annunziar quest maletg - .title = Annunziar quest maletg per motivs dad abus, spam u auters problems -footerLinkFaqs = Dumondas frequentas -footerLinkDMCA = Rapportar ina violaziun da proprietad intellectuala -footerLinkDiscourse = Dar in resun -footerLinkRemoveAllData = Allontanar tut las datas - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Crear { $title } -creatingPageTitleDefault = pagina -creatingPageWaitMessage = Memorisar tia foto… - -## Home page - -homePageDescription = - .content = Maletgs dal visur directamain en tes navigatur. Prender, memorisar e cundivider maletgs dal visur durant la navigaziun en il web cun Firefox. -homePageButtonMyShots = Mussar mes maletgs dal visur -homePageTeaser = Bainprest disponibel… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Telechargia gratuita -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Co Firefox Screenshots funcziuna -homePageGetStartedTitle = Cumenzar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Tscherna l'icona da Screenshots en il menu d'acziuns da la pagina en la trav d'adressas. Lura cumpara il menu Screenshots sisum la fanestra dal navigatur. -homePageCaptureRegion = Fotografar ina zona -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Clicca e tira per tscherner la zona che ti vuls fotografar. U clicca simplamain insanua sin il cuntegn da la pagina — Screenshots tscherna la zona per tai. Sche quai che ti vesas ta cunvegna, tscherna «Memorisar» per avair access online a tes maletg dal visur u tscherna la frizza che mussa engiu per al telechargiar sin tes computer. -homePageCapturePage = Fotografar ina pagina -homePageCapturePageDescription = Utilisescha ils buttuns sisum a dretga per fotografar paginas entiras. Il buttun «Memorisar la regiun visibla» fotografescha la zona che ti vesas senza defilar e «Memorisar la pagina cumpletta» fotografescha l'entira pagina. -homePageDownloadCopy = Telechargiar u copiar -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Fa in maletg sco s'auda. Screenshots ta lascha telechargiar tia selecziun u la copiar directamain en l'archiv provisoric. -homePageLegalLink = Infurmaziuns giuridicas -homePagePrivacyLink = Protecziun da datas -homePageTermsLink = Cundiziuns d'utilisaziun -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Stizzar tut las datas -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Ti stos avair installà Firefox Screenshots u esser annunzià cun il conto da Firefox per pudair stizzar tes conto -leavePageErrorGeneric = Ina errur è succedida -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Questa operaziun stizza definitivamain tut tias datas da Firefox Screenshots. -leavePageButtonProceed = Cuntinuar -leavePageButtonCancel = Interrumper -leavePageDeleted = Stizzà tut tes maletgs dal visur! - -## Not Found page - -notFoundPageTitle = Betg chattà la pagina -notFoundPageIntro = Segner char! -notFoundPageDescription = Betg chattà la pagina. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Maletg dal visur: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Errur durant memorisar la data da scadenza -shotPageAlertErrorDeletingShot = Errur durant stizzar il maletg -shotPageAlertErrorUpdatingTitle = Errur durant memorisar il titel -shotPageConfirmDelete = Vuls ti propi stizzar definitivamain quest maletg dal visur? -shotPageShareButton = - .title = Cundivider -shotPageCopyButton = - .title = Copiar il maletg en l'archiv provisoric -shotPageCopyActionLabel = Copiar -shotPageCopied = Copià -shotPageShareFacebook = - .title = Cundivider sin Facebook -shotPageShareTwitter = - .title = Cundivider sin Twitter -shotPageSharePinterest = - .title = Cundivider sin Pinterest -shotPageShareEmail = - .title = Cundivider la colliaziun via e-mail -shotPageShareLink = Retschaiver ina colliaziun per cundivider quest maletg: -shotPagePrivacyMessage = Mintgin che ha la colliaziun po vesair quest maletg. -shotPageCopyImageText = - .label = Copiar il text dal maletg -shotPageConfirmDeletion = Vuls ti propi stizzar definitivamain quest maletg dal visur? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Sche ti na fas nagut vegn quest maletg stizzà definitivamain . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaurar enfin { $date } -shotPageExpiredMessage = Quest maletg è scrudà. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Quai è la pagina da la quala il maletg deriva oriundamain: -shotPageDeleteButton = - .title = Stizzar quest maletg -shotPageDownloadShot = - .title = Telechargiar -shotPageEditButton = - .title = Modifitgar quest maletg -shotPagefavoriteButton = - .title = Marcar quest maletg sco favurit -shotPageBackToHomeButton = - .title = Pagina da partenza -shotPageAllShotsButton = - .title = Tut ils maletgs -shotPageScreenshotsDescriptionServerless = Maletgs dal visur senza schaschin. Fa e telechargia maletgs dal visur senza bandunar Firefox. -shotPageDMCAMessage = Quest maletg n'è betg pli disponibel perquai che terzas persunas ha fatg valair ina violaziun dals dretgs d'autur. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Scriva p.pl. a { $dmca } per retschaiver ulteriuras infurmaziuns. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Sche tes maletgs provocheschan pliras reclamaziuns vegn tes access a Firefox Screenshots eventualmain bloccà. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Includa per plaschair l'URL da quest maletg en tes e-mail: { $url } -shotPageKeepFor = Quant ditg duai quest maletg vegnir preservà? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Tscherner ina durada -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Infinit ∞ -shotPageKeepTenMinutes = 10 minutas -shotPageKeepOneHour = 1 ura -shotPageKeepOneDay = 1 di -shotPageKeepOneWeek = 1 emna -shotPageKeepTwoWeeks = 2 emnas -shotPageKeepOneMonth = 1 mais -shotPageSaveExpiration = memorisar -shotPageCancelExpiration = interrumper -shotPageDoesNotExpire = na scroda betg -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = scroda -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = scrudà -timeDiffJustNow = gist ussa -timeDiffMinutesAgo = - { $number -> - [one] avant 1 minuta - *[other] avant { $number } minutas - } -timeDiffHoursAgo = - { $number -> - [one] avant 1 ura - *[other] avant { $number } uras - } -timeDiffDaysAgo = - { $number -> - [one] ier - *[other] avant { $number } dis - } -timeDiffFutureSeconds = en in pèr secundas -timeDiffFutureMinutes = - { $number -> - [one] en 1 minuta - *[other] en { $number } minutas - } -timeDiffFutureHours = - { $number -> - [one] en 1 ura - *[other] en { $number } uras - } -timeDiffFutureDays = - { $number -> - [one] damaun - *[other] en { $number } dis - } -errorThirdPartyCookiesEnabled = Sche ti has fatg quest maletg dal visur e na pos betg al stizzar, stos ti eventualmain activar temporarmain cookies da terzs en las preferenzas da tes navigatur. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Adatg! -promoMessage = Cun novs utensils per elavurar maletgs pos ti retagliar e sclerir il maletg dal visur e perfin agiuntar text. -promoLink = Emprova -promoCloseButton = - .title = Serrar l'avis - -## Annotations - -annotationPenButton = - .title = Culli -annotationHighlighterButton = - .title = Marcader luminus -annotationUndoButton = - .title = Restituir -annotationRedoButton = - .title = Repeter -annotationTextButton = - .title = Agiuntar text -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Reinizialisar -annotationCropButton = - .title = Retagliar -annotationSaveEditButton = Memorisar - .title = Memorisar las modificaziuns -annotationCancelEditButton = Annullar - .title = Annullar las modificaziuns -annotationCropConfirmButton = Confermar - .title = Confermar la selecziun -annotationCropCancelButton = Annullar - .title = Annullar la selecziun -annotationColorWhite = - .title = Alv -annotationColorBlack = - .title = Nair -annotationColorRed = - .title = Cotschen -annotationColorGreen = - .title = Verd -annotationColorBlue = - .title = Blau -annotationColorYellow = - .title = Mellen -annotationColorPurple = - .title = Violet -annotationColorSeaGreen = - .title = Verd da la mar -annotationColorGrey = - .title = Grisch -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Grondezza da la scrittira -# Values shown in text size selection dropdown -textSizeSmall = Pitschen -textSizeMedium = Mesaun -textSizeLarge = Grond -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confermar - .title = Confermar -textToolCancelButton = Interrumper - .title = Interrumper -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Chau - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Igl ha dà in problem -copyImageErrorMessage = Impussibel da copiar tes maletg en l'archiv provisoric. - -## Settings Page - -settingsDisconnectButton = Deconnectar - .title = Deconnectar -settingsGuestAccountMessage = Conto da giast -settingsSignInButton = S'annunziar - .title = S'annunziar -SettingsPageHeader = Preferenzas da Firefox Screenshots -settingsFirefoxAccountSubHeader = Conto da Firefox -settingsClosePreferences = - .title = Serrar las preferenzas -settingsFxaDisconnectAlertMessage = Vuls ti propi deconnectar quest apparat dal conto da Firefox? -settingsFxaDisconnectDescription = Sche ti sortas, stos ti danovamain t'annunziar per puspè avair access a tes maletgs dal visur. -settingsFxaConnectDescription = Ti pos t'annunziar per acceder als maletgs dal visur sin tut tes apparats. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Errur durant stizzar il maletg: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mes maletgs: tschertgar { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Errur durant generar la pagina: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Tschertgar en mes maletgs -shotIndexPageNoShotsMessage = Nagins maletgs memorisads. -shotIndexPageNoShotsInvitation = Dai! Creescha insaquants. -shotIndexPageLookingForShots = Nus tschertgain tes maletgs… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Nus n'avain chattà nagin maletg che correspunda a tia tschertga. -shotIndexPageMyShotsButton = - .title = Mes maletgs dal visur -shotIndexPageClearSearchButton = - .title = Stizzar la tschertga -shotIndexPageConfirmShotDelete = Stizzar quest maletg? -shotIndexPagePreviousPage = - .title = Pagina precedenta -shotIndexPageNextPage = - .title = Proxima pagina -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Quest maletg n'è nagin favurit e vegn a scrudar -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Quest maletg è in favurit e na scroda betg -shotIndexSyncedShot = - .title = Maletg fatg cun in auter apparat -shotIndexAlertErrorFavoriteShot = Errur cun actualisar il status dal maletg favurit - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Vuls ti propi stizzar quest maletg dal visur? -shotDeleteCancel = Interrumper - .title = Interrumper -shotDeleteConfirm = Stizzar - .title = Stizzar - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Per exportar: tscherna Datoteca > Memorisar la pagina sut… e ti vegns a chattar tes maletgs dal visur en l'ordinatur { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Statisticas da Firefox Screenshots -metricsPageTotalsQueryTitle = Totalmain -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Ina survista da Screenshots -metricsPageTotalsQueryDevices = Total dals apparats registrads -metricsPageTotalsQueryActiveShots = Maletgs activs -metricsPageTotalsQueryExpiredShots = Scrudads (ma restaurabels) -metricsPageTotalsQueryExpiredDeletedShots = Scrudads (e stizzads) -metricsPageShotsQueryTitle = Maletgs per di -metricsPageShotsQueryDescription = Dumber da maletgs creads mintga di (durant ils ultims 30 dis) -metricsPageShotsQueryCount = Dumber da maletgs -metricsPageShotsQueryDay = Di -metricsPageUsersQueryTitle = Utilisaders per di -metricsPageUsersQueryDescription = Dumber dad utilisaders che han creà almain in maletg, per di (ultims 30 dis) -metricsPageUsersQueryCount = Dumber dad utilisaders -metricsPageUsersQueryDay = Di -metricsPageUserShotsQueryTitle = Dumber da maletgs per utilisader -metricsPageUserShotsQueryDescription = Il dumber dad utilisaders che han en total N maletgs -metricsPageUserShotsQueryCount = Dumber dad utilisaders -metricsPageUserShotsQueryShots = Dumber approximativ da maletgs activs (betg scrudads) -metricsPageRetentionQueryTitle = Preservaziun per emna -metricsPageRetentionQueryDescription = Dumber da dis tranter l'emprim e l'ultim maletg dad in utilisader, gruppà tenor l'emna da partenza -metricsPageRetentionQueryUsers = Dumber d'utilisaders -metricsPageRetentionQueryDays = Dumber da dis tranter l'emprim e l'ultim maletg dad in utilisader -metricsPageRetentionQueryFirstWeek = Emna en la quala l'utilisader ha fatg l'emprim maletg -metricsPageTotalRetentionQueryTitle = Preservaziun en total -metricsPageTotalRetentionQueryDescription = Durada durant la quala utilisaders han creà maletgs, gruppà tenor emna -metricsPageTotalRetentionQueryUsers = Dumber d'utilisaders -metricsPageTotalRetentionQueryDays = Dis che l'utilisader ha creà maletgs -metricsPageVersionQueryTitle = Versiun dal supplement -metricsPageVersionQueryDescription = La versiun dal supplement utilisà durant l'annunzia, ils ultims 14 dis -metricsPageVersionQueryUsers = Dumber d'utilisaders annunziads -metricsPageVersionQueryVersion = Versiun dal supplement -metricsPageVersionQueryLastSeen = Di -metricsPageHeader = Statisticas -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generà ils: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (durada d'utilisaziun da la banca da datas: { $time }ms) diff --git a/locales/ro/server.ftl b/locales/ro/server.ftl deleted file mode 100644 index 32e1be277f..0000000000 --- a/locales/ro/server.ftl +++ /dev/null @@ -1,403 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Capturile mele -gHomeLink = Start -gNoShots = - .alt = Nicio captură găsită -gScreenshotsDescriptionServerless = Capturi de ecran simple. Efectuează și descarcă capturi de ecran fără să ieși din Firefox. - -## Header - -buttonSettings = - .title = Setări -buttonSignIn = - .title = Autentificare -screenshotsLogo = - .title = Pagina de start Screenshots -bannerSignIn = Autentifică-te sau înregistrează-te pentru a accesa propriile capturi pe toate dispozitivele și pentru a-ți salva favoritele pentru totdeauna. -bannerUpsell = { gScreenshotsDescription }Obține Firefox acum -shutdownWarning = Capturile de ecran salvate expiră în curând. Începând din iunie, Screenshots nu va mai oferi spațiu de stocare online. Vrei să îți păstrezi capturile din bibliotecă? Descarcă-le pe calculator. -shutdownPageTitle = Screenshots se modifică -shutdownPageDescription = Începând cu luna iunie, Screenshots nu va mai oferi spațiu de stocare online. Vrei să păstrezi fotografiile din bibliotecă? Descarcă individual capturile de ecran salvate sau pe loturi . Îți mulțumim pentru utilizarea acestei funcții și ne cerem scuze pentru orice inconveniențe. -shutdownPageContinue = Sperăm că vei continua să utilizezi Screenshot pentru a captura, descărca și copia capturi de ecran. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Ce este nou cu Firefox Screenshots? -onboardingPromoMessage = Conectează-te acum în Screenshots cu un cont Firefox și fă mai multe: -onboardingPromoMessageListItem1 = Accesează-ți biblioteca pe toate dispozitivele -onboardingPromoMessageListItem2 = Stochează capturile tale favorite pentru totdeauna -onboardingPromoDismissButton = Înlătură - .title = Înlătură -onboardingPromoSigninButton = Autentifică-te - .title = Autentifică-te - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Termeni -footerLinkPrivacy = Politica de confidențialitate -footerReportShot = Raportează captura - .title = Raportează această captură pentru abuz, spam sau alte probleme -footerLinkFaqs = Întrebări frecvente -footerLinkDMCA = Raportează o încălcare a PI -footerLinkDiscourse = Oferă feedback -footerLinkRemoveAllData = Elimină toate datele - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Se creează { $title } -creatingPageTitleDefault = pagină -creatingPageWaitMessage = Se salvează captura… - -## Home page - -homePageDescription = - .content = Capturi de ecran intuitive integrate direct în browser. Capturează, salvează și partajează capturi de ecran pe măsură ce navighezi pe web folosind Firefox. -homePageButtonMyShots = Mergi la Capturile mele -homePageTeaser = În curând… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Descărcare gratuită -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Cum funcționează Firefox Screenshots -homePageGetStartedTitle = Începe -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Selectează pictograma Screenshots din meniul de acțiuni pe pagină în bara de adrese și meniul Screenshots va apărea în partea de sus în fereastra browserului. -homePageCaptureRegion = Capturează o regiune -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Dă clic și trage pentru a selecta zona pe care vrei s-o capturezi. Sau pur și simplu poziționează cursorul deasupra și dă clic — Screenshots va selecta zona pentru tine. Îți place ce vezi? Selectează Salvează pentru a-ți accesa online captura de ecran sau butonul săgeată în jos pentru a o descărca pe calculator. -homePageCapturePage = Fă o captură de pagină -homePageCapturePageDescription = Folosește butoanele din dreapta sus pentru a captura pagini întregi. Butonul Salvează porțiunea vizibilă va captura zona pe care o poți vedea fără să derulezi și butonul Salvează pagina completă va captura toată pagina. -homePageDownloadCopy = Descarcă sau copiază -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Fă cea mai bună captură de ecran. Screenshots permite descărcarea selecției sau copierea ei direct în clipboard. -homePageLegalLink = Mențiuni legale -homePagePrivacyLink = Confidențialitate -homePageTermsLink = Termeni -homePageCookiesLink = Cookie-uri - -## Leave Screenshots page - -leavePageRemoveAllData = Elimină toate datele -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Trebuie să ai Firefox Screenshots instalat sau să fii autentificat în contul Firefox pentru a-ți șterge contul. -leavePageErrorGeneric = A intervenit o eroare. -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Acest lucru va șterge definitiv toate datele tale Firefox Screenshots. -leavePageButtonProceed = Continuă -leavePageButtonCancel = Renunță -leavePageDeleted = Toate capturile tale de ecran au fost șterse! - -## Not Found page - -notFoundPageTitle = Pagină negăsită -notFoundPageIntro = Ups. -notFoundPageDescription = Pagină negăsită. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Captură de ecran: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Eroare la salvarea expirării -shotPageAlertErrorDeletingShot = Eroare la ștergerea capturii -shotPageAlertErrorUpdatingTitle = Eroare la salvarea titlului -shotPageConfirmDelete = Sigur vrei să ștergi definitiv această captură? -shotPageShareButton = - .title = Partajează -shotPageCopyButton = - .title = Copiază imaginea în clipboard -shotPageCopyActionLabel = Copiază -shotPageCopied = Copiat -shotPageShareFacebook = - .title = Partajează pe Facebook -shotPageShareTwitter = - .title = Partajează pe Twitter -shotPageSharePinterest = - .title = Partajează pe Pinterest -shotPageShareEmail = - .title = Trimite linkul pe e-mail -shotPageShareLink = Obține un link partajabil către această captură: -shotPagePrivacyMessage = Oricine are linkul poate vedea această captură. -shotPageCopyImageText = - .label = Copiază textul imaginii -shotPageConfirmDeletion = Sigur vrei să ștergi definitiv această captură? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Dacă nu faci nimic, această captură va fi ștersă permanent . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = restaurează până la { $date } -shotPageExpiredMessage = Această captură a expirat. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Iată pagina de pe care a fost creată inițial: -shotPageDeleteButton = - .title = Șterge această captură -shotPageDownloadShot = - .title = Descarcă -shotPageEditButton = - .title = Editează această imagine -shotPagefavoriteButton = - .title = Adaugă la favorite -shotPageBackToHomeButton = - .title = Pagina de start -shotPageAllShotsButton = - .title = Toate capturile -shotPageScreenshotsDescriptionServerless = Capturi de ecran simple. Efectuează și descarcă capturi de ecrane fără să ieși din Firefox. -shotPageDMCAMessage = Această captură nu mai este disponibilă din cauza unei reclamații de proprietate intelectuală. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Te rugăm să trimiți un e-mail la { $dmca } pentru a solicita informații suplimentare. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Dacă imaginile tale sunt supuse unor reclamații multiple, îți putem restricționa accesul la Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Te rugăm să incluzi adresa acestei imagini în e-mailul tău: { $url } -shotPageKeepFor = Cât timp ar trebui să fie păstrată această captură? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Selectează durata -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Fără expirare ∞ -shotPageKeepTenMinutes = 10 minute -shotPageKeepOneHour = 1 oră -shotPageKeepOneDay = 1 zi -shotPageKeepOneWeek = 1 săptămână -shotPageKeepTwoWeeks = 2 săptămâni -shotPageKeepOneMonth = 1 lună -shotPageSaveExpiration = salvează -shotPageCancelExpiration = renunță -shotPageDoesNotExpire = nu expiră -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = expiră -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = a expirat -timeDiffJustNow = chiar acum -timeDiffMinutesAgo = - { $number -> - [one] în urmă cu 1 minut - [few] în urmă cu { $number } minute - *[other] în urmă cu { $number } de minute - } -timeDiffHoursAgo = - { $number -> - [one] în urmă cu 1 oră - [few] în urmă cu { $number } ore - *[other] în urmă cu { $number } de ore - } -timeDiffDaysAgo = - { $number -> - [one] ieri - [few] în urmă cu { $number } zile - *[other] în urmă cu { $number } de zile - } -timeDiffFutureSeconds = în câteva secunde -timeDiffFutureMinutes = - { $number -> - [one] într-un minut - [few] în { $number } minute - *[other] în { $number } de minute - } -timeDiffFutureHours = - { $number -> - [one] într-o oră - [few] în { $number } ore - *[other] în { $number } de ore - } -timeDiffFutureDays = - { $number -> - [one] mâine - [few] în { $number } zile - *[other] în { $number } de zile - } -errorThirdPartyCookiesEnabled = Dacă ai realizat această captură și nu o poți șterge, poate fi necesară activarea temporară a cookie-urile de la terți din preferințele browserului. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Apropo! -promoMessage = Unelte de editare actualizate îți permit să decupezi, evidențiezi sau chiar să adaugi text la captura ta. -promoLink = Încearcă -promoCloseButton = - .title = Închide notificarea - -## Annotations - -annotationPenButton = - .title = Stilou -annotationHighlighterButton = - .title = Marker -annotationUndoButton = - .title = Anulează -annotationRedoButton = - .title = Refă -annotationTextButton = - .title = Adaugă text -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Curăță -annotationCropButton = - .title = Decupează -annotationSaveEditButton = Salvează - .title = Salvează editarea -annotationCancelEditButton = Renunță - .title = Renunță la editare -annotationCropConfirmButton = Confirmă - .title = Confirmă selecția -annotationCropCancelButton = Anulează - .title = Anulează selecția -annotationColorWhite = - .title = Alb -annotationColorBlack = - .title = Negru -annotationColorRed = - .title = Roșu -annotationColorGreen = - .title = Verde -annotationColorBlue = - .title = Albastru -annotationColorYellow = - .title = Galben -annotationColorPurple = - .title = Purpuriu -annotationColorSeaGreen = - .title = Verde marin -annotationColorGrey = - .title = Gri -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Mărime text -# Values shown in text size selection dropdown -textSizeSmall = Mic -textSizeMedium = Mediu -textSizeLarge = Mare -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Confirmă - .title = Confirmă -textToolCancelButton = Renunță - .title = Renunță -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Salut - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Ceva a mers prost -copyImageErrorMessage = Nu se poate copia captura pe clipboard. - -## Settings Page - -settingsDisconnectButton = Deconectează-te - .title = Deconectează-te -settingsGuestAccountMessage = Cont ca vizitator -settingsSignInButton = Autentifică-te - .title = Autentifică-te -SettingsPageHeader = Setări Firefox Screenshots -settingsFirefoxAccountSubHeader = Cont Firefox -settingsClosePreferences = - .title = Închide preferințele -settingsFxaDisconnectAlertMessage = Ești sigur că vrei să deconectezi acest dispozitiv de la contul Firefox? -settingsFxaDisconnectDescription = Dacă te deconectezi, va trebui să te autentifici din nou ca să ai iar acces la capturile tale de ecran. -settingsFxaConnectDescription = Te poți autentifica pentru acces la capturile tale de ecran pe toate dispozitivele. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = S-a produs o eroare la ștergerea capturii: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Capturile mele: caută { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Eroare la afișarea paginii: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Caută capturile mele -shotIndexPageNoShotsMessage = Nicio captură salvată. -shotIndexPageNoShotsInvitation = Haide, realizează câteva. -shotIndexPageLookingForShots = Se caută capturile tale... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Nu am găsit capturi după căutarea specificată. -shotIndexPageMyShotsButton = - .title = Capturile mele -shotIndexPageClearSearchButton = - .title = Curăță căutarea -shotIndexPageConfirmShotDelete = Ștergi această captură? -shotIndexPagePreviousPage = - .title = Pagina anterioară -shotIndexPageNextPage = - .title = Pagina următoare -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Acesta nu este o imagine favorită, și va expira -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Aceasta este o captură favorită și nu expiră -shotIndexSyncedShot = - .title = Captură realizată pe alt dispozitiv -shotIndexAlertErrorFavoriteShot = Eroare în actualizarea stării căpturii favorite - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Sigur vrei să ștergi această captură? -shotDeleteCancel = Renunță - .title = Renunță -shotDeleteConfirm = Șterge - .title = Șterge - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Pentru export: Folosește Fișier > Salvează pagina ca… și îți vei regăsi capturile de ecran în dosarul { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metrici Firefox Screenshots -metricsPageTotalsQueryTitle = Totaluri -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Prezentare generală Screenshots -metricsPageTotalsQueryDevices = Dispozitive înregistrate -metricsPageTotalsQueryActiveShots = Capturi active -metricsPageTotalsQueryExpiredShots = Expirate (dar recuperabile) -metricsPageTotalsQueryExpiredDeletedShots = Expirate (și șterse) -metricsPageShotsQueryTitle = Capturi în funcție de zi -metricsPageShotsQueryDescription = Numărul de capturi creeate în fiecare zi (în ultimele 30 de zile) -metricsPageShotsQueryCount = Număr de capturi -metricsPageShotsQueryDay = Zi -metricsPageUsersQueryTitle = Utilizatori în funcție de zi -metricsPageUsersQueryDescription = Numărul de utilizatori care au creeat cel puțin o captură, după zile (ultimele 30 de zile) -metricsPageUsersQueryCount = Număr de utilizatori -metricsPageUsersQueryDay = Zi -metricsPageUserShotsQueryTitle = Numărul de capturi pe utilizator -metricsPageUserShotsQueryDescription = Numărul de utilizatori care au în jur de N capturi totale -metricsPageUserShotsQueryCount = Număr de utilizatori -metricsPageUserShotsQueryShots = Numărul aproximativ de capturi (ne-expirate) -metricsPageRetentionQueryTitle = Retenția pe săptămână -metricsPageRetentionQueryDescription = Numărul de zile de la prima captură a unui utilizator până la cea mai recentă, grupate pe săptămâni -metricsPageRetentionQueryUsers = Număr de utilizatori -metricsPageRetentionQueryDays = Zile de la prima până la cea mai recentă captură -metricsPageRetentionQueryFirstWeek = Săptămâna în care utilizatorul a creat prima captură -metricsPageTotalRetentionQueryTitle = Retenție totală -metricsPageTotalRetentionQueryDescription = Durata în care utilizatorii au creat capturi, grupat pe săptămâni. -metricsPageTotalRetentionQueryUsers = Număr de utilizatori -metricsPageTotalRetentionQueryDays = Zile în care utilizatorul a creat capturi -metricsPageVersionQueryTitle = Versiunea suplimentului -metricsPageVersionQueryDescription = Versiunea suplimentului folosit în timpul autentificării în ultimele 14 zile -metricsPageVersionQueryUsers = Numărul de utilizatori autentificați -metricsPageVersionQueryVersion = Versiunea suplimentului -metricsPageVersionQueryLastSeen = Zi -metricsPageHeader = Indicatori metrici -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Generat la: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (durata bazei de date: { $time }ms) diff --git a/locales/ru/server.ftl b/locales/ru/server.ftl deleted file mode 100644 index 8d5582aed7..0000000000 --- a/locales/ru/server.ftl +++ /dev/null @@ -1,403 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Мои снимки -gHomeLink = Главная -gNoShots = - .alt = снимков не найдено -gScreenshotsDescriptionServerless = Делать скриншоты теперь просто. Создавайте и загружайте скриншоты, не покидая Firefox. - -## Header - -buttonSettings = - .title = Параметры -buttonSignIn = - .title = Войти -screenshotsLogo = - .title = Главная страница Screenshots -bannerSignIn = Войдите или зарегистрируйтесь для получения доступа к вашим снимкам с различных устройств и навсегда сохраните необходимые. -bannerUpsell = { gScreenshotsDescription } Загрузить Firefox -shutdownWarning = Срок хранения сохранённых снимков экрана скоро истекает. Начиная с июня, Screenshots более не будет предлагать использовать онлайн-хранилище. Хотите сохранить снимки из своей библиотеки? Загрузите их на свой компьютер. -shutdownPageTitle = Screenshots изменяются -shutdownPageDescription = Начиная с июня, онлайн-хранилище для скриншотов более не будет доступно. Хотите сохранить снимки из своей библиотеки? Загрузите их поодиночке или все сразу. Спасибо за использование этой функции и извините за неудобства. -shutdownPageContinue = Надеемся, вы продолжите использовать Screenshots для создания, копирования и загрузки скриншотов. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Что нового в Firefox Screenshots? -onboardingPromoMessage = Теперь, вы можете сделать больше, войдя в Screenshots через Аккаунт Firefox: -onboardingPromoMessageListItem1 = Получить доступ к своей библиотеке на всех ваших устройствах -onboardingPromoMessageListItem2 = Навсегда сохранить свои любимые снимки -onboardingPromoDismissButton = Убрать - .title = Убрать -onboardingPromoSigninButton = Войти - .title = Войти - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Условия использования -footerLinkPrivacy = Уведомление о конфиденциальности -footerReportShot = Пожаловаться на снимок - .title = Сообщить о спаме, нарушении прав или других проблемах -footerLinkFaqs = ЧЗВ -footerLinkDMCA = Сообщить о нарушении авторских прав -footerLinkDiscourse = Оставить отзыв -footerLinkRemoveAllData = Удалить все данные - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Создание { $title } -creatingPageTitleDefault = страница -creatingPageWaitMessage = Сохранение вашего снимка… - -## Home page - -homePageDescription = - .content = Простые скриншоты прямо в браузере. Захватывайте, сохраняйте и делитесь скриншотами, когда просматриваете Интернет с помощью Firefox. -homePageButtonMyShots = Перейти к моим снимкам -homePageTeaser = Скоро… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Бесплатная загрузка -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Как работает Firefox Screenshots -homePageGetStartedTitle = Начало -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Выберите значок «Скриншоты» в меню действий на странице в адресной строке и меню «Скриншоты» появится вверху окна вашего браузера. -homePageCaptureRegion = Захватите область -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Щёлкните и перетащите, чтобы выбрать область, которую вы хотите захватить. Или просто наведите мышью и щёлкните — Скриншоты выберут область сами. Нравится, что вы видите? Выберите «Сохранить», чтобы получить возможность опубликовать ваш скриншот онлайн, или щёлкните по кнопке со стрелкой вниз, чтобы загрузить снимок на ваш компьютер. -homePageCapturePage = Захватите страницу -homePageCapturePageDescription = С помощью кнопок в верхнем правом углу вы можете захватить страницу целиком. Кнопка «Сохранить видимое» захватит видимое содержимое страницы, которое доступно без прокручивания, а «Сохранить всю страницу» захватит всю страницу целиком. -homePageDownloadCopy = Загрузить или скопировать -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Сделайте свой лучший снимок. Screenshots позволяют вам загружать или копировать их прямо в буфер обмена. -homePageLegalLink = Юридическая информация -homePagePrivacyLink = Приватность -homePageTermsLink = Условия использования -homePageCookiesLink = Куки - -## Leave Screenshots page - -leavePageRemoveAllData = Удалить все данные -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Чтобы удалить свой аккаунт, вы должны сначала установить Firefox Screenshots или войти в Аккаунт Firefox. -leavePageErrorGeneric = Произошла ошибка -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Это действие навсегда удалит все ваши данные Firefox Screenshots. -leavePageButtonProceed = Продолжить -leavePageButtonCancel = Отмена -leavePageDeleted = Все ваши скриншоты были стёрты! - -## Not Found page - -notFoundPageTitle = Страница не найдена -notFoundPageIntro = Ой. -notFoundPageDescription = Страница не найдена. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Скриншот: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Ошибка при сохранении времени истечения -shotPageAlertErrorDeletingShot = Ошибка при удалении снимка -shotPageAlertErrorUpdatingTitle = Ошибка при сохранении заголовка -shotPageConfirmDelete = Вы уверены, что хотите навсегда удалить этот снимок? -shotPageShareButton = - .title = Поделиться -shotPageCopyButton = - .title = Скопировать изображение в буфер обмена -shotPageCopyActionLabel = Скопировать -shotPageCopied = Скопировано -shotPageShareFacebook = - .title = Поделиться на Фейсбуке -shotPageShareTwitter = - .title = Поделиться на Твиттере -shotPageSharePinterest = - .title = Поделиться на Pinterest -shotPageShareEmail = - .title = Поделиться ссылкой по электронной почте -shotPageShareLink = Получить публичную ссылку на этот снимок: -shotPagePrivacyMessage = Любой, имеющий эту ссылку, может просматривать этот снимок. -shotPageCopyImageText = - .label = Скопировать текст изображения -shotPageConfirmDeletion = Вы уверены, что хотите удалить этот снимок навсегда? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Если вы ничего не будете делать, снимок будет удалён навсегда . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = продлён до { $date } -shotPageExpiredMessage = Снимок просрочен. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Страница, из которой создан этот снимок: -shotPageDeleteButton = - .title = Удалить этот снимок -shotPageDownloadShot = - .title = Загрузить -shotPageEditButton = - .title = Изменить это изображение -shotPagefavoriteButton = - .title = Добавить этот снимок в избранные -shotPageBackToHomeButton = - .title = Домашняя страница -shotPageAllShotsButton = - .title = Все снимки -shotPageScreenshotsDescriptionServerless = Делать скриншоты теперь просто. Создавайте и загружайте скриншоты, не покидая Firefox. -shotPageDMCAMessage = Этот снимок больше недоступен из-за нарушения авторских прав третьей стороны. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Пожалуйста, напишите на { $dmca }, чтобы запросить дополнительную информацию. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Если на ваши снимки пожаловались несколько раз, мы можем заблокировать вам доступ к Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Пожалуйста, включите в ваше письмо ссылку на этот снимок: { $url } -shotPageKeepFor = Как долго этот снимок будет храниться? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Выберите время -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Бессрочно ∞ -shotPageKeepTenMinutes = 10 минут -shotPageKeepOneHour = 1 час -shotPageKeepOneDay = 1 день -shotPageKeepOneWeek = 1 неделя -shotPageKeepTwoWeeks = 2 недели -shotPageKeepOneMonth = 1 месяц -shotPageSaveExpiration = сохранить -shotPageCancelExpiration = отменить -shotPageDoesNotExpire = неограниченный срок -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = срок хранения истечёт -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = срок хранения истёк -timeDiffJustNow = прямо сейчас -timeDiffMinutesAgo = - { $number -> - [one] { $number } минуту назад - [few] { $number } минуты назад - *[other] { $number } минут назад - } -timeDiffHoursAgo = - { $number -> - [one] { $number } час назад - [few] { $number } часа назад - *[other] { $number } часов назад - } -timeDiffDaysAgo = - { $number -> - [one] { $number } день назад - [few] { $number } дня назад - *[other] { $number } дней назад - } -timeDiffFutureSeconds = через несколько секунд -timeDiffFutureMinutes = - { $number -> - [one] через { $number } минуту - [few] через { $number } минуты - *[other] через { $number } минут - } -timeDiffFutureHours = - { $number -> - [one] через { $number } час - [few] через { $number } часа - *[other] через { $number } часов - } -timeDiffFutureDays = - { $number -> - [one] через { $number } день - [few] через { $number } дня - *[other] через { $number } дней - } -errorThirdPartyCookiesEnabled = Если вы сделали этот снимок и не можете удалить его, то вам нужно временно включить сторонние куки в настройках вашего браузера. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Делайте заметки! -promoMessage = Обновлённые инструменты редактирования позволяют вам обрезать, выделять и даже добавлять текст на ваши снимки. -promoLink = Попробуйте -promoCloseButton = - .title = Закрыть уведомление - -## Annotations - -annotationPenButton = - .title = Ручка -annotationHighlighterButton = - .title = Маркер -annotationUndoButton = - .title = Отменить -annotationRedoButton = - .title = Повторить -annotationTextButton = - .title = Добавить текст -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Очистить -annotationCropButton = - .title = Обрезать -annotationSaveEditButton = Сохранить - .title = Сохранить изменение -annotationCancelEditButton = Отмена - .title = Отмена изменения -annotationCropConfirmButton = Подтвердить - .title = Подтвердить выделение области -annotationCropCancelButton = Отмена - .title = Отменить выделение -annotationColorWhite = - .title = Белый -annotationColorBlack = - .title = Чёрный -annotationColorRed = - .title = Красный -annotationColorGreen = - .title = Зелёный -annotationColorBlue = - .title = Синий -annotationColorYellow = - .title = Жёлтый -annotationColorPurple = - .title = Фиолетовый -annotationColorSeaGreen = - .title = Морская зелень -annotationColorGrey = - .title = Серый -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Размер текста -# Values shown in text size selection dropdown -textSizeSmall = Маленький -textSizeMedium = Средний -textSizeLarge = Большой -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Подтвердить - .title = Подтвердить -textToolCancelButton = Отмена - .title = Отмена -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Привет - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Что-то пошло не так -copyImageErrorMessage = Не удалось скопировать ваш снимок в буфер обмена. - -## Settings Page - -settingsDisconnectButton = Отсоединить - .title = Отсоединить -settingsGuestAccountMessage = Гостевой аккаунт -settingsSignInButton = Войти - .title = Войти -SettingsPageHeader = Параметры Firefox Screenshots -settingsFirefoxAccountSubHeader = Аккаунт Firefox -settingsClosePreferences = - .title = Закрыть настройки -settingsFxaDisconnectAlertMessage = Вы уверены, что хотите отключить это устройство от своего Аккаунта Firefox? -settingsFxaDisconnectDescription = Если вы выйдете, вам нужно будет снова войти, чтобы восстановить доступ к вашим снимкам экрана. -settingsFxaConnectDescription = Вы можете войти для доступа к вашим скриншотам с различных устройств. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Ошибка при удалении снимка: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Мои снимки: поиск { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Ошибка рендеринга страницы: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Поиск моих снимков -shotIndexPageNoShotsMessage = Нет сохранённых снимков. -shotIndexPageNoShotsInvitation = Давайте, сделайте несколько штук. -shotIndexPageLookingForShots = Ищем ваши снимки... -shotIndexPageNoSearchResultsIntro = Хмм -shotIndexPageNoSearchResults = Мы не можем найти каких-либо снимков по вашему поисковому запросу. -shotIndexPageMyShotsButton = - .title = Мои снимки -shotIndexPageClearSearchButton = - .title = Очистить поиск -shotIndexPageConfirmShotDelete = Удалить этот снимок? -shotIndexPagePreviousPage = - .title = Предыдущая страница -shotIndexPageNextPage = - .title = Следующая страница -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Этот снимок не в избранном, и он будет удалён через некоторое время -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Это снимок является избранным и будет храниться бессрочно -shotIndexSyncedShot = - .title = Снимок сделан на другом устройстве -shotIndexAlertErrorFavoriteShot = Произошла ошибка при добавлении этого снимка в избранное - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Вы уверены, что хотите удалить этот снимок? -shotDeleteCancel = Отмена - .title = Отмена -shotDeleteConfirm = Удалить - .title = Удалить - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Для экспорта: используйте «Файл» > «Сохранить как…» и вы найдете свои скриншоты в папке { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Метрики Firefox Screenshots -metricsPageTotalsQueryTitle = Всего -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Обзор cкриншотов -metricsPageTotalsQueryDevices = Всего зарегистрированных устройств -metricsPageTotalsQueryActiveShots = Активные снимки -metricsPageTotalsQueryExpiredShots = Просрочено (доступно восстановление) -metricsPageTotalsQueryExpiredDeletedShots = Просрочено (и удалено) -metricsPageShotsQueryTitle = Снимков в день -metricsPageShotsQueryDescription = Число снимков созданных за каждый день (за последние 30 дней) -metricsPageShotsQueryCount = Число снимков -metricsPageShotsQueryDay = День -metricsPageUsersQueryTitle = Пользователей в день -metricsPageUsersQueryDescription = Число пользователей, создавших хотя бы один снимок, за день (последние 30 дней) -metricsPageUsersQueryCount = Число пользователей -metricsPageUsersQueryDay = День -metricsPageUserShotsQueryTitle = Число снимков на пользователя -metricsPageUserShotsQueryDescription = Число пользователей, которые сделали около N снимков всего -metricsPageUserShotsQueryCount = Число пользователей -metricsPageUserShotsQueryShots = Приблизительное число активных (неистёкших) снимков -metricsPageRetentionQueryTitle = Сохранение за неделю -metricsPageRetentionQueryDescription = Число дней от первого снимка пользователя до самого последнего, сгруппировано по началу недели -metricsPageRetentionQueryUsers = Число пользователей -metricsPageRetentionQueryDays = Дней от первого до последнего снимка пользователя -metricsPageRetentionQueryFirstWeek = Неделя, на которой пользователь создал первый снимок -metricsPageTotalRetentionQueryTitle = Общее число -metricsPageTotalRetentionQueryDescription = Количество времени, которое пользователи тратят на создание снимков, сгруппированное по неделям -metricsPageTotalRetentionQueryUsers = Число пользователей -metricsPageTotalRetentionQueryDays = Дни, в которые пользователь создавал скриншоты -metricsPageVersionQueryTitle = Версия дополнения -metricsPageVersionQueryDescription = Версия дополнения, использованного во время входа, в течение последних 14 дней -metricsPageVersionQueryUsers = Число вошедших пользователей -metricsPageVersionQueryVersion = Версия дополнения -metricsPageVersionQueryLastSeen = День -metricsPageHeader = Метрики -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Сгенерировано: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (время базы данных: { $time }мс) diff --git a/locales/si/server.ftl b/locales/si/server.ftl deleted file mode 100644 index 0f0f4c7323..0000000000 --- a/locales/si/server.ftl +++ /dev/null @@ -1,76 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = මගෙ දසුන් -gHomeLink = නිවස -gNoShots = - .alt = දසුන්මු හමුවූයේ නැත - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = නියමයන් -footerLinkPrivacy = පෞද්ගලිකත්ව ප්‍රතිපත්තිය -footerLinkFaqs = නිති අසෙන පැණ -footerLinkDiscourse = ප්‍රතිචාර ලබා දෙන්න -footerLinkRemoveAllData = සියලු දත්ත මකන්න - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } තනමින් -creatingPageTitleDefault = පිටුව -creatingPageWaitMessage = ඔබේ දසුන් සුරකිමින්... - -## Home page - -homePageTeaser = පැමිණීමට නියමිත... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = නොමිලේ ලබා ගන්න -homePageGetStarted = අරඹන්න -homePageGetStartedTitle = අරඹන්න -homePageLegalLink = නීතිමය -homePagePrivacyLink = පුද්ගලිකත්වය -homePageTermsLink = නියමයන් -homePageCookiesLink = කුකීස් - -## Leave Screenshots page - -leavePageRemoveAllData = සියලු දත්ත මකන්න -leavePageButtonProceed = ඉදිරියට යන්න -leavePageButtonCancel = අවලංගු කරන්න - -## Not Found page - -notFoundPageTitle = පිටුව හමු නොවිණි -notFoundPageDescription = පිටුව හමු නොවිණි. - -## Shot page - -shotPageCopy = පිටපත් කරන්න -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = වේලාව තෝරන්න -shotPageSaveExpiration = සුරකින්න -shotPageCancelExpiration = අවලංගු කරන්න - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/sk/server.ftl b/locales/sk/server.ftl deleted file mode 100644 index b2a4efe060..0000000000 --- a/locales/sk/server.ftl +++ /dev/null @@ -1,403 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Moje snímky -gHomeLink = Domov -gNoShots = - .alt = Neboli nájdené žiadne snímky -gScreenshotsDescriptionServerless = Snímky obrazovky idú urobiť aj jednoducho. Tvorte a preberajte snímky obrazovky bez toho, aby ste museli opustiť Firefox. - -## Header - -buttonSettings = - .title = Nastavenia -buttonSignIn = - .title = Prihlásiť sa -screenshotsLogo = - .title = Domovská stránka -bannerSignIn = Pre prístup ku snímkam z iných zariadení alebo pre ich ukladanie sa, prosím, prihláste alebo zaregistrujte. -bannerUpsell = { gScreenshotsDescription } Prevezmite si Firefox hneď teraz -shutdownWarning = Uloženým snímkam čoskoro vyprší platnosť. Od júna už služba Screenshots nebude ponúkať možnosť nahrávať snímky na internet. Svoje nahrané snímky si môžete prevziať do počítača. -shutdownPageTitle = Službu Screenshots čaká zmena -shutdownPageDescription = Od júna nebude služba Screenshots naďalej ponúkať online úložisko. Ak si chcete ponechať snímky uložené vo vašej knižnici, prevezmite si ich. Môžete si ich prevziať jednotlivo alebo naraz. Ďakujeme vám, za používanie tejto funkcie a ospravedlňujeme sa za prípadné nepríjemnosti. -shutdownPageContinue = Dúfame, že budete našu službu používať aj naďalej. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Čo je nové vo Firefox Screenshots? -onboardingPromoMessage = Po prihlásení sa pomocou účtu Firefox môžete: -onboardingPromoMessageListItem1 = Mať prístup ku svojej knižnici na všetkých vašich zariadeniach -onboardingPromoMessageListItem2 = Svoje obľúbené snímky si môžete ukladať naveky -onboardingPromoDismissButton = Zavrieť - .title = Zavrieť -onboardingPromoSigninButton = Prihlásiť sa - .title = Prihlásiť sa - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Podmienky -footerLinkPrivacy = Zásady ochrany súkromia -footerReportShot = Nahlásiť snímku - .title = Nahláste obťažovanie, spam alebo iný problém -footerLinkFaqs = Často kladené otázky -footerLinkDMCA = Nahlásiť zneužitie IP adresy -footerLinkDiscourse = Poskytnúť spätnú väzbu -footerLinkRemoveAllData = Odstrániť všetky údaje - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Vytváram snímku { $title } -creatingPageTitleDefault = stránky -creatingPageWaitMessage = Ukladanie vašej snímky… - -## Home page - -homePageDescription = - .content = Intuitívne snímky obrazovky priamo v prehliadači. Zachyťte, uložte a zdieľajte snímky obrazovky priamo pri prehliadaní pomocou Firefoxu. -homePageButtonMyShots = Prejsť na moje snímky -homePageTeaser = Už čoskoro... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Prevziať zadarmo -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Ako služba Firefox Screenshots funguje -homePageGetStartedTitle = Začíname -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = V paneli s adresou v ponuke akcii stránky vyberte ikonu služby Screenshos a jej ponuka sa zobrazí v hornej časti okna prehliadača. -homePageCaptureRegion = Vytvorte snímku oblasti -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Kliknutím a potiahnutím vyberte oblasť stránky, ktorú chcete zachytiť. Alebo na ňu len prejdite myšou - doplnok Screenshots vyberie oblasť za vás. Páči sa vám to? Kliknutím na tlačidlo Uložiť nahráte snímok na internet, kliknutím na šípku ho prevezmete do počítača. -homePageCapturePage = Vytvorte snímku celej stránky -homePageCapturePageDescription = Pre zachytenie celej stránky použite tlačidlo v pravom hornom rohu. Tlačidlom Uložiť viditeľnú časť vyberiete a uložíte časť stránky, ktorú práve vidíte a tlačidlom Uložiť celú stránku zachytíte všetko, čo na stránke je. -homePageDownloadCopy = Prevziať alebo skopírovať -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Pomocou funkcie Screenshots môžete svoj výber prevziať alebo ho skopírovať do schránky. -homePageLegalLink = Právne informácie -homePagePrivacyLink = Súkromie -homePageTermsLink = Podmienky používania -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Odstrániť všetky údaje -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Ak chcete odstrániť svoj účet, musíte mať nainštalovaný Firefox Screenshots alebo sa musíte prihlásiť k účtu Firefox. -leavePageErrorGeneric = Vyskytla sa chyba -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Toto natrvalo vymaže zo služby Firefox Screenshots všetky vaše údaje. -leavePageButtonProceed = Pokračovať -leavePageButtonCancel = Zrušiť -leavePageDeleted = Všetky vaše snímky boli odstránené! - -## Not Found page - -notFoundPageTitle = Stránka nebola nájdená -notFoundPageIntro = Hups. -notFoundPageDescription = Stránka nebola nájdená. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Snímka obrazovky: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Pri ukladaní doby platnosti snímky nastala chyba -shotPageAlertErrorDeletingShot = Pri odstraňovaní snímky sa vyskytla chyba -shotPageAlertErrorUpdatingTitle = Pri ukladaní názvu sa vyskytla chyba -shotPageConfirmDelete = Naozaj chcete natrvalo odstrániť túto snímku? -shotPageShareButton = - .title = Zdieľať -shotPageCopyButton = - .title = Kopírovať obrázok do schránky -shotPageCopyActionLabel = Kopírovať -shotPageCopied = Skopírované -shotPageShareFacebook = - .title = Zdieľať na Facebooku -shotPageShareTwitter = - .title = Zdieľať na Twitteri -shotPageSharePinterest = - .title = Zdieľať na Pintereste -shotPageShareEmail = - .title = Zdieľať odkaze e-mailom -shotPageShareLink = Odkaz na zdieľanie tejto snímky: -shotPagePrivacyMessage = Na túto snímku sa bude môcť pozrieť každý, kto bude mať tento odkaz. -shotPageCopyImageText = - .label = Kopírovať text z obrázka -shotPageConfirmDeletion = Naozaj chcete natrvalo odstrániť túto snímku? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ak nič neurobíte, táto snímka bude navždy odstránená . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = obnoviť do { $date } -shotPageExpiredMessage = Platnosť tejto snímky vypršala. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Stránka, z ktorej bola snímka vytvorená: -shotPageDeleteButton = - .title = Odstrániť túto snímku -shotPageDownloadShot = - .title = Prevziať -shotPageEditButton = - .title = Upraviť tento obrázok -shotPagefavoriteButton = - .title = Označiť snímku ako obľúbenú -shotPageBackToHomeButton = - .title = Domovská stránka -shotPageAllShotsButton = - .title = Všetky snímky -shotPageScreenshotsDescriptionServerless = Snímky obrazovky idú urobiť aj jednoducho. Tvorte a preberajte snímky obrazovky bez toho, aby ste museli opustiť Firefox. -shotPageDMCAMessage = Táto snímka naďalej nie je dostupná z dôvodu uplatnenia si nároku na duševné vlastníctvo treťou stranou. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Ďalšie informácie si môžete vyžiadať e-mailom na adrese { $dmca }. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ak sú vaše snímky predmetom mnohých nárokov, môže dôjsť k zablokovaniu vášho prístupu k službe Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Do e-mailu zahrňte, prosím, URL adresu tejto snímky: { $url } -shotPageKeepFor = Na ako dlho má byť táto snímka uložená? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Vyberte čas -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Navždy ∞ -shotPageKeepTenMinutes = 10 minút -shotPageKeepOneHour = 1 hodinu -shotPageKeepOneDay = 1 deň -shotPageKeepOneWeek = 1 týždeň -shotPageKeepTwoWeeks = 2 týždne -shotPageKeepOneMonth = 1 mesiac -shotPageSaveExpiration = uložiť -shotPageCancelExpiration = zrušiť -shotPageDoesNotExpire = bez obmedzenej platnosti -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = platnosť vyprší -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = platnosť vypršala -timeDiffJustNow = práve teraz -timeDiffMinutesAgo = - { $number -> - [one] pred 1 minútou - [few] pred { $number } minútami - *[other] pred { $number } minútami - } -timeDiffHoursAgo = - { $number -> - [one] pred hodinou - [few] pred { $number } hodinami - *[other] pred { $number } hodinami - } -timeDiffDaysAgo = - { $number -> - [one] včera - [few] pred { $number } dňami - *[other] pred { $number } dňami - } -timeDiffFutureSeconds = o pár sekúnd -timeDiffFutureMinutes = - { $number -> - [one] o minútu - [few] o { $number } minúty - *[other] o { $number } minút - } -timeDiffFutureHours = - { $number -> - [one] o hodinu - [few] o { $number } hodiny - *[other] o { $number } hodín - } -timeDiffFutureDays = - { $number -> - [one] zajtra - [few] o { $number } dni - *[other] o { $number } dní - } -errorThirdPartyCookiesEnabled = Ak ste túto snímku vytvorili, no nemôžete ju odstrániť, dočasne povoľte v možnostiach svojho prehliadača používanie cookies tretích strán. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Novinka! -promoMessage = Aktualizované nástroje na upravovanie vám umožňujú orezať snímku, zvýrazniť ju a dokonca do nej pridať text. -promoLink = Vyskúšajte ich -promoCloseButton = - .title = Zavrieť upozornenie - -## Annotations - -annotationPenButton = - .title = Pero -annotationHighlighterButton = - .title = Zvýrazňovač -annotationUndoButton = - .title = Späť -annotationRedoButton = - .title = Znova -annotationTextButton = - .title = Pridať text -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Odstrániť zmeny -annotationCropButton = - .title = Orezať -annotationSaveEditButton = Uložiť - .title = Uložiť úpravu -annotationCancelEditButton = Zrušiť - .title = Zrušiť úpravu -annotationCropConfirmButton = Potvrdiť - .title = Potvrdiť výber -annotationCropCancelButton = Zrušiť - .title = Zrušiť výber -annotationColorWhite = - .title = Biela -annotationColorBlack = - .title = Čierna -annotationColorRed = - .title = Červená -annotationColorGreen = - .title = Zelená -annotationColorBlue = - .title = Modrá -annotationColorYellow = - .title = Žltá -annotationColorPurple = - .title = Fialová -annotationColorSeaGreen = - .title = Morská zelená -annotationColorGrey = - .title = Sivá -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Veľkosť textu -# Values shown in text size selection dropdown -textSizeSmall = Malá -textSizeMedium = Stredná -textSizeLarge = Veľká -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Potvrdiť - .title = Potvrdiť -textToolCancelButton = Zrušiť - .title = Zrušiť -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Ahoj - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Niečo sa pokazilo -copyImageErrorMessage = Snímku nebolo možné skopírovať. - -## Settings Page - -settingsDisconnectButton = Odpojiť sa - .title = Odpojiť sa -settingsGuestAccountMessage = Účet hosťa -settingsSignInButton = Prihlásiť sa - .title = Prihlásiť sa -SettingsPageHeader = Nastavenia Firefox Screenshots -settingsFirefoxAccountSubHeader = Účet Firefox -settingsClosePreferences = - .title = Zavrieť nastavenia -settingsFxaDisconnectAlertMessage = Naozaj chcete toto zariadenie odpojiť od svojho účtu Firefox? -settingsFxaDisconnectDescription = Ak sa odhlásite, pre opätovný prístup ku svojim snímkam sa budete musieť opäť prihlásiť. -settingsFxaConnectDescription = Pre prístup ku vašim snímkam z ktoréhokoľvek zariadenia sa stačí prihlásiť. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Pri odstraňovaní snímky nastala chyba: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Moje snímky: vyhľadávanie { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Pri zobrazovaní stránky nastala chyba: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Hľadať medzi snímkami -shotIndexPageNoShotsMessage = Žiadne uložené snímky. -shotIndexPageNoShotsInvitation = Nebojte sa ich pár vytvoriť. -shotIndexPageLookingForShots = Vyhľadávanie vašich snímkov... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Nenašli sme žiadnu snímku, ktorá by bola zhodná s vaším výrazom vyhľadávania. -shotIndexPageMyShotsButton = - .title = Moje snímky -shotIndexPageClearSearchButton = - .title = Vyčistiť vyhľadávacie pole -shotIndexPageConfirmShotDelete = Odstrániť túto snímku? -shotIndexPagePreviousPage = - .title = Predchádzajúca stránka -shotIndexPageNextPage = - .title = Nasledujúca stránka -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Táto snímka nebola označená ako obľúbená a jej platnosť vyprší -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Táto snímka bola označená ako obľúbená a jej platnosť nevyprší -shotIndexSyncedShot = - .title = Snímka vytvorená na inom zariadení -shotIndexAlertErrorFavoriteShot = Pri aktualizácii stavu obľúbenej snímky došlo k chybe - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Naozaj chcete odstrániť túto snímku? -shotDeleteCancel = Zrušiť - .title = Zrušiť -shotDeleteConfirm = Odstrániť - .title = Odstrániť - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Pre exportovanie kliknite na Súbor > Uložiť stránku ako… a potom nájdite svoje snímky v priečinku { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metriky Firefox Screenshots -metricsPageTotalsQueryTitle = Celkom -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Prehľad služby Screenshots -metricsPageTotalsQueryDevices = Celkový počet zaregistrovaných zariadení -metricsPageTotalsQueryActiveShots = Aktívne snímky -metricsPageTotalsQueryExpiredShots = Platnosť vypršala (obnoviteľné) -metricsPageTotalsQueryExpiredDeletedShots = Platnosť vypršala (odstránené) -metricsPageShotsQueryTitle = Snímky podľa dní -metricsPageShotsQueryDescription = Počet snímok vytvorených každý deň (za posledných 30 dní) -metricsPageShotsQueryCount = Počet snímok -metricsPageShotsQueryDay = Deň -metricsPageUsersQueryTitle = Počet používateľov podľa dní -metricsPageUsersQueryDescription = Počet používateľov, ktorí vytvorili aspoň jednu snímku, podľa dní (za posledných 30 dní) -metricsPageUsersQueryCount = Počet používateľov -metricsPageUsersQueryDay = Deň -metricsPageUserShotsQueryTitle = Počet snímok na používateľa -metricsPageUserShotsQueryDescription = Počet používateľov, ktorí majú celkovo okolo N snímok -metricsPageUserShotsQueryCount = Počet používateľov -metricsPageUserShotsQueryShots = Približný počet aktívnych snímok (ktorým nevypršala platnosť) -metricsPageRetentionQueryTitle = Miera stáleho používania podľa týždňov -metricsPageRetentionQueryDescription = Počet dní od používateľovej prvej snímky po jeho poslednú snímku, zoskupené podľa počiatočného týždňa -metricsPageRetentionQueryUsers = Počet používateľov -metricsPageRetentionQueryDays = Počet dní od používateľovej prvej snímky po poslednú snímku -metricsPageRetentionQueryFirstWeek = Týždeň, v ktorom používateľ vytvoril prvú snímku -metricsPageTotalRetentionQueryTitle = Celková miera stáleho používania -metricsPageTotalRetentionQueryDescription = Doba, po ktorú používateľ vytváral snímky (zoskupené podľa týždňov) -metricsPageTotalRetentionQueryUsers = Počet používateľov -metricsPageTotalRetentionQueryDays = Počet dní, kedy používateľ vytváral snímky -metricsPageVersionQueryTitle = Verzia doplnku -metricsPageVersionQueryDescription = Verzia doplnku používaná pri prihlásení v posledných 14 dňoch -metricsPageVersionQueryUsers = Počet prihlásení používateľov -metricsPageVersionQueryVersion = Verzia doplnku -metricsPageVersionQueryLastSeen = Deň -metricsPageHeader = Metriky -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Vygenerované: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (čas databázy: { $time } ms) diff --git a/locales/sl/server.ftl b/locales/sl/server.ftl deleted file mode 100644 index d3c803fc69..0000000000 --- a/locales/sl/server.ftl +++ /dev/null @@ -1,409 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Moji posnetki -gHomeLink = Domov -gNoShots = - .alt = Ni najdenih posnetkov -gScreenshotsDescriptionServerless = Poenostavljeni posnetki zaslona. Zajemajte in prenesite posnetke zaslona, ne da bi zapustili Firefox. - -## Header - -buttonSettings = - .title = Nastavitve -buttonSignIn = - .title = Prijava -screenshotsLogo = - .title = Domača stran Screenshots -bannerSignIn = Prijavite ali registrirajte se, da boste lahko svoje posnetke uporabljali na več napravah in priljubljene trajno shranili. -bannerUpsell = { gScreenshotsDescription }Prenesite Firefox zdaj -shutdownWarning = Shranjeni posnetki bodo kmalu potekli. Od junija ne bomo več ponujali spletne shrambe. Želite obdržati posnetke iz svoje knjižnice? Prenesite si jih na računalnik. -shutdownPageTitle = Screenshots se spreminja -shutdownPageDescription = Screenshots od junija naprej ne bo več ponujal spletne shrambe. Želite obdržati posnetke iz svoje knjižnice? Prenesite posnetke posamično ali v paketu. Zahvaljujemo se vam za uporabo te možnosti in se opravičujemo za morebitne nevšečnosti. -shutdownPageContinue = Upamo, da boste še naprej uporabljali Screenshots za zajem, kopiranje in prenos posnetkov. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Kaj je novega v Firefox Screenshots? -onboardingPromoMessage = Prijavite se v Screenshots s svojim Firefox Računom in naredite več: -onboardingPromoMessageListItem1 = Dostopajte do knjižnice na vseh svojih napravah -onboardingPromoMessageListItem2 = Shranite svoje najljubše posnetke za vedno -onboardingPromoDismissButton = Opusti - .title = Opusti -onboardingPromoSigninButton = Prijava - .title = Prijava - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Pogoji -footerLinkPrivacy = Obvestilo o zasebnosti -footerReportShot = Prijavi posnetek - .title = Prijavite ta posnetek kot zlorabo, neželeno vsebino ali drugo težavo -footerLinkFaqs = Pogosta vprašanja -footerLinkDMCA = Prijavi kršitev intelektualne lastnine -footerLinkDiscourse = Sporočite nam svoje mnenje -footerLinkRemoveAllData = Odstrani vse podatke - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Ustvarjam { $title } -creatingPageTitleDefault = stran -creatingPageWaitMessage = Shranjevanje posnetka … - -## Home page - -homePageDescription = - .content = Intuitivni posnetki zaslona kar v brskalniku. Med brskanjem po spletu lahko s Firefoxom ustvarite, shranite in delite posnetke zaslona. -homePageButtonMyShots = Pojdi na moje posnetke -homePageTeaser = Kmalu na voljo ... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Brezplačen prenos -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Kako Firefox Screenshots deluje -homePageGetStartedTitle = Začnite -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = V naslovni vrstici v meniju dejanj strani izberite ikono Screenshots in meni orodja se bo prikazal na vrhu okna brskalnika. -homePageCaptureRegion = Zajemite območje -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Kliknite in povlecite, da izberete območje, ki ga želite zajeti, ali pa samo kliknite in Screenshots bo izbral območje za vas. Vam je všeč, kar vidite? Izberite Shrani za dostop do vašega posnetka na spletu ali puščico navzdol za prenos na računalnik. -homePageCapturePage = Zajemite stran -homePageCapturePageDescription = Za zajem celotnih strani uporabite gumbe zgoraj desno. Gumb Shrani vidno bo zajel območje, ki je vidno brez drsenja, gumb Shrani celotno stran pa celotno vsebino strani. -homePageDownloadCopy = Prenesite ali kopirajte -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Zajemite najboljši posnetek. Screenshots vam omogoča, da svojo izbiro prenesete ali kopirate v odložišče. -homePageLegalLink = Pravno obvestilo -homePagePrivacyLink = Zasebnost -homePageTermsLink = Pogoji -homePageCookiesLink = Piškotki - -## Leave Screenshots page - -leavePageRemoveAllData = Odstrani vse podatke -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Če želite izbrisati svoj račun, morate imeti nameščen Firefox Screenshots ali biti prijavljeni v Firefox Račun -leavePageErrorGeneric = Prišlo je do napake -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = To bo trajno izbrisalo vse podatke Firefox Screenshots. -leavePageButtonProceed = Nadaljuj -leavePageButtonCancel = Prekliči -leavePageDeleted = Vsi vaši posnetki so bili izbrisani! - -## Not Found page - -notFoundPageTitle = Strani ni mogoče najti -notFoundPageIntro = Ups. -notFoundPageDescription = Strani ni mogoče najti. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Posnetek zaslona: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Napaka pri shranjevanju časa poteka -shotPageAlertErrorDeletingShot = Napaka pri brisanju posnetka -shotPageAlertErrorUpdatingTitle = Napaka pri shranjevanju naslova -shotPageConfirmDelete = Ali ste prepričani, da želite trajno izbrisati ta posnetek? -shotPageShareButton = - .title = Deli -shotPageCopyButton = - .title = Kopiraj sliko v odložišče -shotPageCopyActionLabel = Kopiraj -shotPageCopied = Kopirano -shotPageShareFacebook = - .title = Deli na Facebooku -shotPageShareTwitter = - .title = Deli na Twitterju -shotPageSharePinterest = - .title = Deli na Pinterestu -shotPageShareEmail = - .title = Deli povezavo preko e-pošte -shotPageShareLink = Pridobite povezavo do posnetka za deljenje: -shotPagePrivacyMessage = Kdorkoli s povezavo si lahko ogleda ta posnetek. -shotPageCopyImageText = - .label = Kopiraj besedilo slike -shotPageConfirmDeletion = Ali ste prepričani, da želite trajno izbrisati ta posnetek? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Če ne storite ničesar, bo ta posnetek trajno izbrisan . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = obnovi do { $date } -shotPageExpiredMessage = Ta posnetek je pretekel -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = To je stran, na kateri je bil narejen posnetek: -shotPageDeleteButton = - .title = Izbriši ta posnetek -shotPageDownloadShot = - .title = Prenesi -shotPageEditButton = - .title = Uredi to sliko -shotPagefavoriteButton = - .title = Dodaj posnetek med priljubljene -shotPageBackToHomeButton = - .title = Domača stran -shotPageAllShotsButton = - .title = Vsi posnetki -shotPageScreenshotsDescriptionServerless = Poenostavljeni posnetki zaslona. Zajemajte in prenesite posnetke zaslona, ne da bi zapustili Firefox. -shotPageDMCAMessage = Ta posnetek ni več na voljo zaradi zahtev intelektualne lastnine tretje osebe. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Za več informacij pošljite e-pošto na { $dmca } -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Če bodo vaši posnetki predmet več pritožb, vam bomo morda onemogočili dostop do storitve Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Vključite spletni naslov tega posnetka v e-poštno sporočilo: { $url } -shotPageKeepFor = Kako dolgo želite ohraniti ta posnetek? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Izberite čas -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Neskončno ∞ -shotPageKeepTenMinutes = 10 minut -shotPageKeepOneHour = 1 uro -shotPageKeepOneDay = 1 dan -shotPageKeepOneWeek = 1 teden -shotPageKeepTwoWeeks = 2 tedna -shotPageKeepOneMonth = 1 mesec -shotPageSaveExpiration = shrani -shotPageCancelExpiration = prekliči -shotPageDoesNotExpire = ne poteče -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = poteče -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = poteklo -timeDiffJustNow = zdaj -timeDiffMinutesAgo = - { $number -> - [one] pred { $number } minuto - [two] pred { $number } minutama - [few] pred { $number } minutami - *[other] pred { $number } minutami - } -timeDiffHoursAgo = - { $number -> - [one] pred { $number } uro - [two] pred { $number } urama - [few] pred { $number } urami - *[other] pred { $number } urami - } -timeDiffDaysAgo = - { $number -> - [one] pred { $number } dnevom - [two] pred { $number } dnevoma - [few] pred { $number } dnevi - *[other] pred { $number } dnevi - } -timeDiffFutureSeconds = čez nekaj sekund -timeDiffFutureMinutes = - { $number -> - [one] čez { $number } minuto - [two] čez { $number } minuti - [few] čez { $number } minute - *[other] čez { $number } minut - } -timeDiffFutureHours = - { $number -> - [one] čez { $number } uro - [two] čez { $number } uri - [few] čez { $number } ure - *[other] čez { $number } ur - } -timeDiffFutureDays = - { $number -> - [one] čez { $number } dan - [two] čez { $number } dni - [few] čez { $number } dni - *[other] čez { $number } dni - } -errorThirdPartyCookiesEnabled = Če ste ta posnetek zaslona zajeli vi in ga ne morete izbrisati, morate morda v nastavitvah brskalnika začasno omogočiti piškotke tretjih strani. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Novo! -promoMessage = Posodobljena orodja za urejanje vam omogočajo posnetek obrezati, označiti in celo opremiti z besedilom. -promoLink = Preskusite jih -promoCloseButton = - .title = Zapri obvestilo - -## Annotations - -annotationPenButton = - .title = Pero -annotationHighlighterButton = - .title = Označevalnik -annotationUndoButton = - .title = Razveljavi -annotationRedoButton = - .title = Uveljavi -annotationTextButton = - .title = Dodaj besedilo -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Počisti -annotationCropButton = - .title = Obreži -annotationSaveEditButton = Shrani - .title = Shrani spremembe -annotationCancelEditButton = Prekliči - .title = Prekliči urejanje -annotationCropConfirmButton = Potrdi - .title = Potrdi izbor -annotationCropCancelButton = Prekliči - .title = Prekliči izbor -annotationColorWhite = - .title = Bela -annotationColorBlack = - .title = Črna -annotationColorRed = - .title = Rdeča -annotationColorGreen = - .title = Zelena -annotationColorBlue = - .title = Modra -annotationColorYellow = - .title = Rumena -annotationColorPurple = - .title = Vijolična -annotationColorSeaGreen = - .title = Morsko zelena -annotationColorGrey = - .title = Siva -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Velikost besedila -# Values shown in text size selection dropdown -textSizeSmall = Majhna -textSizeMedium = Srednja -textSizeLarge = Velika -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Potrdi - .title = Potrdi -textToolCancelButton = Prekliči - .title = Prekliči -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Zdravo - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Prišlo je do napake -copyImageErrorMessage = Posnetka ni bilo mogoče kopirati v odložišče. - -## Settings Page - -settingsDisconnectButton = Prekini povezavo - .title = Prekini povezavo -settingsGuestAccountMessage = Račun za goste -settingsSignInButton = Prijava - .title = Prijava -SettingsPageHeader = Nastavitve za Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox Račun -settingsClosePreferences = - .title = Zapri nastavitve -settingsFxaDisconnectAlertMessage = Ali ste prepričani, da želite odklopiti to napravo od svojega Firefox Računa? -settingsFxaDisconnectDescription = Če se odjavite, se boste morali za ponovni dostop do posnetkov zaslona znova prijaviti. -settingsFxaConnectDescription = Če se prijavite, lahko svoje posnetke zaslona spremljate na različnih napravah. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Napaka pri brisanju posnetka: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Moji posnetki: išči { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Napaka pri izrisovanju strani: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Iskanje mojih posnetkov -shotIndexPageNoShotsMessage = Ni shranjenih posnetkov. -shotIndexPageNoShotsInvitation = Kar pogumno, zajemite jih nekaj. -shotIndexPageLookingForShots = Iskanje vaših posnetkov … -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Ne najdemo posnetkov, ki ustrezajo vašemu iskanju. -shotIndexPageMyShotsButton = - .title = Moji posnetki -shotIndexPageClearSearchButton = - .title = Počisti iskanje -shotIndexPageConfirmShotDelete = Izbrišem ta posnetek? -shotIndexPagePreviousPage = - .title = Prejšnja stran -shotIndexPageNextPage = - .title = Naslednja stran -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Ta posnetek ni med priljubljenimi in bo pretekel -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Ta posnetek je med priljubljenimi in ne preteče -shotIndexSyncedShot = - .title = Posnetek zajet na drugi napravi -shotIndexAlertErrorFavoriteShot = Napaka pri posodabljanju statusa priljubljenega posnetka - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Ste prepričani, da želite izbrisati ta posnetek? -shotDeleteCancel = Prekliči - .title = Prekliči -shotDeleteConfirm = Izbriši - .title = Izbriši - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Za izvoz v meniju Datoteka kliknite Shrani stran kot ... in vaši posnetki zaslona se bodo shranili v mapo { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Metrika Firefox Screenshots -metricsPageTotalsQueryTitle = Skupaj -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Pregled posnetkov zaslona -metricsPageTotalsQueryDevices = Skupno število registriranih naprav -metricsPageTotalsQueryActiveShots = Aktivni posnetki -metricsPageTotalsQueryExpiredShots = Pretečen (a obnovljiv) -metricsPageTotalsQueryExpiredDeletedShots = Pretečen (in izbrisan) -metricsPageShotsQueryTitle = Posnetki po dnevih -metricsPageShotsQueryDescription = Število posnetkov, ustvarjenih vsak dan (za zadnjih 30 dni) -metricsPageShotsQueryCount = Število posnetkov -metricsPageShotsQueryDay = Dan -metricsPageUsersQueryTitle = Uporabnikov na dan -metricsPageUsersQueryDescription = Število uporabnikov, ki so ustvarili vsaj en posnetek, po dnevih (zadnjih 30 dni) -metricsPageUsersQueryCount = Število uporabnikov -metricsPageUsersQueryDay = Dan -metricsPageUserShotsQueryTitle = Število posnetkov na uporabnika -metricsPageUserShotsQueryDescription = Število uporabnikov, ki imajo približno N skupnih posnetkov -metricsPageUserShotsQueryCount = Število uporabnikov -metricsPageUserShotsQueryShots = Približno število aktivnih (nepretečenih) posnetkov -metricsPageRetentionQueryTitle = Ohranitve po tednih -metricsPageRetentionQueryDescription = Št. dni od uporabnikovega prvega posnetka do najnovejšega, združeno po začetnem tednu -metricsPageRetentionQueryUsers = Število uporabnikov -metricsPageRetentionQueryDays = Dni od uporabnikovega prvega posnetka do najnovejšega -metricsPageRetentionQueryFirstWeek = Teden, ko je uporabnik ustvaril prvi posnetek -metricsPageTotalRetentionQueryTitle = Skupaj ohranitev -metricsPageTotalRetentionQueryDescription = Čas, v katerem so uporabniki ustvarjali posnetke, združen po tednih -metricsPageTotalRetentionQueryUsers = Število uporabnikov -metricsPageTotalRetentionQueryDays = Dnevi, ko je uporabnik ustvarjal posnetke -metricsPageVersionQueryTitle = Različica dodatka -metricsPageVersionQueryDescription = Različica dodatka, uporabljena med prijavo v zadnjih 14 dneh -metricsPageVersionQueryUsers = Število prijavljenih uporabnikov -metricsPageVersionQueryVersion = Različica dodatka -metricsPageVersionQueryLastSeen = Dan -metricsPageHeader = Metrika -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Ustvarjeno: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (čas pod. zbirke: { $time } ms) diff --git a/locales/son/server.ftl b/locales/son/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/son/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/sq/server.ftl b/locales/sq/server.ftl deleted file mode 100644 index 3ebd8fad3c..0000000000 --- a/locales/sq/server.ftl +++ /dev/null @@ -1,396 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Shkrepjet e Mia -gHomeLink = Kreu -gNoShots = - .alt = S’u gjetën shkrepje -gScreenshotsDescriptionServerless = Foto të kollajshme ekrani. Bëni dhe shkarkoni foto ekrani pa dalë nga Firefox-i. - -## Header - -buttonSettings = - .title = Rregullime -buttonSignIn = - .title = Hyni -screenshotsLogo = - .title = Kreu i Screenshots -bannerSignIn = Hyni ose regjistrohuni, që të përdorni shkrepjet tuaj nëpër pajisje dhe t’i ruani të parapëlqyerat tuaja përgjithmonë. -bannerUpsell = { gScreenshotsDescription } Merreni Firefox-in që tani -shutdownWarning = Fotot e ruajtura të ekranit skadojnë së shpejti. Duke filluar nga qershori, Fotot e Ekranit nuk do të ofrojnë më hapësirë depozitimi në internet. Doni të mbani foto nga fototeka juaj? Shkarkojini ato te kompjuteri juaj. -shutdownPageTitle = Fotot e ekranit po ndryshojnë -shutdownPageDescription = Duke filluar nga qershori, Fotot e Ekranit s’do të ofrojnë më depozitim në internet. Doni të mbani foto nga fototeka juaj? Shkarkojini foto një nga një ose në grup. Faleminderit që e përdorët këtë veçori, dhe na ndjeni për çfarëdo sikleti që mund të sjellë. -shutdownPageContinue = Shpresojmë se do të vazhdoni të përdorni Foto Ekrani, për të bërë, kopjuar dhe shkarkuar foto. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Ç’ka të re te Firefox Screenshots? -onboardingPromoMessage = Pas kësaj, hyni te Screenshots me një Llogari Firefox dhe bëni më tepër gjëra: -onboardingPromoMessageListItem1 = Hyni në librarinë tuaj që nga krejt pajisjet tuaja -onboardingPromoMessageListItem2 = Depozitojini përgjithmonë shkrepjet tuaj të parapëlqyera -onboardingPromoDismissButton = Hidhe tej - .title = Hidheni tej -onboardingPromoSigninButton = Hyni - .title = Hyni - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Kushte -footerLinkPrivacy = Shënim Mbi Privatësinë -footerReportShot = Njoftoni rreth Shkrepjes - .title = Njoftoni rreth kësaj shkrepjeje për abuzim, mesazh të padëshiruar, ose për probleme të tjera -footerLinkFaqs = FAQ -footerLinkDMCA = Njoftoni Cenim IP-je -footerLinkDiscourse = Jepni Përshtypjet -footerLinkRemoveAllData = Hiqi Krejt të Dhënat - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Krijim i { $title } -creatingPageTitleDefault = faqe -creatingPageWaitMessage = Po ruhet shkrepja juaj… - -## Home page - -homePageDescription = - .content = Foto intuitive ekrani drejt e nga shfletuesi. Bëni, ruani dhe ndani foto ekrani me të tjerët teksa shfletoni në Foto intuitive ekrani drejt e nga shfletuesi. Bëni, ruani dhe ndani foto ekrani me të tjerët teksa shfletoni në Foto intuitive ekrani drejt e nga shfletuesi. Bëni, ruani dhe ndani foto ekrani me të tjerët përmes përdorimit të Firefox-it, teksa shfletoni në Web. -homePageButtonMyShots = Shko te Shkrepjet e Mia -homePageTeaser = Së Afërmi… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Shkarkim Falas -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Si Funksionon Firefox Screenshots -homePageGetStartedTitle = Fillojani -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Përzgjidhni ikonën Shkrepje, prej menusë së veprimeve mbi faqe, te shtylla e adresave, dhe menuja Shkrepje do të shfaqet në krye të dritares së shfletuesit tuaj. -homePageCaptureRegion = Fotografoni një Zonë -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klikoni dhe tërhiqeni që të përzgjidhni fushën që doni të fotografohet. Ose thjesht kaloni kursorin dhe klikoni — Screenshots do të bëjë përzgjedhjen për ju. Ju pëlqen çka shihni? Përzgjidhni Ruaje që ta përdorni foton tuaj online ose butonin shigjetë për poshtë që ta shkarkoni në kompjuterin tuaj. -homePageCapturePage = Fotografoni një Faqe -homePageCapturePageDescription = Përdorni butonat në cepin e sipërm djathtas që të fotografoni faqe të plota. Përmes butonit Ruaj Sa Duket do të fotografohet fusha që mund të shihni pa bërë rrëshqitje në faqe, dhe Ruaj Faqen e Plotë do të fotografojë gjithçka në faqe. -homePageDownloadCopy = Shkarkojeni ose Kopjojeni -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Bëni foton tuaj më të bukur. Fotot e Ekranit ju lejojnë të shkarkoni ose kopjoni përzgjedhjen tuaj drejt e në të papastër. -homePageLegalLink = Ligjore -homePagePrivacyLink = Privatësi -homePageTermsLink = Kushte -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = Hiqni Krejt të Dhënat -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Që të fshini llogarinë tuaj, duhet të keni Firefox Screenshots të instaluar ose të keni bërë hyrjen në Llogarinë Firefox -leavePageErrorGeneric = Ndodhi një gabim -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Kështu do të fshihen përgjithmonë krejt të dhënat tuaja për Firefox Screenshots. -leavePageButtonProceed = Vazhdo -leavePageButtonCancel = Anuloje -leavePageDeleted = U fshinë krejt fotot tuaja të ekranit! - -## Not Found page - -notFoundPageTitle = Nuk u Gjet Faqe -notFoundPageIntro = Hëm. -notFoundPageDescription = S’u gjet faqe. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Foto ekrani: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Gabim në ruajtjen e skadimit -shotPageAlertErrorDeletingShot = Gabim në fshirjen e fotos -shotPageAlertErrorUpdatingTitle = Gabim në ruajtjen e titullit -shotPageConfirmDelete = Jeni i sigurt se doni të fshihet përgjithnjë kjo foto? -shotPageShareButton = - .title = Ndajeni me të tjerë -shotPageCopyButton = - .title = Kopjoje figurën në të papastër -shotPageCopyActionLabel = Kopjoje -shotPageCopied = U kopjua -shotPageShareFacebook = - .title = Ndajeni në Facebook -shotPageShareTwitter = - .title = Ndajeni në Twitter -shotPageSharePinterest = - .title = Ndajeni në Pinterest -shotPageShareEmail = - .title = Ndajeni lidhjen me email -shotPageShareLink = Merrni një lidhje për te kjo foto: -shotPagePrivacyMessage = Cilido që ka lidhjen mund të shohë këtë foto. -shotPageCopyImageText = - .label = Kopjo tekstin e figurës -shotPageConfirmDeletion = Jeni i sigurt se doni të fshihet përgjithmonë kjo foto? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Po nuk bëtë ndonjë veprim, kjo foto do të fshihet përgjithmonë më . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = riktheje deri më { $date } -shotPageExpiredMessage = Kjo foto ka skaduar. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Ja faqja prej të cilës qe krijuar fillimisht: -shotPageDeleteButton = - .title = Fshije këtë foto -shotPageDownloadShot = - .title = Shkarkoje -shotPageEditButton = - .title = Përpunoni këtë figurë -shotPagefavoriteButton = - .title = Bëje këtë shkrepje të parapëlqyer -shotPageBackToHomeButton = - .title = Kreu -shotPageAllShotsButton = - .title = Krejt Shkrepjet -shotPageScreenshotsDescriptionServerless = Foto të kollajshme ekrani. Bëni dhe shkarkoni foto ekrani pa dalë nga Firefox-i. -shotPageDMCAMessage = Kjo foto s’mund të kihet më, për shkak pretendimesh pronësie intelektuale nga palë e tretë. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Që të kërkoni informacione të mëtejshme, ju lutemi, dërgoni një email te { $dmca }. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Nëse fotot tuaja janë subjekt pretendimesh të shumta, mund të shfuqizojmë hyrjen tuaj te Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Ju lutemi, përfshijeni URL-në e kësaj fotoje te email-i juaj: { $url } -shotPageKeepFor = Për sa kohë duhet mbajtur kjo foto? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Përzgjidhni kohë -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Pambarimisht ∞ -shotPageKeepTenMinutes = 10 Minuta -shotPageKeepOneHour = 1 Orë -shotPageKeepOneDay = 1 Ditë -shotPageKeepOneWeek = 1 Javë -shotPageKeepTwoWeeks = 2 Javë -shotPageKeepOneMonth = 1 Muaj -shotPageSaveExpiration = ruaje -shotPageCancelExpiration = anuloje -shotPageDoesNotExpire = nuk skadon -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = skadon më -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = ka skaduar më -timeDiffJustNow = mu tani -timeDiffMinutesAgo = - { $number -> - [one] 1 minutë më parë - *[other] { $number } minuta më parë - } -timeDiffHoursAgo = - { $number -> - [one] 1 orë më parë - *[other] { $number } orë më parë - } -timeDiffDaysAgo = - { $number -> - [one] dje - *[other] { $number } ditë më parë - } -timeDiffFutureSeconds = në pak sekonda -timeDiffFutureMinutes = - { $number -> - [one] në 1 minutë - *[other] në { $number } minuta - } -timeDiffFutureHours = - { $number -> - [one] në 1 orë - *[other] në { $number } orë - } -timeDiffFutureDays = - { $number -> - *[one] nesër - } -errorThirdPartyCookiesEnabled = Nëse bëtë këtë foto dhe s’e fshini dot, mund t’ju duhet të aktivizoni përkohësisht cookie prej palësh të treta, që nga parapëlqimet tuaja për shfletuesin. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Mbani Shënim! -promoMessage = Mjetet e përditësuara të përpunimit ju lejojnë të qethni, theksoni, dhe madje të shtoni tekst te shkrepjet tuaja. -promoLink = Provojini -promoCloseButton = - .title = Mbylle njoftimin - -## Annotations - -annotationPenButton = - .title = Penë -annotationHighlighterButton = - .title = Theksues -annotationUndoButton = - .title = Zhbëje -annotationRedoButton = - .title = Ribëje -annotationTextButton = - .title = Shtoni tekst -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Pastroje -annotationCropButton = - .title = Qethe -annotationSaveEditButton = Ruaje - .title = Ruajeni përpunimin -annotationCancelEditButton = Anuloje - .title = Anulojeni përpunimin -annotationCropConfirmButton = Ripohojeni - .title = Ripohoni përzgjedhjen -annotationCropCancelButton = Anuloje - .title = Anulojeni përzgjedhjen -annotationColorWhite = - .title = E bardhë -annotationColorBlack = - .title = E zezë -annotationColorRed = - .title = E kuqe -annotationColorGreen = - .title = E gjelbër -annotationColorBlue = - .title = Blu -annotationColorYellow = - .title = E verdhë -annotationColorPurple = - .title = E purpur -annotationColorSeaGreen = - .title = Blu e gjelbër -annotationColorGrey = - .title = Gri -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Madhësi teksti -# Values shown in text size selection dropdown -textSizeSmall = Të vogla -textSizeMedium = Mesatare -textSizeLarge = Të mëdha -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Ripohojeni - .title = Ripohojeni -textToolCancelButton = Anuloje - .title = Anuloje -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Tungjatjeta - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Diç shkoi ters -copyImageErrorMessage = S’u arrit të kopjohej në të papastër shkrepja juaj. - -## Settings Page - -settingsDisconnectButton = Shkëputu - .title = Shkëputu -settingsGuestAccountMessage = Llogari vizitori -settingsSignInButton = Hyni - .title = Hyni -SettingsPageHeader = Rregullime për Firefox Screenshots -settingsFirefoxAccountSubHeader = Llogari Firefox -settingsClosePreferences = - .title = Mbylli parapëlqimet -settingsFxaDisconnectAlertMessage = Jeni i sigurt se doni të shkëputet kjo pajisje nga llogaria juaj Firefox? -settingsFxaDisconnectDescription = Nëse bëni daljen, do t’ju duhet të ribëni hyrjen që të rifitoni kontrollin mbi shkrepjet tuaja. -settingsFxaConnectDescription = Mund të bëni hyrjen që të përdorni shkrepjet në pajisje të ndryshme. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Gabim në fshirjen e fotos: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Fotot e Mia: kërkoni për { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Gabim në vizatimin e faqes: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Kërko te fotot e mia -shotIndexPageNoShotsMessage = S’ka foto të ruajtura. -shotIndexPageNoShotsInvitation = Jepini, krijoni ndonjë. -shotIndexPageLookingForShots = Po shihet për foto tuajat… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = S’gjejmë dot ndonjë foto që përputhet me kërkimet tuaja. -shotIndexPageMyShotsButton = - .title = Shkrepjet e Mia -shotIndexPageClearSearchButton = - .title = Pastroje kërkimin -shotIndexPageConfirmShotDelete = Të fshihet kjo foto? -shotIndexPagePreviousPage = - .title = Faqja e mëparshme -shotIndexPageNextPage = - .title = Faqja pasuese -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Kjo s’është një shkrepje nga të parapëlqyerat dhe do të skadojë -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Kjo është një foto e parapëlqyer dhe nuk skadon -shotIndexSyncedShot = - .title = Shkrepje e bërë në pajisje tjetër -shotIndexAlertErrorFavoriteShot = Gabim në përditësimin e gjendje së shkrepjes së parapëlqyer - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Jeni i sigurt se doni të fshihet kjo foto? -shotDeleteCancel = Anuloje - .title = Anuloje -shotDeleteConfirm = Fshije - .title = Fshije - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Për eksportim: përdorni Kartelë > Ruajeni Faqen Si… dhe do t’i gjeni fotot tuaja të ekrani te dosja { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Statistika nga Firefox Screenshots -metricsPageTotalsQueryTitle = Gjithsej -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Një përmbledhje mbi Screenshots -metricsPageTotalsQueryDevices = Pajisje të regjistruara gjithsej -metricsPageTotalsQueryActiveShots = Foto aktive -metricsPageTotalsQueryExpiredShots = Të skaduara (por të rikthyeshme) -metricsPageTotalsQueryExpiredDeletedShots = Të skaduara (dhe të fshira) -metricsPageShotsQueryTitle = Foto sipas Ditësh -metricsPageShotsQueryDescription = Numër fotosh krijuar çdo ditë (për 30 ditët e fundit) -metricsPageShotsQueryCount = Numër fotosh -metricsPageShotsQueryDay = Ditë -metricsPageUsersQueryTitle = Përdorues sipas Ditësh -metricsPageUsersQueryDescription = Numër përdoruesish që kanë krijuar të paktën një foto, sipas ditësh (30 ditët e fundit) -metricsPageUsersQueryCount = Numër përdoruesish -metricsPageUsersQueryDay = Ditë -metricsPageUserShotsQueryTitle = Numër Fotosh për Përdorues -metricsPageUserShotsQueryDescription = Numri i përdoruesve që kanë të paktën N foto gjithsej -metricsPageUserShotsQueryCount = Numër përdoruesish -metricsPageUserShotsQueryShots = Numër afërsisht i fotove aktive (jo të skaduara) -metricsPageRetentionQueryTitle = Mbajtje sipas Javësh -metricsPageRetentionQueryDescription = Numër ditësh nga fotoja e parë e përdoruesit te ajo më e reja, grupuar sipas javës së fillimit -metricsPageRetentionQueryUsers = Numër përdouesish -metricsPageRetentionQueryDays = Ditë që nga fotoja e parë e përdoruesit te më e reja -metricsPageRetentionQueryFirstWeek = Java kur përdoruesi krijoi së pari një foto -metricsPageTotalRetentionQueryTitle = Mbajtje Gjithsej -metricsPageTotalRetentionQueryDescription = Madhësi e kohës gjatë së cilës përdoruesit kanë bërë foto, grupuar sipas javësh -metricsPageTotalRetentionQueryUsers = Numër përdoruesish -metricsPageTotalRetentionQueryDays = Ditë kur përdoruesi ka krijuar foto -metricsPageVersionQueryTitle = Version Shtese -metricsPageVersionQueryDescription = Versioni i shtesës së përdorur në kohën e hyrjes, për 14 ditët e fundit -metricsPageVersionQueryUsers = Numër përdorues të futur në llogaritë e tyre -metricsPageVersionQueryVersion = Version shtese -metricsPageVersionQueryLastSeen = Ditë -metricsPageHeader = Statistika -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Prodhuar më: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (kohë baze të dhënash: { $time }ms) diff --git a/locales/sr/server.ftl b/locales/sr/server.ftl deleted file mode 100644 index c4e2a2de6e..0000000000 --- a/locales/sr/server.ftl +++ /dev/null @@ -1,384 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Моји снимци -gHomeLink = Почетна -gNoShots = - .alt = Нема пронађених снимака -gScreenshotsDescription = Веома једноставни снимци екрана. Начините, сачувајте и делите ваше снимке екрана без напуштања Firefox-а. -gSettings = Поставке -gSignIn = Пријавите се - -## Header - -buttonSettings = - .title = Поставке -buttonSignIn = - .title = Пријави се -screenshotsLogo = - .title = Почетна снимака екрана -bannerMessage = Пријавите се или се региструјте да приступите вашим снимцима путем разних уређаја и да сачувате ваше омиљене заувек. - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Услови -footerLinkPrivacy = Обавештење о приватности -footerReportShot = Пријави снимак - .title = Пријави овај снимак због насиља, непожељног садржаја или других проблема. -footerLinkFaqs = ЧПП -footerLinkDMCA = Пријави кршење интелектуалне својине -footerLinkDiscourse = Пошаљите повратне податке -footerLinkRemoveAllData = Уклони све податке - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Правим снимак странице { $title } -creatingPageTitleDefault = страница -creatingPageWaitMessage = Чувам ваш снимак… - -## Home page - -homePageDescription = - .content = Интиутивни снимци екрана уграђени у прегледач. Начините, сачувајте и делите снимке екрана док прегледате веб преко Firefox-а. -homePageButtonMyShots = Иди на моје снимке -homePageTeaser = Доступно ускоро… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Бесплатно преузимање -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Како Firefox Screenshots ради -homePageGetStartedTitle = Почните са коришћењем -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescription = Нађите нову иконицу Screenshots-а међу вашим алатима. Изаберите је и мени снимака екрана ће се појавити у врху прозора вашег прегледача. -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Изаберите иконицу снимака екрана из менија странице у адресној траци и мени снимака екрана ће се појавити на врху прозора вашег прегледача. -homePageCaptureRegion = Ухватите део странице -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Кликните и повуците да бисте изабрали део странице који желите да сачувате. Или само померите миш на жељени део и кликните, Screenshots ће изабрати део за вас. Свиђа вам се то што видите? Изаберите „Сачувај“ да бисте приступили свом снимку екрана на мрежи или притисните стрелицу надоле да бисте га сачували на свој рачунар. -homePageCapturePage = Ухватите целу страницу -homePageCapturePageDescription = Користите дугмад у горњем десном да бисте сачували целе странице. Дугме „Сачувај видљиво“ ће ухватити део који можете видети без клизања а дугме „Сачувај целу страницу“ ће ухватити све на страници. -homePageSaveShare = Сачувај и подели -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageSaveShareDescription = Када ухватите снимак, Firefox складишти ваш снимак екрана у вашу мрежну библиотеку снимака екрана и копира везу у вашу оставу. Аутоматски чувамо снимак екрана две недеље али можете обрисати снимке у било ком тренутку или променити време истека да бисте их задржали дуже у библиотеци. -homePageLegalLink = Правни подаци -homePagePrivacyLink = Приватност -homePageTermsLink = Услови -homePageCookiesLink = Колачићи - -## Leave Screenshots page - -leavePageRemoveAllData = Уклони све податке -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAddonRequired = Морате имати инсталиран Firefox Screenshots да бисте обрисали ваш налог -leavePageErrorGeneric = Догодила се грешка -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Ово ће трајно обрисати све ваше Firefox Screenshots податке. -leavePageButtonProceed = Настави -leavePageButtonCancel = Откажи -leavePageDeleted = Сви ваши снимци екрана су обрисани! - -## Not Found page - -notFoundPageTitle = Страница није нађена -notFoundPageIntro = Упс. -notFoundPageDescription = Страница није нађена. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Снимак екрана: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Грешка при чувању времена истека -shotPageAlertErrorDeletingShot = Грешка при брисању снимка -shotPageAlertErrorUpdatingTitle = Грешка при чувању наслова -shotPageConfirmDelete = Да ли сте сигурни да желите обрисати овај снимак трајно? -shotPageShareButton = - .title = Подели -shotPageCopy = Копирај -shotPageCopied = Копирано -shotPageShareFacebook = - .title = Подели на Facebook-у -shotPageShareTwitter = - .title = Подели на Twitter-у -shotPageSharePinterest = - .title = Подели на Pinterest-у -shotPageShareEmail = - .title = Подели везу преко имејла -shotPageShareLink = Добави везу за дељење овог снимка: -shotPagePrivacyMessage = Било ко са везом може видети овај снимак. -shotPageCopyImageText = - .label = Копирај текст слике -shotPageConfirmDeletion = Да ли сте сигурни да желите обрисати овај снимак трајно? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Ако не предузмете било шта, снимак ће бити обрисан . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = обнови до { $date } -shotPageExpiredMessage = Овај снимак је истекао. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Ово је страница из које је изворно настао: -shotPageDeleteButton = - .title = Обриши овај снимак -shotPageDownloadShot = - .title = Преузми -shotPageEditButton = - .title = Уреди ову слику -shotPagefavoriteButton = - .title = Фаворизуј овај снимак -shotPageBackToHomeButton = - .title = Почетна страница -shotPageAllShotsButton = - .title = Сви снимци -shotPageAllShots = Сви снимци -shotPageDownload = Преузми -# Note: Draw text is used on shot page as a verb (action) -shotPageDraw = Фиока -# Note: Favorite text is used on shot page as a verb (action) -shotPageFavorite = Омиљени -shotPageDelete = Обриши -shotPageScreenshotsDescription = Снимци екрана, поједностављени. Ухватите, сачувајте и делите снимке екрана без напуштања Firefox-а. -shotPageUpsellFirefox = Преузмите Firefox сада -shotPageDMCAMessage = Овај снимак није више доступан зато што је примљен извештај о повреди ауторских права. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = За више података, пошаљите мејл на { $dmca }. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ако се поднесе више извештаја о повреди ауторских права за ваше снимке, задржавамо право да вам опозовемо приступ Firefox-овим снимцима екрана. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Укључите адресу до овог снимка у вашем мејлу: { $url } -shotPageKeepFor = Колико дуго треба задржати овај снимак? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Изаберите време -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Бесконачно ∞ -shotPageKeepTenMinutes = 10 минута -shotPageKeepOneHour = 1 сат -shotPageKeepOneDay = 1 дан -shotPageKeepOneWeek = 1 недеља -shotPageKeepTwoWeeks = 2 недеље -shotPageKeepOneMonth = 1 месец -shotPageSaveExpiration = сачувај -shotPageCancelExpiration = откажи -shotPageDoesNotExpire = не истиче -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = истиче -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = истекло -timeDiffJustNow = управо -timeDiffMinutesAgo = - { $number -> - [one] пре једног минута - [few] пре { $number } минута - *[other] пре { $number } минута - } -timeDiffHoursAgo = - { $number -> - [one] пре једног сата - [few] пре { $number } сата - *[other] пре { $number } сати - } -timeDiffDaysAgo = - { $number -> - [one] јуче - [few] пре { $number } дана - *[other] пре { $number } дана - } -timeDiffFutureSeconds = за пар секунди -timeDiffFutureMinutes = - { $number -> - [one] за један минут - [few] за { $number } минута - *[other] за { $number } минута - } -timeDiffFutureHours = - { $number -> - [one] за један сат - [few] за { $number } сата - *[other] за { $number } сати - } -timeDiffFutureDays = - { $number -> - [one] сутра - [few] за { $number } дана - *[other] за { $number } дана - } -errorThirdPartyCookiesEnabled = Ако сте усликали овај снимак и не можете да га обришете, можда морате привремено да омогућите колачиће трећих лица у вашим поставкама. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Забележите! -promoMessage = Ажурирани алати за уређивање вам омогућавају да исечете, означите и чак додате текст на ваш снимак. -promoLink = Испробајте их -promoCloseButton = - .title = Затвори обавештење - -## Annotations - -annotationPenButton = - .title = Оловка -annotationHighlighterButton = - .title = Маркер -annotationUndoButton = - .title = Опозови -annotationRedoButton = - .title = Понови -annotationTextButton = - .title = Додај текст -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Очисти -annotationCropButton = - .title = Одрежи -annotationSaveEditButton = Сачувај - .title = Сачувај измене -annotationCancelEditButton = Откажи - .title = Откажи измене -annotationCropConfirmButton = Потврди - .title = Потврди избор -annotationCropCancelButton = Откажи - .title = Откажи избор -annotationColorWhite = - .title = Бела -annotationColorBlack = - .title = Црна -annotationColorRed = - .title = Црвена -annotationColorGreen = - .title = Зелена -annotationColorBlue = - .title = Плава -annotationColorYellow = - .title = Жута -annotationColorPurple = - .title = Љубичаста -annotationColorSeaGreen = - .title = Морска зелена -annotationColorGrey = - .title = Сива -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Величина текста -# Values shown in text size selection dropdown -textSizeSmall = Мала -textSizeMedium = Средња -textSizeLarge = Велика -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Потврди - .title = Потврди -textToolCancelButton = Откажи - .title = Откажи -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Здраво - -## Settings Page - -settingsDisconnectButton = Прекини везу - .title = Прекини везу -settingsGuestAccountMessage = Налог госта -settingsSignInInvite = Пријавите се да синхронизујете уређаје -settingsSignInButton = Пријави се - .title = Пријави се -SettingsPageHeader = Firefox Screenshots поставке -settingsDescription = Можете се пријавити са Firefox налогом да синхронизујете све ваше снимке екрана са другим уређајима и да приступате са њих. -settingsPageSubHeader = Sync и налози -settingsClosePreferences = - .title = Затвори поставке - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Грешка при брисању снимка: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Моји снимци: претрага за { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Грешка при исцртавању странице: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Претражи моје снимке -shotIndexPageSearchButton = - .title = Претрага -shotIndexPageNoShotsMessage = Нема сачуваних снимака. -shotIndexPageNoShotsInvitation = Слободно, направите неки. -shotIndexPageLookingForShots = Тражим ваше снимке… -shotIndexPageNoSearchResultsIntro = Хм -shotIndexPageNoSearchResults = Не можемо наћи ниједан снимак који се подудара са вашом претрагом. -shotIndexPageMyShotsButton = - .title = Моји снимци -shotIndexPageClearSearchButton = - .title = Очисти претрагу -shotIndexPageConfirmShotDelete = Обрисати овај снимак? -shotIndexPagePreviousPage = - .title = Претходна страница -shotIndexPageNextPage = - .title = Следећа страница -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Ово није омиљени снимак и он ће истећи -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Ово је фаворизовани снимак који не истиче - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Да ли сте сигурни да желите да обришете овај снимак? -shotDeleteCancel = Откажи - .title = Откажи -shotDeleteConfirm = Обриши - .title = Обриши - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots мерења -metricsPageTotalsQueryTitle = Укупно -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Преглед за Screenshots -metricsPageTotalsQueryDevices = Укупно регистрованих уређаја -metricsPageTotalsQueryActiveShots = Активних снимака -metricsPageTotalsQueryExpiredShots = Истеклих (могуће опоравити) -metricsPageTotalsQueryExpiredDeletedShots = Истеклих (и обрисаних) -metricsPageShotsQueryTitle = Снимака по дану -metricsPageShotsQueryDescription = Број направљених снимака сваког дана (за последњих 30 дана) -metricsPageShotsQueryCount = Број снимака -metricsPageShotsQueryDay = Дан -metricsPageUsersQueryTitle = Корисника по дану -metricsPageUsersQueryDescription = Број корисника који су направили барем један снимак, по дану (последњих 30 дана) -metricsPageUsersQueryCount = Број корисника -metricsPageUsersQueryDay = Дан -metricsPageUserShotsQueryTitle = Број снимака по кориснику -metricsPageUserShotsQueryDescription = Број корисника који имају одређени број снимака -metricsPageUserShotsQueryCount = Број корисника -metricsPageUserShotsQueryShots = Приближан број активних (неистеклих) снимака -metricsPageRetentionQueryTitle = Задржавање по недељи -metricsPageRetentionQueryDescription = Број дана од првог снимка корисника па до последњег снимка, поређано по почетној недељи -metricsPageRetentionQueryUsers = Број корисника -metricsPageRetentionQueryDays = Дани од првог корисничког снимка па до последњег -metricsPageRetentionQueryFirstWeek = Недеља у којој је корисник први пут начинио снимак -metricsPageTotalRetentionQueryTitle = Укупно задржавања -metricsPageTotalRetentionQueryDescription = Трајање времена у којем су корисници стварали снимке, поређано по недељи -metricsPageTotalRetentionQueryUsers = Број корисника -metricsPageTotalRetentionQueryDays = Дани у којима је корисник стварао снимке -metricsPageVersionQueryTitle = Издање у облику додатка -metricsPageVersionQueryDescription = Издање у облику додатка коришћено приликом пријављивања, у последњих 14 дана -metricsPageVersionQueryUsers = Број корисничких пријава -metricsPageVersionQueryVersion = Издање у облику додатка -metricsPageVersionQueryLastSeen = Дан -metricsPageHeader = Мерења -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Направљено у: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (време базе података: { $time }ms) diff --git a/locales/su/server.ftl b/locales/su/server.ftl deleted file mode 100644 index 352c9990a7..0000000000 --- a/locales/su/server.ftl +++ /dev/null @@ -1,392 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Téwakan Kami -gHomeLink = Tepas -gNoShots = - .alt = Taya téwakan kapanggih -gScreenshotsDescriptionServerless = Screenshots jadi gampang. Téwak jeung unduh téwakan layar tanpa ninggalkeun Firefox. - -## Header - -buttonSettings = - .title = Setélan -buttonSignIn = - .title = Asup -screenshotsLogo = - .title = Tepas Screenshots -bannerSignIn = Asup atawa daptar pikeun muka téwakan ti sakur gawai sarta teundeun anu petinganana salilana. -bannerUpsell = { gScreenshotsDescription } Cokot Firefox ayeuna -shutdownWarning = Téwakan layar anu diteundeun sakeudeung deui kadaluwarsa. Ti Juni, Screenshots moal nawaran deui teundeunan onlén. Rék nyimpen téwakan ti pabukon anjeun? Unduh kana komputer. -shutdownPageTitle = Screenshots robah -shutdownPageDescription = Mimiti Juni, Screenshots moal nawaran deui gudang daring. Rék nyimpen téwakan tina pabukon anjeun? Unduh hiji-hiji atawa disabuntelkeun. Nuhun geus maké ieu fitur, hampura bisi matak riweuh. -shutdownPageContinue = Mangga lajengkeun migunakeun Screenshots pikeun nyimpen, nyalin, jeung ngundeur tétéwakan. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Naon nu anyar ti Firefox Screenshots? -onboardingPromoMessage = Ayeuna, asup ka Screenshots maké Firefox Account laju hanca leuwih loba: -onboardingPromoMessageListItem1 = Buka pabukon anjeun ti sakur gawai anjeun -onboardingPromoMessageListItem2 = Teundeun téwakan layar kameumeut anjeun salilana -onboardingPromoDismissButton = Tutup - .title = Tutup -onboardingPromoSigninButton = Asup - .title = Asup - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Katangtuan -footerLinkPrivacy = Iber Privasi -footerReportShot = Laporkeun Téwakan - .title = Laporkeun ieu téwakan ku alesan penyalahgunaan, spam, atawa masalah lianna -footerLinkFaqs = LD -footerLinkDMCA = Laporkeun pelanggaran IP -footerLinkDiscourse = Béré Pangdeudeul -footerLinkRemoveAllData = Piceun Sakabéh Data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Nyieun { $title } -creatingPageTitleDefault = kaca -creatingPageWaitMessage = Neundeun téwakan anjeun... - -## Home page - -homePageDescription = - .content = Potret layar intuitif dipanggang katuhu kana panyungsi dina. Capture, simpen na bagikeun Potret layar anjeun ngotéktak wéb nganggo pangotéktak Firefox. -homePageButtonMyShots = Miang ka Téwakan Kami -homePageTeaser = Bakal Datang... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Undeur Haratis -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Cara Gawé Firefox Screenshots -homePageGetStartedTitle = Mitembeyan -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Pilih ikon Screenshots ti menu peta kaca dina palang alamat, menu Screenshots bakal némbongan dina punclut jandéla panyungsi anjeun. -homePageCaptureRegion = Téwak Kotakan -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klik jeung gusur pikeun milih kotakan anu rék ditéwak. Atawa arahkeun jeung klik — Screenshots bakal mangmilihkeun kotakanana. Resep? Pilih Teundeun pikeun muka téwakan layar onlén atawa tombol jamparing turun pikeun ngundeur. -homePageCapturePage = Téwak Kaca -homePageCapturePageDescription = Paké tombol di luhur lebah katuhu pikeun néwak sakabéh kaca. Tombol Teundeun Sakatempo bakal néwak eusi kaca anu harita katempo, anapon Teundeun Kaca Lengkep bakal néwak sakur anu aya dina éta kaca. -homePageDownloadCopy = Unduh atawa Tiron -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Téwak sing hadé. Hasil Screenshots bisa diunduh sapamilih atawa ditiron langsung kana papan klip. -homePageLegalLink = Légal -homePagePrivacyLink = Privasi -homePageTermsLink = Katangtuan -homePageCookiesLink = Kuki - -## Leave Screenshots page - -leavePageRemoveAllData = Piceun Sakabéh Data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Anjeun kudu masang Firefox Screenshots atawa asup ka Akun Firefox pikeun ngahapus akun -leavePageErrorGeneric = Aya éror -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Ieu bakal ngahapus permanén sakur data Firefox Screenshots Anjeun. -leavePageButtonProceed = Teruskeun -leavePageButtonCancel = Bolay -leavePageDeleted = Sakur téwakan layar anjeun geus dipupus! - -## Not Found page - -notFoundPageTitle = Kaca Teu Kapanggih -notFoundPageIntro = Beu. -notFoundPageDescription = Kaca teu kapanggih. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Téwakan layar: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Eror neundeun kadaluwarsa -shotPageAlertErrorDeletingShot = Eror mupus téwakan -shotPageAlertErrorUpdatingTitle = Eror neundeun judul -shotPageConfirmDelete = Nyaan rék mupus permanén ieu téwakan? -shotPageShareButton = - .title = Bagikeun -shotPageCopyButton = - .title = Tiron gambar kana papan klip -shotPageCopyActionLabel = Tiron -shotPageCopied = Ditiron -shotPageShareFacebook = - .title = Bagikeun di Facebook -shotPageShareTwitter = - .title = Bagikeun di Twitter -shotPageSharePinterest = - .title = Bagikeun di Pinterest -shotPageShareEmail = - .title = Bagikeun tutumbu kana surél -shotPageShareLink = Jieun tutumbu bagikeuneun pikeun ieu téwakan: -shotPagePrivacyMessage = Sakur nu boga tutumbuna bisa nempo ieu téwakan. -shotPageCopyImageText = - .label = Tiron téks gambar -shotPageConfirmDeletion = Nyaan rék mupus permanén ieu téwakan? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Lamun diantep, ieu téwakan bakal dipupus permanén . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = teundeun nepi ka { $date } -shotPageExpiredMessage = Ieu téwakan geus kadaluwarsa. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Ti dieu asal dijieunna ieu kaca: -shotPageDeleteButton = - .title = Pupus ieu téwakan -shotPageDownloadShot = - .title = Undeur -shotPageEditButton = - .title = Ropéa ieu gambar -shotPagefavoriteButton = - .title = Paporitkeun ieu téwakan -shotPageBackToHomeButton = - .title = Tepas -shotPageAllShotsButton = - .title = Sakabéh Téwakan -shotPageScreenshotsDescriptionServerless = Screenshots jadi gampang. Téwak jeung unduh téwakan layar tanpa ninggalkeun Firefox. -shotPageDMCAMessage = Ieu téwakan geus teu bisa dibuka alatan ayana klaim kekayaan inteléktual pihak katilu. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Mangga kirim surél { $dmca } pikeun émbaran leuwih teleb. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Lamun Téwakan anjeun nepi ka diklaim sababaraha kali, aksés ka Firefox Screenshots bisa ditutup. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Tuliskeun ogé URL téwakanana dina surél anjeun: { $url } -shotPageKeepFor = Sabaraha lila ieu téwakan rék diteundeun? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Pilih mangsa -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Salilana ∞ -shotPageKeepTenMinutes = 10 Menit -shotPageKeepOneHour = Sajam -shotPageKeepOneDay = Sapoé -shotPageKeepOneWeek = Saminggu -shotPageKeepTwoWeeks = 2 Minggu -shotPageKeepOneMonth = Sabulan -shotPageSaveExpiration = teundeun -shotPageCancelExpiration = bolay -shotPageDoesNotExpire = tanpa kadaluwarsa -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = kadaluwarsa -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = kadaluwarsa -timeDiffJustNow = cikénéh -timeDiffMinutesAgo = - { $number -> - [one] 1 menit kaliwat - *[other] { $number } menit kaliwat - } -timeDiffHoursAgo = - { $number -> - *[other] { $number } jam kaliwat - } -timeDiffDaysAgo = - { $number -> - *[other] { $number } poé kaliwat - } -timeDiffFutureSeconds = sababaraha detik kaliwat -timeDiffFutureMinutes = - { $number -> - *[other] dina { $number } menit - } -timeDiffFutureHours = - { $number -> - *[other] dina { $number } jam - } -timeDiffFutureDays = - { $number -> - *[other] dina { $number } poé - } -errorThirdPartyCookiesEnabled = Lamun teu bisa dihapus, sigana kudu ngahurungkeun kuki pihak katilu pikeun samentawis dina préferénsi panyungsi. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Catet! -promoMessage = Parabot pangropéa nu anyar bisa ngeureut, nyirian, turta nambahkeun téks kana téwakan anjeun. -promoLink = Cobaan -promoCloseButton = - .title = Tutup iber - -## Annotations - -annotationPenButton = - .title = Péna -annotationHighlighterButton = - .title = Panyorot -annotationUndoButton = - .title = Bedo -annotationRedoButton = - .title = Pigawé deui -annotationTextButton = - .title = Tambahkeun téks -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Beresihan -annotationCropButton = - .title = Keureut -annotationSaveEditButton = Teundeun - .title = Teundeun ropéa -annotationCancelEditButton = Bolay - .title = Bolay ngaropéa -annotationCropConfirmButton = Sahkeun - .title = Sahkeun pilihan -annotationCropCancelButton = Bolay - .title = Bolaykeun pilihan -annotationColorWhite = - .title = Bodas -annotationColorBlack = - .title = Hideung -annotationColorRed = - .title = Beureum -annotationColorGreen = - .title = Héjo -annotationColorBlue = - .title = Bulao -annotationColorYellow = - .title = Konéng -annotationColorPurple = - .title = Bungur -annotationColorSeaGreen = - .title = Héjo Laut -annotationColorGrey = - .title = Hawuk -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Ukuran téks -# Values shown in text size selection dropdown -textSizeSmall = Leutik -textSizeMedium = Sedeng -textSizeLarge = Badag -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Sahkeun - .title = Sahkeun -textToolCancelButton = Bolay - .title = Bolay -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Euy - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Aya masalah -copyImageErrorMessage = Teu bisa niron téwakan anjeun kana papan klip. - -## Settings Page - -settingsDisconnectButton = Pegatkeun - .title = Pegatkeun -settingsGuestAccountMessage = Akun Tamu -settingsSignInButton = Asup - .title = Asup -SettingsPageHeader = Setélan Firefox Screenshots -settingsFirefoxAccountSubHeader = Akun Firefox -settingsClosePreferences = - .title = Tutup préferénsi -settingsFxaDisconnectAlertMessage = Anjeun yakin rék megatkeun gawai ieu ti Akun Firefox anjeun? -settingsFxaDisconnectDescription = Lamun kaluar, anjeun kudu asup deui pikeun bisa muka deui téwakan layar. -settingsFxaConnectDescription = Anjeun bisa asup pikeun muka téwakan layar meuntas gawai. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Éror mupus téwakan: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Téwakan Kami: sungsi { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Éror midangkeun kaca: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Paluruh téwakan kami -shotIndexPageNoShotsMessage = Taya teundeunan téwakan. -shotIndexPageNoShotsInvitation = Sok atuh, jieun. -shotIndexPageLookingForShots = Nyaliksik téwakan anjeun... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Taya téwakan anu cocog jeung pamaluruhan anjeun. -shotIndexPageMyShotsButton = - .title = Téwakan Kami -shotIndexPageClearSearchButton = - .title = Beresihan pamaluruhan -shotIndexPageConfirmShotDelete = Pupus ieu téwakan? -shotIndexPagePreviousPage = - .title = Kaca saméméhna -shotIndexPageNextPage = - .title = Kaca satuluyna -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Ieu lain téwakan petingan sarta bakal kadaluwarsa -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Ieu téwakan petingan sarta moal kadaluwarsa -shotIndexSyncedShot = - .title = Téwakan anu dicokot tina séjén alat -shotIndexAlertErrorFavoriteShot = Kasalahan ngamutahirkeun status téwakan petingan - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Yakin anjeun rék mupus ieu téwakan? -shotDeleteCancel = Bolay - .title = Bolay -shotDeleteConfirm = Pupus - .title = Pupus - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Pikeun ékspor: paké File > Save Page As… anjeun bakal manggihan téwakan layar anjeun dina folder { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Métrik Firefox Screenshots -metricsPageTotalsQueryTitle = Jumlah -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Tinjauan Screenshots -metricsPageTotalsQueryDevices = Jumlah paranti kadaptar -metricsPageTotalsQueryActiveShots = Téwakan aktip -metricsPageTotalsQueryExpiredShots = Kadaluwarsa (tapi bisa diala deui) -metricsPageTotalsQueryExpiredDeletedShots = Kadaluwarsa (jeung dihapus) -metricsPageShotsQueryTitle = Téwakan dumasar Poé -metricsPageShotsQueryDescription = Jumlah téwakan dijieun unggal poé (30 poé panungtung) -metricsPageShotsQueryCount = Jumlah téwakan -metricsPageShotsQueryDay = Poé -metricsPageUsersQueryTitle = Pamaké dumasar Poé -metricsPageUsersQueryDescription = Jumlah pamaké anu nyieun sahanteuna hiji téwakan, dumasar poé (30 poé panungtung) -metricsPageUsersQueryCount = Jumlah pamaké -metricsPageUsersQueryDay = Poé -metricsPageUserShotsQueryTitle = Jumlah Téwakan unggal Pamaké -metricsPageUserShotsQueryDescription = Jumlah pamaké anu boga N téwakan -metricsPageUserShotsQueryCount = Jumlah pamaké -metricsPageUserShotsQueryShots = Jumlah kira-kira téwakan aktip (teu kadaluwarsa) -metricsPageRetentionQueryTitle = Reténsi Minggon -metricsPageRetentionQueryDescription = Jumlah poé ti téwakan munggaran nepi ka anu pang anyarna, dukumpulkeun mingguan -metricsPageRetentionQueryUsers = Jumlah pamaké -metricsPageRetentionQueryDays = Poé ti munggaran nyieun téwakan nepi ka nu pang anyarna -metricsPageRetentionQueryFirstWeek = Minggu munggaran pamaké nyieun téwakan -metricsPageTotalRetentionQueryTitle = Jumlah Reténsi -metricsPageTotalRetentionQueryDescription = Lilana pamaké nyieun téwakan, dumasar minggu -metricsPageTotalRetentionQueryUsers = Jumlah pamaké -metricsPageTotalRetentionQueryDays = Lilana pamaké geus nyieun téwakan -metricsPageVersionQueryTitle = Vérsi Pangeuyeub -metricsPageVersionQueryDescription = Vérsi pangeuyeub anu dipaké salila login, 14 poé panungtung -metricsPageVersionQueryUsers = Jumlah pamaké nu asup log -metricsPageVersionQueryVersion = Vérsi pangeuyeub -metricsPageVersionQueryLastSeen = Poé -metricsPageHeader = Métrik -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Dijieun dina: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (waktu database: { $waktu }mdet) diff --git a/locales/sv-SE/server.ftl b/locales/sv-SE/server.ftl deleted file mode 100644 index d1c6e04bea..0000000000 --- a/locales/sv-SE/server.ftl +++ /dev/null @@ -1,397 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Mina skärmbilder -gHomeLink = Hem -gNoShots = - .alt = Inga skärmbilder hittades -gScreenshotsDescriptionServerless = Skärmbilder görs enkelt. Fånga och ladda ner skärmbilder utan att lämna Firefox. - -## Header - -buttonSettings = - .title = Inställningar -buttonSignIn = - .title = Logga in -screenshotsLogo = - .title = Startsida för Screenshots -bannerSignIn = Logga in eller registrera dig för att komma åt dina bilder på enheter och spara dina favoriter för alltid. -bannerUpsell = { gScreenshotsDescription } Hämta Firefox nu -shutdownWarning = Sparade skärmbilder upphör snart.Från och med juni erbjuder Screenshots inte längre lagring online. Vill du behålla bilder från ditt bibliotek? Ladda ner dem till din dator. -shutdownPageTitle = Screenshots ändras -shutdownPageDescription = Från och med juni kommer Screenshots inte längre att erbjuda lagring på nätet. Vill du behålla bilder från ditt bibliotek? Ladda ner bilder individuellt eller i grupp. Tack för att du använde den här funktionen, och vi beklagar eventuella olägenheter. -shutdownPageContinue = Vi hoppas att du fortsätter att använda Screenshots för att fånga, kopiera och ladda ner bilder. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Vad är nytt med Firefox Screenshots? -onboardingPromoMessage = Logga in på Screenshots med ett Firefox-konto och gör mer: -onboardingPromoMessageListItem1 = Åtkomst till ditt bibliotek på alla dina enheter -onboardingPromoMessageListItem2 = Spara dina favoritbilder för alltid -onboardingPromoDismissButton = Ignorera - .title = Ignorera -onboardingPromoSigninButton = Logga in - .title = Logga in - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Villkor -footerLinkPrivacy = Sekretesspolicy -footerReportShot = Rapportera skärmbild - .title = Rapportera denna skärmbild för missbruk, spam eller andra problem -footerLinkFaqs = Vanliga frågor -footerLinkDMCA = Rapportera IP-överträdelse -footerLinkDiscourse = Ge återkoppling -footerLinkRemoveAllData = Ta bort alla data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Skapar { $title } -creatingPageTitleDefault = sida -creatingPageWaitMessage = Sparar din skärmbild... - -## Home page - -homePageDescription = - .content = Intuitiva skärmbilder direkt i webbläsaren. Fånga, spara och dela skärmbilder när du surfar på webben med Firefox. -homePageButtonMyShots = Gå till mina skärmbilder -homePageTeaser = Kommer snart… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Gratis nedladdning -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Så här fungerar Firefox Screenshots -homePageGetStartedTitle = Kom igång -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Välj ikonen Screenshots från menyn Åtgärder för sidan i adressfältet och menyn Screenshots kommer att visas ovanpå ditt webbläsarfönster. -homePageCaptureRegion = Fånga ett område -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Klicka och dra för att välja det område du vill fånga. Eller bara hovra och klicka — Screenshots kommer att välja området åt dig. Gilla du vad du ser? Välj Spara för att få tillgång till skärmbilden på webben eller nedåt-tangenten för att ladda ner den till din dator. -homePageCapturePage = Fånga en sida -homePageCapturePageDescription = Använd knapparna längst upp till höger för att fånga hela sidor. Knappen "Spara synligt område" kommer att fånga upp det område du kan visa utan att scrolla och "Spara hela sidan" tar upp allt på sidan. -homePageDownloadCopy = Hämta eller kopiera -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Ta din bästa bild. Skärmbilder låter dig ladda ner ditt val eller kopiera det direkt till ditt urklipp. -homePageLegalLink = Juridisk information -homePagePrivacyLink = Sekretess -homePageTermsLink = Villkor -homePageCookiesLink = Kakor - -## Leave Screenshots page - -leavePageRemoveAllData = Ta bort all data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Du måste ha Firefox Screenshots installerat eller inloggad på ditt Firefox-konto för att radera ditt konto -leavePageErrorGeneric = Ett fel uppstod -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Detta kommer permanent radera all din data för Firefox Screenshots. -leavePageButtonProceed = Fortsätt -leavePageButtonCancel = Avbryt -leavePageDeleted = Alla dina skärmbilder har raderats! - -## Not Found page - -notFoundPageTitle = Sidan hittades inte -notFoundPageIntro = Hoppsan. -notFoundPageDescription = Sidan hittades inte. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Skärmbild: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Fel vid sparande av förfallodatum -shotPageAlertErrorDeletingShot = Fel vid borttagning av bild -shotPageAlertErrorUpdatingTitle = Fel vid sparande av titel -shotPageConfirmDelete = Är du säker på att du vill radera denna bild permanent? -shotPageShareButton = - .title = Dela -shotPageCopyButton = - .title = Kopiera bild till urklipp -shotPageCopyActionLabel = Kopiera -shotPageCopied = Kopierad -shotPageShareFacebook = - .title = Dela på Facebook -shotPageShareTwitter = - .title = Dela på Twitter -shotPageSharePinterest = - .title = Dela på Pinterest -shotPageShareEmail = - .title = Dela länk via e-post -shotPageShareLink = Få en delbar länk till denna bild: -shotPagePrivacyMessage = Alla som har länken kan se denna bild. -shotPageCopyImageText = - .label = Kopiera bildtext -shotPageConfirmDeletion = Är du säker på att du vill radera denna bild permanent? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Om du inte gör något kommer denna bild att raderas permanent . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = återställ till och med { $date } -shotPageExpiredMessage = Denna bild har upphört. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Här är sidan som den ursprungligen skapades från: -shotPageDeleteButton = - .title = Ta bort denna bild -shotPageDownloadShot = - .title = Hämta -shotPageEditButton = - .title = Redigera bilden -shotPagefavoriteButton = - .title = Markera bilden som favorit -shotPageBackToHomeButton = - .title = Startsida -shotPageAllShotsButton = - .title = Alla skärmbilder -shotPageScreenshotsDescriptionServerless = Skärmbilder görs enkelt. Fånga och ladda ner skärmbilder utan att lämna Firefox. -shotPageDMCAMessage = Denna skärmbild är inte längre tillgänglig på grund av upphovsrättsanspråk från tredje part. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Vänligen mejla { $dmca } för att begära ytterligare information. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Om dina bilder är föremål för flera anspråk kan vi återkalla din åtkomst till Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Vänligen ange URL-adressen till denna bild i ditt e-postmeddelande: { $url } -shotPageKeepFor = Hur länge ska denna skärmbild behållas? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Välj tid -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Oändligt ∞ -shotPageKeepTenMinutes = 10 minuter -shotPageKeepOneHour = 1 timme -shotPageKeepOneDay = 1 dag -shotPageKeepOneWeek = 1 vecka -shotPageKeepTwoWeeks = 2 veckor -shotPageKeepOneMonth = 1 månad -shotPageSaveExpiration = spara -shotPageCancelExpiration = avbryt -shotPageDoesNotExpire = upphör inte -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = upphör -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = upphörde -timeDiffJustNow = just nu -timeDiffMinutesAgo = - { $number -> - [one] en minut sedan - *[other] { $number } minuter sedan - } -timeDiffHoursAgo = - { $number -> - [one] en timme sedan - *[other] { $number } timmar sedan - } -timeDiffDaysAgo = - { $number -> - [one] igår - *[other] { $number } dagar sedan - } -timeDiffFutureSeconds = inom ett par sekunder -timeDiffFutureMinutes = - { $number -> - [one] inom en minut - *[other] inom { $number } minuter - } -timeDiffFutureHours = - { $number -> - [one] inom en timme - *[other] inom { $number } timmar - } -timeDiffFutureDays = - { $number -> - [one] imorgon - *[other] inom { $number } dagar - } -errorThirdPartyCookiesEnabled = Om du tog den här bilden och inte kan ta bort den, kan du behöva aktivera tredjepartskakor tillfälligt från din webbläsares inställningar. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Notera! -promoMessage = Uppdaterade redigeringsverktyg låter dig beskära, markera och till och med lägga till text i din skärmbild. -promoLink = Ge dem ett försök -promoCloseButton = - .title = Stäng meddelande - -## Annotations - -annotationPenButton = - .title = Penna -annotationHighlighterButton = - .title = Markeringspenna -annotationUndoButton = - .title = Ångra -annotationRedoButton = - .title = Gör om -annotationTextButton = - .title = Lägg till text -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Rensa -annotationCropButton = - .title = Beskär -annotationSaveEditButton = Spara - .title = Spara redigering -annotationCancelEditButton = Avbryt - .title = Avbryt redigering -annotationCropConfirmButton = Bekräfta - .title = Bekräfta val -annotationCropCancelButton = Avbryt - .title = Avbryt val -annotationColorWhite = - .title = Vit -annotationColorBlack = - .title = Svart -annotationColorRed = - .title = Röd -annotationColorGreen = - .title = Grön -annotationColorBlue = - .title = Blå -annotationColorYellow = - .title = Gul -annotationColorPurple = - .title = Lila -annotationColorSeaGreen = - .title = Havsgrön -annotationColorGrey = - .title = Grå -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Text storlek -# Values shown in text size selection dropdown -textSizeSmall = Liten -textSizeMedium = Mellan -textSizeLarge = Stor -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Bekräfta - .title = Bekräfta -textToolCancelButton = Avbryt - .title = Avbryt -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Hallå - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Något gick fel -copyImageErrorMessage = Det gick inte att kopiera din bild till urklipp. - -## Settings Page - -settingsDisconnectButton = Koppla från - .title = Koppla från -settingsGuestAccountMessage = Gästkonto -settingsSignInButton = Logga in - .title = Logga in -SettingsPageHeader = Inställningar Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox-konto -settingsClosePreferences = - .title = Stäng inställningar -settingsFxaDisconnectAlertMessage = Är du säker på att du vill koppla bort den här enheten från ditt Firefox-konto? -settingsFxaDisconnectDescription = Om du loggar ut måste du logga in igen för att få tillgång till dina skärmbilder. -settingsFxaConnectDescription = Du kan logga in för att komma åt dina skärmbilder mellan enheter. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Fel vid radering av bild: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Mina skärmbilder: sök efter { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Fel vid rendering av sida: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Sök bland bilder -shotIndexPageNoShotsMessage = Inga sparade bilder. -shotIndexPageNoShotsInvitation = Kom igen, skapa några. -shotIndexPageLookingForShots = Letar efter dina bilder… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Vi kan inte hitta några bilder som matchar din sökning. -shotIndexPageMyShotsButton = - .title = Mina skärmbilder -shotIndexPageClearSearchButton = - .title = Rensa sökning -shotIndexPageConfirmShotDelete = Ta bort denna bild? -shotIndexPagePreviousPage = - .title = Föregående sida -shotIndexPageNextPage = - .title = Nästa sida -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Detta är inte en favoritbild och den upphör -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Detta är en favoritbild och den upphör inte -shotIndexSyncedShot = - .title = Bild tagen på en annan enhet -shotIndexAlertErrorFavoriteShot = Ett fel uppstod vid uppdatering av favoritbildstatus - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Är du säker på att du vill ta bort denna bild? -shotDeleteCancel = Avbryt - .title = Avbryt -shotDeleteConfirm = Ta bort - .title = Ta bort - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = För att exportera: använd Arkiv > Spara sida som... och du hittar dina skärmbilder i mappen { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Statistik för Firefox Screenshots -metricsPageTotalsQueryTitle = Totalt -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = En översikt av Screenshots -metricsPageTotalsQueryDevices = Totalt antal enheter registrerade -metricsPageTotalsQueryActiveShots = Aktiva bilder -metricsPageTotalsQueryExpiredShots = Upphörd (men kan återställas) -metricsPageTotalsQueryExpiredDeletedShots = Upphörd (och borttagen) -metricsPageShotsQueryTitle = Bilder per dag -metricsPageShotsQueryDescription = Antal bilder som skapas varje dag (under de senaste 30 dagarna) -metricsPageShotsQueryCount = Antalet bilder -metricsPageShotsQueryDay = Dag -metricsPageUsersQueryTitle = Användare per dag -metricsPageUsersQueryDescription = Antal användare som skapat minst en bild, dagligen (senaste 30 dagarna) -metricsPageUsersQueryCount = Antalet användare -metricsPageUsersQueryDay = Dag -metricsPageUserShotsQueryTitle = Antal bilder per användare -metricsPageUserShotsQueryDescription = Antalet användare som har cirka N antal bilder -metricsPageUserShotsQueryCount = Antal användare -metricsPageUserShotsQueryShots = Ungefärligt antal aktiva (ej upphörda) bilder -metricsPageRetentionQueryTitle = Återkallade per vecka -metricsPageRetentionQueryDescription = Antal dagar från en användares första bild till senaste bild, grupperat efter startvecka -metricsPageRetentionQueryUsers = Antal användare -metricsPageRetentionQueryDays = Dagar från användarens första till senaste bild -metricsPageRetentionQueryFirstWeek = Vecka då användaren skapade först bilden -metricsPageTotalRetentionQueryTitle = Totalt återkallade -metricsPageTotalRetentionQueryDescription = Hur länge användare har skapat bilder, grupperat efter vecka -metricsPageTotalRetentionQueryUsers = Antal användare -metricsPageTotalRetentionQueryDays = Dagar användaren har skapat bilder -metricsPageVersionQueryTitle = Tilläggsversion -metricsPageVersionQueryDescription = Den version av tillägget som användes under inloggningen, under de senaste 14 dagarna -metricsPageVersionQueryUsers = Antalet användare som loggat in -metricsPageVersionQueryVersion = Tilläggsversion -metricsPageVersionQueryLastSeen = Dag -metricsPageHeader = Statistik -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Skapad: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (databastid: { $time } ms) diff --git a/locales/ta/server.ftl b/locales/ta/server.ftl deleted file mode 100644 index 538556e7be..0000000000 --- a/locales/ta/server.ftl +++ /dev/null @@ -1,208 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = எனது பிடிப்புகள் -gHomeLink = முகப்பு -gNoShots = - .alt = பிடிப்புகள் ஏதுமில்லை - -## Header - -buttonSettings = - .title = அமைவுகள் -buttonSignIn = - .title = உள்நுழை -onboardingPromoDismissButton = நிராகரி - .title = நிராகரி -onboardingPromoSigninButton = உள்நுழை - .title = உள்நுழை - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = மொசில்லா -footerLinkTerms = விதிமுறைகள் -footerLinkPrivacy = தனியுரிம அறிக்கை -footerLinkFaqs = அகேகேகள் -footerLinkDMCA = IP வரம்ப மீறுதலை புகார் செய் -footerLinkDiscourse = கருத்து தெரிவிக்கவும் -footerLinkRemoveAllData = அனைத்து தரவையும் நீக்கு - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } உருவாக்குகிறது -creatingPageTitleDefault = பக்கம் -creatingPageWaitMessage = உங்களது படத்தைச் சேமிக்கிறது... - -## Home page - -homePageButtonMyShots = எனது பிடிப்புகளுக்கு செல்க -homePageTeaser = விரைவில் வருகிறது... -homePageDownloadFirefoxTitle = பயர்பாஃசு -homePageDownloadFirefoxSubTitle = இலவச பிதிவிறக்கம் -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = பயர்பாஃசு திரைப்பிடிப்புகள் எவ்வாறு வேலைச்செய்கிறது -homePageGetStartedTitle = தொடங்கவும் -homePageCaptureRegion = ஒரு மண்டலத்தைக் கைப்பற்று -homePageCapturePage = ஒரு பக்கத்தைக் கைப்பற்று -homePageLegalLink = சட்டபூர்வ -homePagePrivacyLink = தனியுரிமை -homePageTermsLink = விதிமுறைகள் -homePageCookiesLink = நினைவிகள் - -## Leave Screenshots page - -leavePageRemoveAllData = அனைத்து தகவலையும் நீக்கு -leavePageErrorGeneric = ஒரு பிழை ஏற்பட்டது: -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = உங்களின் பயர்பாஃசு திரைப்பிடிப்பு தரவுகளை இது நிரந்தரமாக துடைத்துவிடும். -leavePageButtonProceed = தொடர்க -leavePageButtonCancel = ரத்து -leavePageDeleted = உங்களின் அனைத்து திரைப்பிடிப்புகளும் துடைக்கப்பட்டடன! - -## Not Found page - -notFoundPageTitle = பக்கம் காணப்படவில்லை -notFoundPageIntro = ஒஓ. -notFoundPageDescription = பக்கம் காணப்படவில்லை. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = திரைப்பிடிப்பு: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = காலாவதியைச் சேமிப்பதில் பிழை -shotPageAlertErrorDeletingShot = திரைபிடிப்பை அழிப்பதில் பிழை -shotPageAlertErrorUpdatingTitle = தலைப்பைச் சேமிப்பதில் பிழை -shotPageConfirmDelete = இந்தத் திரைப்பிடிப்பை நிரந்தரமாக அழித்திடவா? -shotPageShareButton = - .title = பகிர் -shotPageCopied = நகலெடுக்கப்பட்டது -shotPageShareFacebook = - .title = முகநூலுக்கு பகிர்க -shotPageShareTwitter = - .title = கீச்சில் பகிர்க -shotPageSharePinterest = - .title = பின்டெர்ஸ்டில் பகிர்க -shotPageShareEmail = - .title = தொடுப்பை மின்னஞ்சல் வழி பகிர்க -shotPageShareLink = இந்த பிடிப்பிற்கு பகிரக்கூடிய இணைப்பைப் பெறுக: -shotPagePrivacyMessage = அந்த இணைப்பைக் கொண்ட எவரும் இந்த பிடிப்பைப் பார்க்க முடியும். -shotPageCopyImageText = - .label = பட உரையை நகலெடு -shotPageConfirmDeletion = இந்த பிடிப்பை நிரந்தரமாக அழிக்கவா? -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date } வரையில் மீட்டமை -shotPageExpiredMessage = இந்த பிடிப்பு காலாவதியானது. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = இது உண்மையில் உருவாக்கப்பட்ட பக்கம் இதோ: -shotPageDeleteButton = - .title = இந்த பிடிப்பை அழித்திடு -shotPageDownloadShot = - .title = பதிவிறக்கம் -shotPageEditButton = - .title = இந்தப் படத்தைத் திருத்து -shotPageDMCAMessage = மூன்றாம் தரப்பு அறிவுசார் சொத்துரிமை கோரலால் இந்த பிடிப்பு நீக்கப்பட்டது. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = கூடுதல் விவரங்களைக் கோர { $dmca } என்பதற்கு மின்னஞ்சல் செய்யுங்கள். -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = உங்கள் பிடிப்புகள் பல்வேறு உரிமைகோரல்களுக்கு உள்ளானால், நாங்கள் உங்களின் பயர்பாக்சு திரைப்பிடிப்புகள் அணுகலை திரும்பப்பெறலாம். -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = இந்த பிடிப்பின் URL முகவரியை உங்கள் மின்னஞ்சலில் சேருங்கள்: { $url } -shotPageKeepFor = இந்த பிடிப்பு எவ்வளவு காலம் தக்கவைக்கப்படும்? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = நேரத்தைத் தேர் -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = காலவரையின்றி ∞ -shotPageKeepTenMinutes = 10 நிமிடங்கள் -shotPageKeepOneHour = 1 ம.நே -shotPageKeepOneDay = 1 நாள் -shotPageKeepOneWeek = 1 வாரம் -shotPageKeepTwoWeeks = 2 வாரங்கள் -shotPageKeepOneMonth = 1 மாதம் -shotPageSaveExpiration = சேமி -shotPageCancelExpiration = ரத்து -shotPageDoesNotExpire = காலாவதியாகாது -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = காலாவதியாகிறது -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = காலாவதியானது -timeDiffJustNow = சற்று முன் -timeDiffMinutesAgo = - { $number -> - [one] 1 நிமிடம் முன்பு - *[other] { $number } நிமிடங்கள் முன்பு - } -timeDiffHoursAgo = - { $number -> - [one] 1 ம.நே முன்பு - *[other] { $number } ம.நேரங்கள் முன்பு - } -timeDiffDaysAgo = - { $number -> - [one] நேற்று - *[other] { $number } நாட்களுக்கு முன்பு - } -timeDiffFutureSeconds = சில விநாடிகளில் -timeDiffFutureMinutes = - { $number -> - [one] 1 நிமிடத்தில் - *[other] { $number } நிமிடங்களில் - } -timeDiffFutureDays = - { $number -> - *[one] நாளை - } - -## Shot Page New Feature Promotion Dialog. - - -## Annotations - -annotationPenButton = - .title = பேனா - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - - -## Settings Page - - -## Shotindex page - -shotIndexPageSearchPlaceholder = - .placeholder = எனது பிடிப்பைத் தேடு -shotIndexPageNoShotsMessage = சேமித்த பிடிப்புகள் இல்லை. -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageClearSearchButton = - .title = தேடலை அழிக்கவும் -shotIndexPageConfirmShotDelete = இந்த பிடிப்பை நீக்கவா? -shotIndexPagePreviousPage = - .title = முந்தைய பக்கம் -shotIndexPageNextPage = - .title = அடுத்த பக்கம் - -## Delete Confirmation Dialog - - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -metricsPageTotalsQueryTitle = மொத்தங்கள் -metricsPageShotsQueryDay = நாள் -metricsPageUsersQueryDay = நாள் -metricsPageVersionQueryLastSeen = நாள் -metricsPageHeader = அலகுகள் diff --git a/locales/te/server.ftl b/locales/te/server.ftl deleted file mode 100644 index 02cccbe2ee..0000000000 --- a/locales/te/server.ftl +++ /dev/null @@ -1,321 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = నా తెరపట్లు -gHomeLink = ముంగిలి -gNoShots = - .alt = తెరపట్లు కనుగొనబడలేదు - -## Header - -buttonSettings = - .title = అమరికలు -buttonSignIn = - .title = ప్రవేశించండి -screenshotsLogo = - .title = తెరపట్ల ముంగిలి - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = నిబంధనలు -footerLinkPrivacy = గోప్యతా విధానం -footerLinkFaqs = ప్రశ్నలు -footerLinkDMCA = IP ఉల్లంఘనను నివేదించండి -footerLinkDiscourse = అభిప్రాయం తెలియజేయండి -footerLinkRemoveAllData = మొత్తం డేటాను తీసివేయండి - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } సృష్టిస్తోంది -creatingPageTitleDefault = పేజీ -creatingPageWaitMessage = మీ పట్టు భద్రమవుతోంది… - -## Home page - -homePageButtonMyShots = నా తెరపట్లకు వెళ్ళండి -homePageTeaser = త్వరలో వస్తుంది... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = ఉచిత దింపుకోలు -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots ఎలాపని చేస్తాయి -homePageGetStartedTitle = మొదలుపెట్టడం -homePageCaptureRegion = ఒక ప్రాంతాన్ని క్యాప్చర్ చేయండి -homePageCapturePage = ఒక పేజీని క్యాప్చర్ చేయండి -homePageSaveShare = భద్రపరుచుకొని పంచుకోండి -homePageLegalLink = చట్టపరమైన -homePagePrivacyLink = గోప్యం -homePageTermsLink = నియమాలు -homePageCookiesLink = కుకీలు - -## Leave Screenshots page - -leavePageRemoveAllData = డేటా అంతా తీసివేయి -leavePageErrorGeneric = ఒక దోషం ఏర్పడింది. -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = ఇది మీ Firefox స్క్రీన్షాట్ల డేటాను శాశ్వతంగా తుడిచి వేస్తుంది. -leavePageButtonProceed = కొనసాగండి -leavePageButtonCancel = రద్దుచేయి -leavePageDeleted = మీ అన్ని తెరపట్లు తొలగించబడ్డాయి! - -## Not Found page - -notFoundPageTitle = పేజీ కనుగొనబడలేదు -notFoundPageIntro = అయ్యో. -notFoundPageDescription = పేజీ కనుగొనబడలేదు - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = తెరపట్టు: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = గడువు పొదుపు చేయడంలో లోపం -shotPageAlertErrorDeletingShot = తెరపట్లు తొలగించడంలో లోపం -shotPageAlertErrorUpdatingTitle = శీర్షిక బద్రపరచడంలో లోపం -shotPageConfirmDelete = మీరు ఖచ్చితంగా ఈ తెరపట్టును శాశ్వతంగా తొలగించాలనుకుంటున్నారా? -shotPageShareButton = - .title = పంచుకోండి -shotPageCopyActionLabel = కాపీచెయ్యి -shotPageCopied = నకలు చేయబడింది -shotPageShareFacebook = - .title = Facebookలో పంచుకోండి -shotPageShareTwitter = - .title = Twitterలో పంచుకోండి -shotPageSharePinterest = - .title = Pinterestలో పంచుకోండి -shotPageShareEmail = - .title = ఇమెయిల్ ద్వారా లింక్ను పంచుకోండి -shotPageShareLink = ఈ తెరపట్టు పంచుకునేందుకు లంకెను పొందండి: -shotPagePrivacyMessage = లంకె ఉన్న ఎవరైనా ఈ తెరపట్టును వీక్షించగలరు. -shotPageCopyImageText = - .label = చిత్రం వచనాన్ని నకలు చేయండి -shotPageConfirmDeletion = మీరు ఖచ్చితంగా ఈ తెరపట్టును శాశ్వతంగా తొలగించాలనుకుంటున్నారా? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = మీరు ఏమీ చేయకపోతే, ఈ తెరపట్టు శాశ్వతంగా తొలగించబడుతుంది . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date } వరకు పునరుద్ధరించండి -shotPageExpiredMessage = ఈ తెరపట్టు గడువు ముగిసింది. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = ఇది మొదట సృష్టించబడిన పేజీ: -shotPageDeleteButton = - .title = ఈ తెరపట్టును తొలగించండి -shotPageDownloadShot = - .title = దింపుకోండి -shotPageEditButton = - .title = ఈ చిత్రం సవరించు -shotPagefavoriteButton = - .title = ఈ పట్టును మెచ్చుకోండి -shotPageBackToHomeButton = - .title = ముంగిలి పేజీ -shotPageAllShotsButton = - .title = అన్ని పట్లు -shotPageScreenshotsDescription = తెరపట్లు సులభతరమైనాయి. Firefoxను వదలకుండా తెరపట్లను తీసుకోండి, భద్రపరచండి మరియు పంచుకోండి. -shotPageDMCAMessage = మూడవ పార్టీ మేధో సంపత్తి హక్కు కారణంగా ఈ తెరపట్టు అందుబాటులో లేదు. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = దయచేసి మరింత సమాచారం అభ్యర్థించడానికి { $dmca }కి ఇమెయిల్ చేయండి. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = దయచేసి ఈ తెరపట్టు యొక్క URLను మీ ఇమెయిల్లో చేర్చండి: { $url } -shotPageKeepFor = ఈ తెరపట్టును ఎంతకాలం భద్రపరచివుంచాలి? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = సమయాన్ని ఎంచుకోండి -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = నిరవధికంగా ∞ -shotPageKeepTenMinutes = 10 నిమిషాలు -shotPageKeepOneHour = 1 గంట -shotPageKeepOneDay = 1 రోజు -shotPageKeepOneWeek = 1 వారం -shotPageKeepTwoWeeks = 2 వారాలు -shotPageKeepOneMonth = 1 నెల -shotPageSaveExpiration = బద్రపరుచు -shotPageCancelExpiration = రద్దుచేయు -shotPageDoesNotExpire = గడువు లేదు -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = గడువు ముగుస్తుంది -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = గడువు ముగిసింది -timeDiffJustNow = ఇప్పుడే -timeDiffMinutesAgo = - { $number -> - [one] 1 నిమిషం క్రితం - *[other] { $number } నిమిషాల ముందు - } -timeDiffHoursAgo = - { $number -> - [one] 1 గంట క్రితం - *[other] { $number } గంటల క్రితం - } -timeDiffDaysAgo = - { $number -> - [one] నిన్న - *[other] { $number } రోజుల క్రితం - } -timeDiffFutureSeconds = కొన్ని క్షాణాలలో -timeDiffFutureMinutes = - { $number -> - [one] 1 నిమిషం - *[other] { $number } నిమిషాల్లో - } -timeDiffFutureHours = - { $number -> - [one] 1 గంటలో - *[other] { $number } గంటలలో - } -timeDiffFutureDays = - { $number -> - [one] రేపు - *[other] { $number } రోజులలో - } - -## Shot Page New Feature Promotion Dialog. - -promoCloseButton = - .title = గమనింపుని మూసివేయి - -## Annotations - -annotationPenButton = - .title = పెన్ను -annotationHighlighterButton = - .title = హైలైటర్ -annotationTextButton = - .title = పాఠ్యాన్ని చేర్చండి -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = తుడిచివేయి -annotationCropButton = - .title = కత్తిరించు -annotationSaveEditButton = భద్రపరచు - .title = మార్పును భద్రపరచు -annotationCancelEditButton = రద్దుచేయి - .title = మార్పుని రద్దుచేయి -annotationCropConfirmButton = నిర్ధారించు - .title = ఎంపికను నిర్ధారించు -annotationCropCancelButton = రద్దుచేయి - .title = ఎంపికను రద్దుచేయి -annotationColorWhite = - .title = తెలుపు -annotationColorBlack = - .title = నలుపు -annotationColorRed = - .title = ఎరుపు -annotationColorGreen = - .title = పచ్చ -annotationColorBlue = - .title = నీలం -annotationColorYellow = - .title = పసుపు -annotationColorPurple = - .title = ఊదా -annotationColorSeaGreen = - .title = నీలం కలిసిన ఆకుపచ్చ -annotationColorGrey = - .title = బూడిద -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = పాఠ్య పరిమాణం -# Values shown in text size selection dropdown -textSizeSmall = చిన్నది -textSizeMedium = మధ్యస్థం -textSizeLarge = పెద్దది -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = నిర్ధారించు - .title = నిర్ధారించు -textToolCancelButton = రద్దుచేయి - .title = రద్దుచేయి -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = హలో - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - - -## Settings Page - -settingsDisconnectButton = అనుసంధానం తెంచు - .title = అనుసంధానం తెంచు -settingsGuestAccountMessage = అతిథి ఖాతా -settingsSignInButton = ప్రవేశించండి - .title = ప్రవేశించండి -SettingsPageHeader = Firefox తెరపట్ల అమరికలు -settingsClosePreferences = - .title = అభిరుచులను మూసివేయి - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = షాట్ను తొలగించడంలో లోపం: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = నా తెరపట్ల: { $searchTerm } కోసం శోధన -shotIndexPageSearchPlaceholder = - .placeholder = నా తెరపట్లను వెతకండి -shotIndexPageNoShotsMessage = భద్రపరచిన తెరపట్లు లేవు. -shotIndexPageNoShotsInvitation = వెళ్ళండి, కొన్ని తెరపట్లు తీయండి. -shotIndexPageLookingForShots = తెరపట్ల కొరకు చూస్తున్నాం… -shotIndexPageNoSearchResultsIntro = హ్మ్మ్ -shotIndexPageNoSearchResults = మీ శోధనకు సరిపోలే ఏ తెరపట్టును కనుగొనలేకపోయాము. -shotIndexPageMyShotsButton = - .title = నా పట్లు -shotIndexPageClearSearchButton = - .title = స్పష్టమైన శోధన -shotIndexPageConfirmShotDelete = ఈ తెరపట్టును తొలగించాలా? -shotIndexPagePreviousPage = - .title = మునుపటి పేజీ -shotIndexPageNextPage = - .title = తదుపరి పేజీ - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = మీరు ఈ తెరపట్టును ఖచ్చితంగా తొలగించాలనుకుంటున్నారా? -shotDeleteCancel = రద్దుచేయి - .title = రద్దుచేయి -shotDeleteConfirm = తొలగించు - .title = తొలగించు - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots మెట్రిక్స్ -metricsPageTotalsQueryTitle = మొత్తాలు -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = తెరపట్ల యొక్క అవలోకనం -metricsPageTotalsQueryDevices = నమోదు చేయబడిన మొత్తం పరికరాలు -metricsPageTotalsQueryActiveShots = సక్రియ తెరపట్లు -metricsPageTotalsQueryExpiredShots = గడువు ముగిసింది (కానీ పునరుద్ధరించవచ్చు) -metricsPageTotalsQueryExpiredDeletedShots = గడువు ముగిసింది (మరియు తొలగించబడింది) -metricsPageShotsQueryTitle = రోజువారి తెరపట్లు -metricsPageShotsQueryDescription = ప్రతి రోజు సృష్టించిన తెరపట్ల సంఖ్య (గత 30 రోజులుగా) -metricsPageShotsQueryCount = తెరపట్ల సంఖ్య -metricsPageShotsQueryDay = రోజు -metricsPageUsersQueryTitle = రొజు వారి వాడుకరులు -metricsPageUsersQueryCount = వాడుకరుల సంఖ్య -metricsPageUsersQueryDay = రోజు -metricsPageUserShotsQueryTitle = వాడుకరికి పట్ల సంఖ్య -metricsPageUserShotsQueryCount = వాడుకరులు సంఖ్య -metricsPageRetentionQueryTitle = వారానికి నిలుపుదల -metricsPageRetentionQueryUsers = వాడుకరుల సంఖ్య -metricsPageRetentionQueryFirstWeek = వాడుకరి మొదటి తెరపట్టును సృష్టించిన వారము -metricsPageTotalRetentionQueryTitle = పుర్తి నిలుపుదల -metricsPageTotalRetentionQueryUsers = వాడుకరుల సంఖ్య -metricsPageTotalRetentionQueryDays = వినియోగదారుడు షాట్లు సృష్టించే రోజులు -metricsPageVersionQueryTitle = పొడిగింత వెర్షన్ -metricsPageVersionQueryUsers = లాగిన్ చేసిన వాడుకరుల సంఖ్య -metricsPageVersionQueryVersion = పొడిగింత వెర్షన్ -metricsPageVersionQueryLastSeen = రోజు -metricsPageHeader = కొలమానములు -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = రూపొందించబడినది: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (డేటాబేస్ సమయం: { $time }ms) diff --git a/locales/th/server.ftl b/locales/th/server.ftl deleted file mode 100644 index 7136df96b1..0000000000 --- a/locales/th/server.ftl +++ /dev/null @@ -1,353 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = ภาพหน้าจอของฉัน -gHomeLink = หน้าแรก -gNoShots = - .alt = ไม่พบภาพหน้าจอ - -## Header - -buttonSettings = - .title = การตั้งค่า -buttonSignIn = - .title = ลงชื่อเข้า -screenshotsLogo = - .title = หน้าแรก Screenshots -bannerUpsell = { gScreenshotsDescription } รับ Firefox ตอนนี้ -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = มีอะไรใหม่ใน Firefox Screenshots? -onboardingPromoDismissButton = ยกเลิก - .title = ยกเลิก -onboardingPromoSigninButton = ลงชื่อเข้า - .title = ลงชื่อเข้า - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = ข้อกำหนด -footerLinkPrivacy = ประกาศความเป็นส่วนตัว -footerReportShot = รายงานช็อต - .title = รายงานช็อตนี้เมื่อพบการไปใช้ในทางที่ผิด ขยะไปรษณีย์อิเล็กทรอนิกส์ หรือปัญหาอื่น ๆ -footerLinkFaqs = คำถามที่พบบ่อย -footerLinkDMCA = รายงานการละเมิดทรัพย์สินทางปัญญา -footerLinkDiscourse = เสนอข้อคิดเห็น -footerLinkRemoveAllData = เอาข้อมูลทั้งหมดออก - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = กำลังสร้าง { $title } -creatingPageTitleDefault = หน้า -creatingPageWaitMessage = กำลังบันทึกภาพหน้าจอของคุณ… - -## Home page - -homePageDescription = - .content = จับภาพหน้าจออย่างง่ายจากในเบราว์เซอร์ จับภาพ บันทึก และแบ่งปันภาพหน้าจอขณะที่คุณท่องเว็บโดยใช้ Firefox -homePageButtonMyShots = ไปยังภาพหน้าจอของฉัน -homePageTeaser = เร็ว ๆ นี้... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = ดาวน์โหลดฟรี -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots ทำงานอย่างไร -homePageGetStartedTitle = เริ่มต้น -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = เลือกไอคอน Screenshots จากเมนูการกระทำหน้าในแถบที่อยู่ แล้วเมนู Screenshots จะปรากฏบนด้านบนของหน้าต่างเบราว์เซอร์ของคุณ -homePageCaptureRegion = จับภาพเป็นบริเวณ -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = คลิกและลากเพื่อเลือกพื้นที่ที่คุณต้องการจับภาพ หรือเพียงแค่วางเมาส์และคลิก เท่านี้ Screenshots ก็จะเลือกพื้นที่ให้คุณเอง ชอบสิ่งที่คุณเห็นงั้นหรือ? เลือก บันทึก เพื่อเข้าถึงภาพหน้าจอของคุณทางออนไลน์ หรือเลือกปุ่มลูกศรลงเพื่อดาวน์โหลดลงบนคอมพิวเตอร์ของคุณ -homePageCapturePage = จับภาพหน้า -homePageDownloadCopy = ดาวน์โหลดหรือคัดลอก -homePageLegalLink = ข้อกฎหมาย -homePagePrivacyLink = ความเป็นส่วนตัว -homePageTermsLink = ข้อกำหนด -homePageCookiesLink = คุกกี้ - -## Leave Screenshots page - -leavePageRemoveAllData = เอาข้อมูลทั้งหมดออก -leavePageErrorGeneric = เกิดข้อผิดพลาด -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = การดำเนินการนี้จะลบข้อมูล Firefox Screenshots ทั้งหมดของคุณอย่างถาวร -leavePageButtonProceed = ดำเนินการต่อ -leavePageButtonCancel = ยกเลิก -leavePageDeleted = ภาพถ่ายหน้าจอของคุณทั้งหมดถูกลบแล้ว! - -## Not Found page - -notFoundPageTitle = ไม่พบหน้า -notFoundPageIntro = อุปส์ -notFoundPageDescription = ไม่พบหน้า - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = ภาพหน้าจอ: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = เกิดข้อผิดพลาดในการบันทึกการหมดอายุ -shotPageAlertErrorDeletingShot = เกิดข้อผิดพลาดในการลบภาพหน้าจอ -shotPageAlertErrorUpdatingTitle = เกิดข้อผิดพลาดในการบันทึกชื่อเรื่อง -shotPageConfirmDelete = คุณแน่ใจหรือไม่ที่ต้องการจะลบภาพนี้อย่างถาวร? -shotPageShareButton = - .title = แบ่งปัน -shotPageCopyButton = - .title = คัดลอกรูปภาพไปยังคลิปบอร์ด -shotPageCopyActionLabel = คัดลอก -shotPageCopied = คัดลอกแล้ว -shotPageShareFacebook = - .title = แบ่งปันบน Facebook -shotPageShareTwitter = - .title = แบ่งปันบน Twitter -shotPageSharePinterest = - .title = แบ่งปันบน Pinterest -shotPageShareEmail = - .title = แบ่งปันลิงก์ทางอีเมล -shotPageShareLink = รับลิงก์ที่แบ่งปันได้ไปยังภาพหน้าจอนี้: -shotPagePrivacyMessage = ใครก็ตามที่มีลิงก์นี้สามารถดูภาพนี้ได้ -shotPageCopyImageText = - .label = คัดลอกข้อความภาพ -shotPageConfirmDeletion = คุณแน่ใจหรือไม่ที่ต้องการจะลบภาพนี้อย่างถาวร? -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = กู้คืนจนถึง { $date } -shotPageExpiredMessage = ภาพหน้าจอนี้หมดอายุแล้ว -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = นี่คือหน้าที่ใช้สร้างตอนแรก: -shotPageDeleteButton = - .title = ลบภาพหน้าจอนี้ -shotPageDownloadShot = - .title = ดาวน์โหลด -shotPageEditButton = - .title = แก้ไขภาพนี้ -shotPagefavoriteButton = - .title = คั่นภาพนี้ -shotPageBackToHomeButton = - .title = หน้าแรก -shotPageAllShotsButton = - .title = ช็อตทั้งหมด -shotPageDMCAMessage = ภาพนี้ไม่พร้อมใช้งานอีกต่อไปเนื่องจากมีการอ้างสิทธิ์ทรัพย์สินทางปัญญาจากบุคคลที่สาม -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = โปรดอีเมลมายัง { $dmca } เพื่อขอข้อมูลเพิ่มเติม -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = ถ้าภาพที่คุณจับมีการอ้างสิทธิ์จากหลาย ๆ คน เราอาจเพิกถอนการเข้าถึง Firefox Screenshots ของคุณ -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = กรุณาใส่ URL ของภาพนี้ในอีเมลของคุณ: { $url } -shotPageKeepFor = ควรจัดเก็บภาพนี้ไว้นานเท่าใด? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = เลือกเวลา -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = ไม่มีกำหนด ∞ -shotPageKeepTenMinutes = 10 นาที -shotPageKeepOneHour = 1 ชั่วโมง -shotPageKeepOneDay = 1 วัน -shotPageKeepOneWeek = 1 สัปดาห์ -shotPageKeepTwoWeeks = 2 สัปดาห์ -shotPageKeepOneMonth = 1 เดือน -shotPageSaveExpiration = บันทึก -shotPageCancelExpiration = ยกเลิก -shotPageDoesNotExpire = ไม่หมดอายุ -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = หมดอายุ -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = หมดอายุแล้ว -timeDiffJustNow = เมื่อกี้นี้ -timeDiffMinutesAgo = - { $number -> - *[other] { $number } นาทีที่แล้ว - } -timeDiffHoursAgo = - { $number -> - *[other] { $number } ชั่วโมงที่แล้ว - } -timeDiffDaysAgo = - { $number -> - *[other] { $number } วันที่แล้ว - } -timeDiffFutureSeconds = ในไม่กี่วินาที -timeDiffFutureMinutes = - { $number -> - *[other] ใน { $number } นาที - } -timeDiffFutureHours = - { $number -> - *[other] ใน { $number } ชั่วโมง - } -timeDiffFutureDays = - { $number -> - *[other] ใน { $number } วัน - } -errorThirdPartyCookiesEnabled = ถ้าคุณจับภาพนี้และไม่สามารถลบภาพนี้ได้ คุณอาจจำเป็นต้องเปิดใช้งานคุกกี้จากบุคคลที่สามชั่วคราวจากการตั้งค่าเบราว์เซอร์ของคุณ - -## Shot Page New Feature Promotion Dialog. - -promoCloseButton = - .title = ปิดการแจ้งเตือน - -## Annotations - -annotationPenButton = - .title = ปากกา -annotationHighlighterButton = - .title = ปากกาเน้นข้อความ -annotationUndoButton = - .title = เลิกทำ -annotationRedoButton = - .title = ทําซ้ำ -annotationTextButton = - .title = เพิ่มข้อความ -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = ล้าง -annotationCropButton = - .title = ครอบตัด -annotationSaveEditButton = บันทึก - .title = Save edit -annotationCancelEditButton = ยกเลิก - .title = Cancel editing -annotationCropConfirmButton = ยืนยัน - .title = Confirm selection -annotationCropCancelButton = ยกเลิก - .title = ยกเลิกการเลือก -annotationColorWhite = - .title = ขาว -annotationColorBlack = - .title = ดำ -annotationColorRed = - .title = แดง -annotationColorGreen = - .title = เขียว -annotationColorBlue = - .title = น้ำเงิน -annotationColorYellow = - .title = เหลือง -annotationColorPurple = - .title = ม่วง -annotationColorSeaGreen = - .title = เขียวน้ำทะเล -annotationColorGrey = - .title = เทา -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = ขนาดตัวอักษร -# Values shown in text size selection dropdown -textSizeSmall = เล็ก -textSizeMedium = ปานกลาง -textSizeLarge = ใหญ่ -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = ยืนยัน - .title = ยืนยัน -textToolCancelButton = ยกเลิก - .title = ยกเลิก -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = สวัสดี - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = มีบางอย่างผิดพลาด -copyImageErrorMessage = ไม่สามารถคัดลอกช็อตของคุณไปยังคลิปบอร์ด - -## Settings Page - -settingsDisconnectButton = ตัดการเชื่อมต่อ - .title = ตัดการเชื่อมต่อ -settingsGuestAccountMessage = บัญชีผู้มาเยือน -settingsSignInButton = ลงชื่อเข้า - .title = ลงชื่อเข้า -SettingsPageHeader = การตั้งค่า Firefox Screenshots -settingsFirefoxAccountSubHeader = Firefox Account -settingsClosePreferences = - .title = ปิดค่ากำหนด - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = เกิดข้อผิดพลาดในการลบภาพ: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = ภาพหน้าจอของฉัน: ค้นหา { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = เกิดข้อผิดพลาดในการเรนเดอร์หน้า: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = ค้นหาภาพหน้าจอของฉัน -shotIndexPageNoShotsMessage = ไม่มีภาพหน้าจอที่บันทึกไว้ -shotIndexPageNoShotsInvitation = เริ่มจับภาพหน้าจอ -shotIndexPageLookingForShots = กำลังมองหาภาพหน้าจอของคุณ… -shotIndexPageNoSearchResultsIntro = หืมม -shotIndexPageNoSearchResults = เราไม่พบภาพใด ๆ ที่ตรงกับการค้นหาของคุณ -shotIndexPageMyShotsButton = - .title = ภาพหน้าจอของฉัน -shotIndexPageClearSearchButton = - .title = ล้างการค้นหา -shotIndexPageConfirmShotDelete = ลบภาพหน้าจอนี้? -shotIndexPagePreviousPage = - .title = หน้าก่อนหน้า -shotIndexPageNextPage = - .title = หน้าถัดไป - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = คุณแน่ใจหรือไม่ที่ต้องการจะลบภาพนี้? -shotDeleteCancel = ยกเลิก - .title = ยกเลิก -shotDeleteConfirm = ลบ - .title = ลบ - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = ข้อมูลสถิติ Firefox Screenshots -metricsPageTotalsQueryTitle = รวม -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = ภาพรวมของ Screenshots -metricsPageTotalsQueryDevices = อุปกรณ์ลงทะเบียนทั้งหมด -metricsPageTotalsQueryActiveShots = ภาพที่ใช้งานอยู่ -metricsPageTotalsQueryExpiredShots = หมดอายุ (แต่สามารถกู้คืนได้) -metricsPageTotalsQueryExpiredDeletedShots = หมดอายุ (และถูกลบแล้ว) -metricsPageShotsQueryTitle = จำนวนภาพตามวัน -metricsPageShotsQueryDescription = จำนวนภาพที่จับในแต่ละวัน (30 วันหลังสุด) -metricsPageShotsQueryCount = จำนวนภาพหน้าจอ -metricsPageShotsQueryDay = วัน -metricsPageUsersQueryTitle = ผู้ใช้ตามวัน -metricsPageUsersQueryDescription = จำนวนผู้ใช้ที่จับภาพอย่างน้อยหนึ่งภาพตามวัน (30 วันหลังสุด) -metricsPageUsersQueryCount = จำนวนผู้ใช้ -metricsPageUsersQueryDay = วัน -metricsPageUserShotsQueryTitle = จำนวนภาพหน้าจอต่อผู้ใช้ -metricsPageUserShotsQueryDescription = จำนวนผู้ใช้ที่จับภาพทั้งหมด N ครั้ง -metricsPageUserShotsQueryCount = จำนวนผู้ใช้ -metricsPageUserShotsQueryShots = จำนวนภาพที่ใช้งานอยู่ (ที่ยังไม่หมดอายุ) โดยประมาณ -metricsPageRetentionQueryTitle = การเก็บข้อมูลตามสัปดาห์ -metricsPageRetentionQueryDescription = จำนวนวันตั้งแต่วันที่ผู้ใช้จับภาพครั้งแรกจนถึงวันที่จับภาพล่าสุด จัดกลุ่มตามสัปดาห์แรก -metricsPageRetentionQueryUsers = จำนวนผู้ใช้ -metricsPageRetentionQueryDays = จำนวนวันตั้งแต่วันที่ผู้ใช้จับภาพครั้งแรกจนถึงวันที่จับภาพล่าสุด -metricsPageRetentionQueryFirstWeek = สัปดาห์ที่ผู้ใช้จับภาพครั้งแรก -metricsPageTotalRetentionQueryTitle = การเก็บข้อมูลทั้งหมด -metricsPageTotalRetentionQueryDescription = ระยะเวลาที่ผู้ใช้ได้จับภาพ จัดกลุ่มตามสัปดาห์ -metricsPageTotalRetentionQueryUsers = จำนวนผู้ใช้ -metricsPageTotalRetentionQueryDays = จำนวนวันที่ผู้ใช้จับภาพ -metricsPageVersionQueryTitle = รุ่นส่วนเสริม -metricsPageVersionQueryDescription = รุ่นของส่วนเสริมที่ใช้ระหว่างเข้าสู่ระบบ ใน 14 วันหลังสุด -metricsPageVersionQueryUsers = จำนวนผู้ใช้ที่เข้าสู่ระบบ -metricsPageVersionQueryVersion = รุ่นส่วนเสริม -metricsPageVersionQueryLastSeen = วัน -metricsPageHeader = ข้อมูลสถิติ -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = สร้างขึ้นเมื่อ: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (เวลาฐานข้อมูล: { $time }ms) diff --git a/locales/tl/server.ftl b/locales/tl/server.ftl deleted file mode 100644 index 4a0862feba..0000000000 --- a/locales/tl/server.ftl +++ /dev/null @@ -1,141 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Aking mga Shot -gHomeLink = Home -gNoShots = - .alt = Walang nakitang shot -gScreenshotsDescription = Ginawang simple ang mga screenshot. Dalhin, i-save, at ibahagi ang mga screenshot nang hindi umaalis sa Firefox. - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Mga tuntunin -footerLinkPrivacy = Paunawa sa Privacy -footerLinkFaqs = FAQs -footerLinkDMCA = Iulat ang IP Infringement -footerLinkDiscourse = Magbigay ng Feedback -footerLinkRemoveAllData = Alisin ang Lahat ng Data - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Paglikha ng { $title } -creatingPageTitleDefault = pahina -creatingPageWaitMessage = Sine-save ang iyong shot... - -## Home page - -homePageDescription = - .content = Ang mga matalinong screenshot na inihurnong pakanan papunta sa browser. Kunin, i-save at ibahagi ang mga screenshot habang nagba-browse ka sa Web gamit ang Firefox. -homePageButtonMyShots = Pumunta sa Aking mga Shots -homePageTeaser = Malapit Na… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Libreng pag-download -homePageGetStarted = Magsimula -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Paano Gumagana ang Mga screenshot ng Firefox -homePageGetStartedTitle = Magsimula -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescription = Hanapin ang bagong mga screenshot na icon sa iyong toolbar. Piliin ito, at ang menu ng Mga screenshot ay lilitaw sa tuktok ng window ng iyong browser. -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Piliin ang icon ng Screenshot mula sa menu ng mga pagkilos ng pahina sa address bar, at ang menu ng Mga screenshot ay lilitaw sa tuktok ng window ng iyong browser. -homePageCaptureRegion = Kumuha ng Rehiyon -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = I-click at i-drag upang piliin ang lugar na nais mong makuha. O mag-hover at mag-click - Ang mga screenshot ay pipiliin ang lugar para sa iyo. Tulad ng nakikita mo? Piliin ang I-save upang i-access ang iyong screenshot sa online o sa down arrow na pindutan upang i-download ito sa iyong computer. -homePageCapturePage = Kumuha ng Pahina -homePageCapturePageDescription = Gamitin ang mga pindutan sa kanang itaas upang makuha ang buong mga pahina. Makukuha ng pindutang I-save ang Nakikita ang lugar na maaari mong tingnan nang walang pag-scroll, at Makukuha ng Save Full Page ang lahat ng bagay sa pahina. -homePageSaveShare = I-save at Ibahagi -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageSaveShareDescription = Kapag kumuha ka ng isang shot, ang Firefox post screenshot sa iyong online Screenshot ng library at mga kopya ng link sa iyong clipboard. Awtomatiko naming iniimbak ang iyong screenshot sa loob ng dalawang linggo, ngunit maaari mong tanggalin ang mga pag-shot sa anumang oras o baguhin ang petsa ng pag-expire upang mapanatili ang mga ito sa iyong library nang mas matagal. -homePageLegalLink = Legal -homePagePrivacyLink = Privacy -homePageTermsLink = Mga Tuntunin -homePageCookiesLink = Mga cookie - -## Leave Screenshots page - -leavePageRemoveAllData = Alisin ang Lahat na Data -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAddonRequired = Kailangang naka-install ang mga screenshot ng Firefox upang tanggalin ang iyong account -leavePageErrorGeneric = May pagkakamaling naganap -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Ito ay permanenteng burahin ang lahat ng iyong data sa Mga screenshot ng Firefox. -leavePageButtonProceed = Magpatuloy -leavePageButtonCancel = Kanselahin -leavePageDeleted = Ang lahat ng iyong mga screenshot ay nabura! - -## Not Found page - -notFoundPageTitle = Hindi Makita ang Pahina -notFoundPageIntro = Oops. -notFoundPageDescription = Hindi Makita ang Pahina - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Screenshot: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Error sa pag-save ng pag-expire -shotPageAlertErrorDeletingShot = Error sa pagtanggal ng pagbaril -shotPageAlertErrorUpdatingTitle = Error sa pag-save ng pamagat -shotPageConfirmDelete = Sigurado ka bang gusto mong permanenteng tanggalin ang shot na ito? -shotPageShareButton = - .title = Ibahagi -shotPageCopy = Kopyahin -shotPageCopied = Kinopya -shotPageShareFacebook = - .title = Ibahagi sa Facebook -shotPageShareTwitter = - .title = Ibahagi sa Twitter -shotPageSharePinterest = - .title = Ibahagi sa Pinterest -shotPageShareEmail = - .title = Ibahagi ang link sa email -shotPageShareLink = Kumuha ng isang naibahaging link sa pagbaril na ito: -shotPagePrivacyMessage = Maaaring tingnan ng sinumang may link ang pagbaril na ito. -shotPageCopyImageText = - .label = Kopyahin ang teksto ng larawan -shotPageConfirmDeletion = Sigurado ka bang gusto mong permanenteng tanggalin ang shot na ito? -shotPageDownloadShot = - .title = I-download -shotPageDownload = I-download -shotPageUpsellFirefox = Kumuha ng Firefox ngayun -shotPageKeepTenMinutes = 10 Minuto -shotPageKeepOneHour = 1 Oras -shotPageKeepOneDay = 1 Araw -shotPageKeepOneWeek = 1 Linggo -shotPageKeepTwoWeeks = 2 Linggo -shotPageKeepOneMonth = 1 Buwan -timeDiffFutureDays = - { $number -> - [one] Bukas - *[other] sa { $number } na mga araw - } - -## Annotations - - -## Settings Page - - -## Shotindex page - -shotIndexPageNoSearchResultsIntro = Hmm - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - -metricsPageShotsQueryDay = Araw -metricsPageUsersQueryDay = Araw -metricsPageVersionQueryLastSeen = Araw -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (database time: { $time }ms) diff --git a/locales/tr/server.ftl b/locales/tr/server.ftl deleted file mode 100644 index 2b182a3d54..0000000000 --- a/locales/tr/server.ftl +++ /dev/null @@ -1,373 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Görüntülerim -gHomeLink = Ana Sayfa -gNoShots = - .alt = Görüntü bulunamadı -gScreenshotsDescriptionServerless = Ekran görüntüsü almayı basitleştirdik. Firefox’tan çıkmadan ekran görüntülerini yakalayıp indirebilirsiniz. - -## Header - -buttonSettings = - .title = Ayarlar -buttonSignIn = - .title = Giriş yap -screenshotsLogo = - .title = Screenshots ana sayfası -bannerSignIn = Görüntülerinize tüm cihazlarınızdan ulaşmak ve favorilerinizi kalıcı olarak saklamak için giriş yapın veya kaydolun. -bannerUpsell = { gScreenshotsDescription } Firefox’u indir -shutdownWarning = Kayıtlı ekran görüntüleriniz bir süre sonra silinecek. Screenshots, Haziran'dan itibaren çevrimiçi depolama olanağı sunmayacak. Arşivinizdeki görüntüleri saklamak istiyorsanız onları bilgisayarınıza indirin. -shutdownPageTitle = Screenshots değişiyor -shutdownPageDescription = Haziran ayından itibaren Screenshots çevrimiçi depolama olanağı sunmayacak. Arşivinizdeki ekran görüntülerinizi saklamak isterseniz hepsini topluca indirebilirsiniz. Bu özelliği kullandığınız için teşekkür eder, zahmet verdiysek özür dileriz. -shutdownPageContinue = Ekran görüntüleri almak, kopyalamak ve kaydetmek için Screenshots’ı eskisi gibi kullanmaya devam edebilirsiniz. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefox Screenshots’taki yenilikler neler? -onboardingPromoMessage = Firefox Hesabı ile Screenshots’a giriş yaparsanız daha fazla şey yapabilirsiniz: -onboardingPromoMessageListItem1 = Arşivinize tüm cihazlarınızdan erişebilirsiniz -onboardingPromoMessageListItem2 = Sevdiğiniz ekran görüntülerini sonsuza dek saklayabilirsiniz -onboardingPromoDismissButton = Kapat - .title = Kapat -onboardingPromoSigninButton = Giriş yap - .title = Giriş yap - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Koşullar -footerLinkPrivacy = Gizlilik Bildirimi -footerReportShot = Görüntüyü raporla - .title = Bu görüntüyü kötüye kullanım, spam veya diğer sorunlar için bildirin -footerLinkFaqs = SSS -footerLinkDMCA = Telif hakkı ihlali bildir -footerLinkDiscourse = Görüş bildir -footerLinkRemoveAllData = Tüm verileri sil - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } oluşturuluyor -creatingPageTitleDefault = sayfa -creatingPageWaitMessage = Görüntünüz kaydediliyor… - -## Home page - -homePageDescription = - .content = Tarayıcıyla bütünleşik ekran görüntüsü aracı. Firefox’la internette gezinirken ekran görüntüleri alabilir, kaydedebilir ve paylaşabilirsiniz. -homePageButtonMyShots = Görüntülerime git -homePageTeaser = Çok Yakında... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Ücretsiz indir -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots nasıl çalışıyor? -homePageGetStartedTitle = Başlayın -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Adres çubuğundaki sayfa eylemleri menüsünden “Ekran görüntüsü al”a tıklayın. Tarayıcı pencerenizin üzerinde Screenshots menüsü belirecek. -homePageCaptureRegion = Bir bölgeyi yakalama -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Tıklayıp sürükleyerek yakalamak istediğiniz bölgeyi seçin. İstediğiniz bölgenin üstüne fareyle gidip bir kez tıklarsanız Screenshots bölgeyi sizin için seçer. Seçimden memnunsanız “Kaydet” düğmesine tıklayarak ekrna görüntüsünü internete yükleyebilir veya ok düğmesine tıklayarak bilgisayarınıza indirebilirsiniz. -homePageCapturePage = Tüm sayfayı yakalama -homePageCapturePageDescription = Sayfanın tamamını kaydetmek isterseniz sağ üst köşedeki düğmeleri kullanın. “Görünür alanı kaydet” düğmesi, sayfayı kaydırmadan pencerede gördüğünüz kısmı yakalar. “Tüm sayfayı kaydet” ise sayfadaki her şeyi yakalar. -homePageDownloadCopy = İster indir ister kopyala -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Screenshots, seçiminizi indirmenize veya anında panoya kopyalamanıza izin verir. -homePageLegalLink = Yasal Notlar -homePagePrivacyLink = Gizlilik -homePageTermsLink = Koşullar -homePageCookiesLink = Çerezler - -## Leave Screenshots page - -leavePageRemoveAllData = Tüm verileri sil -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Hesabınızı silmek için Firefox Screenshots’ı yüklemiş veya Firefox Hesabınıza giriş yapmış olmalısınız -leavePageErrorGeneric = Bir hata oluştu -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Bu işlem, tüm Firefox Screenshots verilerinizi kalıcı olarak silecektir. -leavePageButtonProceed = Devam et -leavePageButtonCancel = iptal -leavePageDeleted = Tüm ekran görüntüleriniz silindi! - -## Not Found page - -notFoundPageTitle = Sayfa bulunamadı -notFoundPageIntro = Hay aksi! -notFoundPageDescription = Sayfa bulunamadı. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Ekran görüntüsü: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Silme tarihi kaydedilemedi -shotPageAlertErrorDeletingShot = Görüntü silinemedi -shotPageAlertErrorUpdatingTitle = Başlık kaydetme hatası -shotPageConfirmDelete = Bu görüntüyü kalıcı olarak silmek istediğinizden emin misiniz? -shotPageShareButton = - .title = Paylaş -shotPageCopyButton = - .title = Resmi panoya kopyala -shotPageCopyActionLabel = Kopyala -shotPageCopied = Kopyalandı -shotPageShareFacebook = - .title = Facebook'ta paylaş -shotPageShareTwitter = - .title = Twitter'da paylaş -shotPageSharePinterest = - .title = Pinterest'te paylaş -shotPageShareEmail = - .title = Bağlantıyı e-posta ile paylaş -shotPageShareLink = Bu görüntünün paylaşabileceğiniz linki: -shotPagePrivacyMessage = Linke sahip olan herkes bu görüntüyü görebilir. -shotPageCopyImageText = - .label = Resim metnini kopyala -shotPageConfirmDeletion = Bu görüntüyü kalıcı olarak silmek istediğinizden emin misiniz? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Hiçbir şey yapmazsanız bu görüntü kalıcı olarak silinecektir. -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date } tarihine kadar geri yükle -shotPageExpiredMessage = Bu görüntünün süresi dolmuştur. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Görüntünün alındığı sayfanın orijinali: -shotPageDeleteButton = - .title = Bu görüntüyü sil -shotPageDownloadShot = - .title = İndir -shotPageEditButton = - .title = Bu resmi düzenle -shotPagefavoriteButton = - .title = Bu görüntüyü favorilerime ekle -shotPageBackToHomeButton = - .title = Ana sayfa -shotPageAllShotsButton = - .title = Tüm görüntüler -shotPageScreenshotsDescriptionServerless = Ekran görüntüsü almayı basitleştirdik. Firefox’tan çıkmadan ekran görüntülerini yakalayıp indirebilirsiniz. -shotPageDMCAMessage = Üçüncü bir şahsın telif hakkı iddiası nedeniyle bu görüntü artık kullanılamaz. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Daha fazla bilgi almak isterseniz { $dmca } adresine e-posta gönderebilirsiniz. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Ekran görüntüleriniz çok sayıda şikayet alırsa Firefox Screenshots hesabınızı kapatabiliriz. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Lütfen e-potanızda bu görüntünün adresini de belirtin: { $url } -shotPageKeepFor = Bu görüntü ne kadar süreyle saklansın? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Süre seçin -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Sonsuza dek ∞ -shotPageKeepTenMinutes = 10 dakika -shotPageKeepOneHour = 1 saat -shotPageKeepOneDay = 1 gün -shotPageKeepOneWeek = 1 hafta -shotPageKeepTwoWeeks = 2 hafta -shotPageKeepOneMonth = 1 ay -shotPageSaveExpiration = kaydet -shotPageCancelExpiration = iptal et -shotPageDoesNotExpire = silinmeyecek -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = silinecek -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = silindi -timeDiffJustNow = az önce -timeDiffMinutesAgo = 1 dakika önce -timeDiffHoursAgo = 1 saat önce -timeDiffDaysAgo = dün -timeDiffFutureSeconds = birkaç saniye sonra -timeDiffFutureMinutes = { $number } dakika sonra -timeDiffFutureHours = { $number } saat sonra -timeDiffFutureDays = yarın -errorThirdPartyCookiesEnabled = Bu görüntüyü siz kaydettiyseniz ve silemiyorsanız tarayıcınızın tercihlerinden üçüncü taraf çerezlerini geçici olarak etkinleştirmeniz gerekebilir. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Not alın! -promoMessage = Güncellenen düzenleme araçlarımızla görüntünüzü kırpabilir, işaretleyebilir, üzerine yazı yazabilirsiniz. -promoLink = Deneyin -promoCloseButton = - .title = Bildirimi kapat - -## Annotations - -annotationPenButton = - .title = Kalem -annotationHighlighterButton = - .title = Fosforlu kalem -annotationUndoButton = - .title = Geri al -annotationRedoButton = - .title = Yinele -annotationTextButton = - .title = Metin ekle -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Temizle -annotationCropButton = - .title = Kırp -annotationSaveEditButton = Kaydet - .title = Düzenlemeyi kaydet -annotationCancelEditButton = İptal - .title = Düzenlemeyi iptal et -annotationCropConfirmButton = Onayla - .title = Seçimi onayla -annotationCropCancelButton = İptal - .title = Seçimi iptal et -annotationColorWhite = - .title = Beyaz -annotationColorBlack = - .title = Siyah -annotationColorRed = - .title = Kırmızı -annotationColorGreen = - .title = Yeşil -annotationColorBlue = - .title = Mavi -annotationColorYellow = - .title = Sarı -annotationColorPurple = - .title = Mor -annotationColorSeaGreen = - .title = Deniz yeşili -annotationColorGrey = - .title = Gri -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Metin boyutu -# Values shown in text size selection dropdown -textSizeSmall = Küçük -textSizeMedium = Orta -textSizeLarge = Büyük -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Onayla - .title = Onayla -textToolCancelButton = İptal - .title = İptal -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Merhaba - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Bir hata oluştu -copyImageErrorMessage = Görüntü panoya kopyalanamadı. - -## Settings Page - -settingsDisconnectButton = Bağlantıyı kes - .title = Bağlantıyı kes -settingsGuestAccountMessage = Konuk hesabı -settingsSignInButton = Giriş yap - .title = Giriş yap -SettingsPageHeader = Firefox Screenshots Ayarları -settingsFirefoxAccountSubHeader = Firefox Hesabı -settingsClosePreferences = - .title = Tercihleri kapat -settingsFxaDisconnectAlertMessage = Bu cihazın Firefox Hesabınızla bağlantısını kesmek istediğinizden emin misiniz? -settingsFxaDisconnectDescription = Çıkış yaparsanız ekran görüntülerinize erişmek istediğinizde yeniden giriş yapmanız gerekecektir. -settingsFxaConnectDescription = Ekran görüntülerinize tüm cihazlarınızdan erişmek için giriş yapabilirsiniz. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Görüntü silme hatası: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Ekran görüntülerim: { $searchTerm } araması -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Sayfa oluşturma hatası: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Görüntülerimde ara -shotIndexPageNoShotsMessage = Kayıtlı görüntünüz yok. -shotIndexPageNoShotsInvitation = Hadi, bir şeyler kaydedin. -shotIndexPageLookingForShots = Görüntüleriniz aranıyor… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Aramanızla eşleşen bir görüntü bulamadık. -shotIndexPageMyShotsButton = - .title = Görüntülerim -shotIndexPageClearSearchButton = - .title = Aramayı temizle -shotIndexPageConfirmShotDelete = Bu görüntü silinsin mi? -shotIndexPagePreviousPage = - .title = Önceki sayfa -shotIndexPageNextPage = - .title = Sonraki sayfa -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Bu görüntü favorilerinizde olmadığı için silinecektir -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Bu görüntü favorilerinizde olduğu için zaman aşımına uğramayacak -shotIndexSyncedShot = - .title = Görüntü başka bir cihazdan alınmış -shotIndexAlertErrorFavoriteShot = Favori görüntü durumu güncellenirken hata oluştu - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Bu görüntüyü silmek istediğinizden emin misiniz? -shotDeleteCancel = Vazgeç - .title = Vazgeç -shotDeleteConfirm = Sil - .title = Sil - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Dışarı aktarmak için Dosya > Sayfayı farklı kaydet… seçeneğini kullanın. Ekran görüntülerinizi { $folder } klasöründe bulabilirsiniz - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots Ölçümleri -metricsPageTotalsQueryTitle = Toplam -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Screenshots’a bir bakış -metricsPageTotalsQueryDevices = Toplam kayıtlı cihaz sayısı -metricsPageTotalsQueryActiveShots = Aktif görüntü -metricsPageTotalsQueryExpiredShots = Süresi dolmuş (ama kurtarılabilir) -metricsPageTotalsQueryExpiredDeletedShots = Süresi dolmuş (ve silinmiş) -metricsPageShotsQueryTitle = Günlük ekran görüntüleri -metricsPageShotsQueryDescription = Her bir gün oluşturulan ekran görüntüsü sayısı (son 30 günde) -metricsPageShotsQueryCount = Görüntü sayısı -metricsPageShotsQueryDay = Gün -metricsPageUsersQueryTitle = Günlük kullanıcı -metricsPageUsersQueryDescription = En az bir görüntü oluşturan kullanıcı sayısı (son 30 günde) -metricsPageUsersQueryCount = Kullanıcı sayısı -metricsPageUsersQueryDay = Gün -metricsPageUserShotsQueryTitle = Kullanıcı başına ekran görüntüsü sayısı -metricsPageUserShotsQueryDescription = Toplam N ekran görüntüsüne sahip kullanıcı sayısı -metricsPageUserShotsQueryCount = Kullanıcı sayısı -metricsPageUserShotsQueryShots = Tahmini etkin (süresi dolmamış) ekran görüntüsü sayısı -metricsPageRetentionQueryTitle = Haftalık bellek -metricsPageRetentionQueryDescription = Haftaya göre gruplanmış olarak kullanıcının ilk ve son ekran görüntüsü alma tarihleri arasında geçen süre -metricsPageRetentionQueryUsers = Kullanıcı sayısı -metricsPageRetentionQueryDays = Kullanıcının ilk ve son ekran görüntüsü alma tarihleri arasında geçen gün -metricsPageRetentionQueryFirstWeek = İlk ekran görüntüsü alındıktan bu yana geçen hafta sayısı -metricsPageTotalRetentionQueryTitle = Toplam bellek -metricsPageTotalRetentionQueryDescription = Haftaya göre gruplanmış olarak kullanıcıların ekran görüntüsü oluşturma süresinin uzunluğu -metricsPageTotalRetentionQueryUsers = Kullanıcı sayısı -metricsPageTotalRetentionQueryDays = Kullanıcının ekran görüntüsü oluşturma gün sayısı -metricsPageVersionQueryTitle = Eklenti sürümü -metricsPageVersionQueryDescription = Son 14 günde giriş sırasında kullanılan eklenti sürümü -metricsPageVersionQueryUsers = Giriş yapan kullanıcı sayısı -metricsPageVersionQueryVersion = Eklenti sürümü -metricsPageVersionQueryLastSeen = Gün -metricsPageHeader = Ölçümler -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Oluşturma: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (veritabanı süresi: { $time } ms) diff --git a/locales/uk/server.ftl b/locales/uk/server.ftl deleted file mode 100644 index 12cf26972a..0000000000 --- a/locales/uk/server.ftl +++ /dev/null @@ -1,403 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Мої знімки -gHomeLink = Домівка -gNoShots = - .alt = Знімків не знайдено -gScreenshotsDescriptionServerless = Робити знімки екрану тепер простіше. Створюйте і завантажуйте знімки екрану, не покидаючи Firefox. - -## Header - -buttonSettings = - .title = Налаштування -buttonSignIn = - .title = Увійти -screenshotsLogo = - .title = Домівка Screenshots -bannerSignIn = Зареєструйтеся або увійдіть, щоб мати доступ до знімків на всіх пристроях та зберігати обрані назавжди. -bannerUpsell = { gScreenshotsDescription } Отримати Firefox -shutdownWarning = Термін зберігання знімків екрану невдовзі завершиться. Починаючи з Червня, Screenshots більше не пропонуватимуть онлайн сховище. Хочете зберегти свої знімки? Завантажте їх на свій комп'ютер. -shutdownPageTitle = Screenshots змінюється -shutdownPageDescription = Починаючи з Червня, Screenshots більше не пропонуватимуть онлайн сховище. Хочете зберегти свої знімки? Завантажте їх поодинці чи всі разом. Дякуємо за користування цією функцією та перепрошуємо за незручності. -shutdownPageContinue = Сподіваємося, ви продовжите використовувати Screenshots для створення, копіювання та завантаження знімків. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Що нового в Firefox Screenshots? -onboardingPromoMessage = Тепер увійдіть до Screenshots за допомогою облікового запису Firefox і робіть більше: -onboardingPromoMessageListItem1 = Отримуйте доступ до своєї бібліотеки на всіх пристроях -onboardingPromoMessageListItem2 = Зберігайте обрані знімки назавжди -onboardingPromoDismissButton = Відхилити - .title = Відхилити -onboardingPromoSigninButton = Увійти - .title = Увійти - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Умови -footerLinkPrivacy = Повідомлення про приватність -footerReportShot = Повідомити про знімок - .title = Повідомити про порушення, спам чи інші проблеми з цим знімком. -footerLinkFaqs = ЧаП -footerLinkDMCA = Повідомити про порушення прав -footerLinkDiscourse = Залишити відгук -footerLinkRemoveAllData = Видалити всі дані - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Створення { $title } -creatingPageTitleDefault = сторінка -creatingPageWaitMessage = Зберігаємо ваш знімок… - -## Home page - -homePageDescription = - .content = Прості знімки прямо в браузері. Робіть, зберігайте й діліться знімками екрану під час роботи в Інтернеті з Firefox. -homePageButtonMyShots = Перейти до моїх знімків -homePageTeaser = Скоро... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Безплатне завантаження -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Як працює Firefox Screenshots -homePageGetStartedTitle = Початок роботи -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Оберіть піктограму Screenshots в меню дій для сторінки в панелі адреси і перед вами з'явиться меню Screenshots. -homePageCaptureRegion = Захопити область -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Натисніть і потягніть, щоб вибрати область для знімку. Або просто наведіть і клацніть мишею — буде обрано область. Якщо знімок вам подобається, натисніть Зберегти, щоб отримати доступ до своїх знімків в мережі, або стрілку вниз для завантаження на комп'ютер. -homePageCapturePage = Захопити сторінку -homePageCapturePageDescription = Використовуйте кнопки справа вгорі для захоплення цілих сторінок. Кнопка Зберегти видиму область захопить область, яку видно без прокручування, а кнопка Зберегти всю сторінку захопить сторінку повністю. -homePageDownloadCopy = Завантажити чи копіювати -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Зробіть свій найкращий знімок. Screenshots дозволяють вам завантажувати чи копіювати його копію безпосередньо в буфер обміну. -homePageLegalLink = Юридична інформація -homePagePrivacyLink = Приватність -homePageTermsLink = Умови -homePageCookiesLink = Куки - -## Leave Screenshots page - -leavePageRemoveAllData = Видалити усі дані -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Щоб видалити обліковий запис, у вас повинен бути встановлений Firefox Screenshots або виконаний вхід в обліковий запис Firefox -leavePageErrorGeneric = Сталася помилка -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Ця дія назавжди видалить усі ваші дані Firefox Screenshots. -leavePageButtonProceed = Продовжити -leavePageButtonCancel = Скасувати -leavePageDeleted = Усі ваші знімки були стерті! - -## Not Found page - -notFoundPageTitle = Сторінку не знайдено -notFoundPageIntro = Отакої. -notFoundPageDescription = Сторінку не знайдено. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Знімок екрану: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Помилка при збереженні терміну зберігання -shotPageAlertErrorDeletingShot = Помилка при видаленні знімку -shotPageAlertErrorUpdatingTitle = Помилка при збереженні назви -shotPageConfirmDelete = Ви впевнені, що хочете назавжди видалити цей знімок? -shotPageShareButton = - .title = Поділитися -shotPageCopyButton = - .title = Копіювати зображення в буфер обміну -shotPageCopyActionLabel = Копіювати -shotPageCopied = Скопійовано -shotPageShareFacebook = - .title = Поділитися на Facebook -shotPageShareTwitter = - .title = Поділитися у Twitter -shotPageSharePinterest = - .title = Поділитися на Pinterest -shotPageShareEmail = - .title = Поділитися через електронну пошту -shotPageShareLink = Отримати публічне посилання на цей знімок: -shotPagePrivacyMessage = Будь-хто, хто має це посилання, може переглядати цей знімок. -shotPageCopyImageText = - .label = Копіювати текст зображення -shotPageConfirmDeletion = Ви впевнені, що хочете назавжди видалити цей знімок? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Якщо ви нічого не будете робити, знімок буде видалений назавжди . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = подовжено до { $date } -shotPageExpiredMessage = Термін зберігання знімку скінчився. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Сторінка, з якої створений цей знімок: -shotPageDeleteButton = - .title = Видалити цей знімок -shotPageDownloadShot = - .title = Завантажити -shotPageEditButton = - .title = Редагувати це зображення -shotPagefavoriteButton = - .title = Додати знімок до обраних -shotPageBackToHomeButton = - .title = Домівка -shotPageAllShotsButton = - .title = Всі знімки -shotPageScreenshotsDescriptionServerless = Робити знімки екрану тепер простіше. Створюйте і завантажуйте знімки екрану, не покидаючи Firefox. -shotPageDMCAMessage = Цей знімок більше недоступний через порушення авторських прав третьої сторони. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Будь ласка, напишіть на { $dmca }, щоб запитати додаткову інформацію. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Якщо на ваші знімки поскаржилися кілька разів, ми можемо заблокувати вам доступ до Firefox Screenshots. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Будь ласка, додайте до вашого листа посилання на цей знімок: { $url } -shotPageKeepFor = Як довго буде зберігатися цей знімок? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Виберіть час -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Необмежено ∞ -shotPageKeepTenMinutes = 10 хвилин -shotPageKeepOneHour = 1 година -shotPageKeepOneDay = 1 день -shotPageKeepOneWeek = 1 тиждень -shotPageKeepTwoWeeks = 2 тижні -shotPageKeepOneMonth = 1 місяць -shotPageSaveExpiration = зберегти -shotPageCancelExpiration = скасувати -shotPageDoesNotExpire = необмежений строк -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = спливає -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = сплив -timeDiffJustNow = щойно -timeDiffMinutesAgo = - { $number -> - [one] хвилину тому - [few] { $number } хвилини тому - *[other] { $number } хвилин тому - } -timeDiffHoursAgo = - { $number -> - [one] годину тому - [few] { $number } години тому - *[other] { $number } годин тому - } -timeDiffDaysAgo = - { $number -> - [one] вчора - [few] { $number } дні тому - *[other] { $number } днів тому - } -timeDiffFutureSeconds = за кілька секунд -timeDiffFutureMinutes = - { $number -> - [one] за хвилину - [few] за { $number } хвилини - *[other] за { $number } хвилин - } -timeDiffFutureHours = - { $number -> - [one] за годину - [few] за { $number } години - *[other] за { $number } годин - } -timeDiffFutureDays = - { $number -> - [one] завтра - [few] за { $number } дні - *[other] за { $number } днів - } -errorThirdPartyCookiesEnabled = Якщо ви зробили цей знімок і не можете його видалити, можливо, вам слід тимчасово увімкнути сторонні куки в налаштуваннях браузера. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Робіть примітки! -promoMessage = Оновлені засоби редагування дозволяють обрізати, підсвічувати та навіть додавати текст до знімків. -promoLink = Спробуйте -promoCloseButton = - .title = Закрити сповіщення - -## Annotations - -annotationPenButton = - .title = Олівець -annotationHighlighterButton = - .title = Маркер -annotationUndoButton = - .title = Скасувати -annotationRedoButton = - .title = Повторити -annotationTextButton = - .title = Додати текст -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Очистити -annotationCropButton = - .title = Обрізати -annotationSaveEditButton = Зберегти - .title = Зберегти зміни -annotationCancelEditButton = Скасувати - .title = Скасувати зміни -annotationCropConfirmButton = Підтвердити - .title = Підтвердити вибір -annotationCropCancelButton = Скасувати - .title = Скасувати вибір -annotationColorWhite = - .title = Білий -annotationColorBlack = - .title = Чорний -annotationColorRed = - .title = Червоний -annotationColorGreen = - .title = Зелений -annotationColorBlue = - .title = Блакитний -annotationColorYellow = - .title = Жовтий -annotationColorPurple = - .title = Бузковий -annotationColorSeaGreen = - .title = Зелений чай -annotationColorGrey = - .title = Сірий -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Розмір тексту -# Values shown in text size selection dropdown -textSizeSmall = Малий -textSizeMedium = Середній -textSizeLarge = Великий -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Підтвердити - .title = Підтвердити -textToolCancelButton = Скасувати - .title = Скасувати -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Привіт - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Щось пішло не так -copyImageErrorMessage = Не вдалося скопіювати ваш знімок в буфер обміну. - -## Settings Page - -settingsDisconnectButton = Від'єднатися - .title = Від'єднатися -settingsGuestAccountMessage = Обліковий запис гостя -settingsSignInButton = Увійти - .title = Увійти -SettingsPageHeader = Налаштування Firefox Screenshots -settingsFirefoxAccountSubHeader = Обліковий запис Firefox -settingsClosePreferences = - .title = Закрити налаштування -settingsFxaDisconnectAlertMessage = Ви впевнені, що хочете від'єднати цей пристрій від облікового запису Firefox? -settingsFxaDisconnectDescription = Якщо ви вийдете, вам необхідно буде увійти знову для отримання доступу до своїх знімків. -settingsFxaConnectDescription = Ви можете увійти, щоб отримати доступ до своїх знімків екрана на різних пристроях. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Помилка видалення знімку: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Мої знімки: пошук { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Помилка обробки сторінки: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Пошук моїх знімків -shotIndexPageNoShotsMessage = Немає збережених знімків. -shotIndexPageNoShotsInvitation = Ну ж бо, створіть кілька. -shotIndexPageLookingForShots = Шукаємо ваші знімки... -shotIndexPageNoSearchResultsIntro = Хмм -shotIndexPageNoSearchResults = Ми не можемо знайти знімки за вашим запитом. -shotIndexPageMyShotsButton = - .title = Мої знімки -shotIndexPageClearSearchButton = - .title = Очистити пошук -shotIndexPageConfirmShotDelete = Видалити цей знімок? -shotIndexPagePreviousPage = - .title = Попередня сторінка -shotIndexPageNextPage = - .title = Наступна сторінка -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Це не обраний знімок, тому він має обмежений термін зберігання -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Це обраний знімок, тому він має необмежений термін дії -shotIndexSyncedShot = - .title = Знімок зроблено на іншому пристрої -shotIndexAlertErrorFavoriteShot = Помилка при оновленні стану обраного знімка - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Ви дійсно хочете видалити цей знімок? -shotDeleteCancel = Скасувати - .title = Скасувати -shotDeleteConfirm = Видалити - .title = Видалити - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Для експорту використайте меню: Файл > Зберегти сторінку як… і ви знайдете свої знімки в теці { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Метрики Firefox Screenshots -metricsPageTotalsQueryTitle = Разом -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Огляд Screenshots -metricsPageTotalsQueryDevices = Всього зареєстрованих пристроїв -metricsPageTotalsQueryActiveShots = Активні знімки -metricsPageTotalsQueryExpiredShots = Термін зберігання сплив (можна відновити) -metricsPageTotalsQueryExpiredDeletedShots = Термін зберігання сплив (знімок видалено) -metricsPageShotsQueryTitle = Знімків на день -metricsPageShotsQueryDescription = Кількість знімків, створених за кожен день (за останні 30 днів) -metricsPageShotsQueryCount = Кількість знімків -metricsPageShotsQueryDay = День -metricsPageUsersQueryTitle = Користувачів за день -metricsPageUsersQueryDescription = Кількість користувачів, які створили хоча б один знімок, за день (останні 30 днів) -metricsPageUsersQueryCount = Кількість користувачів -metricsPageUsersQueryDay = День -metricsPageUserShotsQueryTitle = Кількість знімків на користувача -metricsPageUserShotsQueryDescription = Кількість користувачів, які зробили загалом близько N знімків -metricsPageUserShotsQueryCount = Кількість користувачів -metricsPageUserShotsQueryShots = Приблизна кількість активних знімків (термін зберігання яких не сплив) -metricsPageRetentionQueryTitle = Збережень за тиждень -metricsPageRetentionQueryDescription = Кількість днів від першого знімка користувача до останнього, згруповано за початком тижня -metricsPageRetentionQueryUsers = Кількість користувачів -metricsPageRetentionQueryDays = Днів від першого до останнього знімка користувача -metricsPageRetentionQueryFirstWeek = Тиждень, на якому користувач створив перший знімок -metricsPageTotalRetentionQueryTitle = Загальна кількість -metricsPageTotalRetentionQueryDescription = Час, який користувачі витрачають на створення знімків, згрупований по тижнях -metricsPageTotalRetentionQueryUsers = Кількість користувачів -metricsPageTotalRetentionQueryDays = Дні, в які користувач створював знімки екрану -metricsPageVersionQueryTitle = Версія додатку -metricsPageVersionQueryDescription = Версія додатку, що використовується під час входу, за останні 14 днів -metricsPageVersionQueryUsers = Кількість користувачів, що входять -metricsPageVersionQueryVersion = Версія додатку -metricsPageVersionQueryLastSeen = День -metricsPageHeader = Метрики -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Згенеровано: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (час бази даних: { $time }мс) diff --git a/locales/ur/server.ftl b/locales/ur/server.ftl deleted file mode 100644 index 22250d4074..0000000000 --- a/locales/ur/server.ftl +++ /dev/null @@ -1,250 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = میری شاٹس -gHomeLink = ابتدائی صفحہ -gNoShots = - .alt = کوئی شاٹس نہیں ملی - -## Header - - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = شرائط -footerLinkPrivacy = رازداری کا نوٹس -footerLinkFaqs = عمومی سوالات -footerLinkDiscourse = رائے دیں -footerLinkRemoveAllData = تمام کوائف ہٹائیں - -## Creating page - -creatingPageTitleDefault = صفحہ -creatingPageWaitMessage = آپکی شاٹ محفوظ کررہے ہیں - -## Home page - -homePageTeaser = جلد آرہا ہے… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = مفت ڈائونلوڈ کریں -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots کیسے کام کرتا ہے -homePageGetStartedTitle = شروع کریں -homePageCaptureRegion = ایک خطے پر قبضہ کریں -homePageCapturePage = ایک صفحہ پر قبضہ کریں -homePageSaveShare = محفوظ کریں اور شیئر کریں -homePageLegalLink = قانونی -homePagePrivacyLink = رازداری -homePageTermsLink = شرائط -homePageCookiesLink = کوکیاں - -## Leave Screenshots page - -leavePageRemoveAllData = تمام کوائف ہٹائیں -leavePageErrorGeneric = ایک غلطی ہوئی ہے: -leavePageButtonProceed = آگے بڑھیں -leavePageButtonCancel = منسوخ کریں -leavePageDeleted = آپ کی تمام اسکرین شاٹ مٹا دی گئی ہیں! - -## Not Found page - -notFoundPageTitle = صفہہ نہیں ملا -notFoundPageIntro = اف -notFoundPageDescription = صفہہ نہیں ملا۔ - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = اسکرین شاٹ:ی { $originalTitle } -shotPageAlertErrorUpdatingTitle = عنوان محفوظ کرتے میں نقص ہے -shotPageConfirmDelete = کیا آپ واقعی اس شا ٹ کو مکمل طور پر حذف کرنا چاہتے ہیں؟ -shotPageShareButton = - .title = شیئر -shotPageCopied = نقل شدہ -shotPageShareFacebook = - .title = Facebook پر شیئر کریں -shotPageShareTwitter = - .title = Twitter پر شیئر کریں -shotPageSharePinterest = - .title = Pinterest پر شیئر کریں -shotPageShareEmail = - .title = ایک ربط بزریعہ ای میل شیئر کریں -shotPagePrivacyMessage = جس کسی کہ پاس بھی یہ ربط موجود ہو وہ یہ شاٹ دیکھ سکتا ہے۔ -shotPageCopyImageText = - .label = نقش کا متن نقل کریں -shotPageDeleteButton = - .title = اس شاٹ کو حزف کریں -shotPageDownloadShot = - .title = ڈائونلوڈ -shotPageEditButton = - .title = اس نقش کی تدویین کریں -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = وقت کا انتخاب کریں -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = غیر معینہ مدت تک ∞ -shotPageKeepTenMinutes = ۱۰ منٹ -shotPageKeepOneHour = ۱ گھنٹہ -shotPageKeepOneDay = ۱ دن -shotPageKeepOneWeek = ۱ ہفتہ -shotPageKeepTwoWeeks = ۲ ہفتے -shotPageKeepOneMonth = ۱ ماہ -shotPageSaveExpiration = محفوظ کریں -shotPageCancelExpiration = منسوخ کریں -timeDiffJustNow = ابھی -timeDiffMinutesAgo = - { $number -> - [one] ۱ منٹ پہلے - *[other] { $number } منٹ پہلے - } -timeDiffHoursAgo = - { $number -> - [one] ۱ گھنٹا پہلے - *[other] { $number } گھنٹے پہلے - } -timeDiffDaysAgo = - { $number -> - [one] گزشتہ روز - *[other] { $number } د ن پہلے - } -timeDiffFutureSeconds = چند سیکنڈ میں -timeDiffFutureHours = - { $number -> - [one] ۱ گھنٹے میں - *[other] { $number } گھنٹوں میں - } -timeDiffFutureDays = - { $number -> - [one] کل - *[other] { $number } دنوں میں - } - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = نوٹ لے! - -## Annotations - -annotationPenButton = - .title = قلم -annotationHighlighterButton = - .title = روشن گر قلم -annotationUndoButton = - .title = واپس کریں -annotationTextButton = - .title = متن شامل کریں -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = صاف کریں -annotationCropButton = - .title = کراپ کریں -annotationSaveEditButton = محفوظ کریں - .title = تدوین محفوظ کریں -annotationCancelEditButton = منسوخ کریں - .title = تدوین کاری منسوخ کریں -annotationCropConfirmButton = تصدیق کریں - .title = انخاب کیتصدیق کریں -annotationCropCancelButton = منسوخ کریں - .title = انتخاب منسوخ کریں -annotationColorWhite = - .title = سفيد -annotationColorBlack = - .title = سياہ -annotationColorRed = - .title = لال -annotationColorGreen = - .title = سبز -annotationColorBlue = - .title = نیلا -annotationColorYellow = - .title = پیلا -annotationColorPurple = - .title = جامنی -annotationColorSeaGreen = - .title = کائی -annotationColorGrey = - .title = سلیٹی -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = متن کا ماپ -# Values shown in text size selection dropdown -textSizeSmall = چھوٹا -textSizeMedium = درمیانہ -textSizeLarge = بڑا -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = تصدیق کریں - .title = تصدیق کریں -textToolCancelButton = منسوخ کریں - .title = منسوخ کریں -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = ہیلو، - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = کچھ غلط ہو گیا - -## Settings Page - -settingsDisconnectButton = منقطع - .title = منقطع -settingsGuestAccountMessage = مہمان اکاؤنٹ -settingsSignInButton = سائن ان - .title = سائن ان -settingsClosePreferences = - .title = ترجیحات بند کریں - -## Shotindex page - -shotIndexPageSearchPlaceholder = - .placeholder = میری شاٹس تلاش کریں -shotIndexPageNoShotsInvitation = جائیں کچھ تخلیق کریں -shotIndexPageLookingForShots = اپنی شاٹٹس تلاش کر رہے ہیں… -shotIndexPageNoSearchResultsIntro = ہمم -shotIndexPageClearSearchButton = - .title = تلاش حزف کریں -shotIndexPageConfirmShotDelete = اس شاٹ کو حذف کریں؟ -shotIndexPagePreviousPage = - .title = پچھلا صفحہ -shotIndexPageNextPage = - .title = اگلا صفحہ - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = کیا آپ واقعی اس شاٹ کو حذف کرنا چاہتے ہیں؟ -shotDeleteCancel = منسوخ کریں - .title = منسوخ کریں -shotDeleteConfirm = حزف کریں - .title = جزف کریں - -## Metrics page -## All metrics strings are optional for translation - -metricsPageTotalsQueryTitle = کل -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = اس شاٹ کو حذف کریں -metricsPageTotalsQueryDevices = کل اندراج شدہ آلات -metricsPageTotalsQueryActiveShots = متحرک شاٹس -metricsPageTotalsQueryExpiredDeletedShots = رائدالمیاد (اور حزف شدہ) -metricsPageShotsQueryDay = دن -metricsPageUsersQueryTitle = دن کے جساب سے صارفین -metricsPageUsersQueryCount = صارفین کی تعداد -metricsPageUsersQueryDay = دن -metricsPageUserShotsQueryTitle = فی صارف شاٹس کی تعداد -metricsPageUserShotsQueryCount = صارفین کی تعداد -metricsPageRetentionQueryUsers = صارفین کی تعداد -metricsPageTotalRetentionQueryUsers = صارفین کی تعداد -metricsPageVersionQueryTitle = اظافہ-جات ورژن -metricsPageVersionQueryUsers = لاگ ان شدہ صارفین کی تعداد -metricsPageVersionQueryVersion = اظافہ-جات ورژن -metricsPageVersionQueryLastSeen = دن -metricsPageHeader = ۱۰ منٹ diff --git a/locales/uz/server.ftl b/locales/uz/server.ftl deleted file mode 100644 index 00adf0eaa0..0000000000 --- a/locales/uz/server.ftl +++ /dev/null @@ -1,383 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Skrinshotlar -gHomeLink = Uy -gNoShots = - .alt = Rasmlar topilmadi -gScreenshotsDescriptionServerless = Skrinshot olish juda oson. Firefoxdan chiqmasdan turib skrinshot olish va ularni yuklab olish mumkin. - -## Header - -buttonSettings = - .title = Sozlamalar -buttonSignIn = - .title = Kirish -screenshotsLogo = - .title = Screenshots bosh sahifasi -bannerSignIn = Turli qurilmalarda olingan skrinshotlar va saqlab qoʻyilgan sevimli skrinshotlaringizdan foydalanish uchunhisobingizga kiring yoki yangisini yarating. -bannerUpsell = { gScreenshotsDescription } Firefoxni yuklab olish -shutdownWarning = Saqlangan skrinshotlar yaqin orada oʻchib ketadi. Iyun oyidan boshlab skrinshotlarni onlayn saqlab boʻlmaydi. Kutubxonangizdagi skrinshotlarni saqlab qolishni istaysizmi? Unda ularni kompyuteringizga yuklab oling. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefox Screenshots taʼminotiga qanday yangi xususiyatlar qoʻshildi? -onboardingPromoMessage = Endi Firefox hisobingiz bilan skrinsholtarga kirish va boshqa koʻplab ishlarni amalga oshirish mumkin: -onboardingPromoMessageListItem1 = Barcha qurilmalaringizdagi kutubxonalaringizga kira olasiz -onboardingPromoMessageListItem2 = Sevimli skrinshotlaringizni saqlab qola olasiz -onboardingPromoDismissButton = Yopish - .title = Yopish -onboardingPromoSigninButton = Hisobga kirish - .title = Hisobga kirish - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Shartlar -footerLinkPrivacy = Maxfiylik eslatmalari -footerReportShot = Skrinshot ustidan shikoyat qilish - .title = Bu skrinshotni spam yoki haqorat sifatida xabar berish -footerLinkFaqs = Savol-javob -footerLinkDMCA = Mualliflik huquqi buzilgan deb xabar berish -footerLinkDiscourse = Mulohaza bildirish -footerLinkRemoveAllData = Barcha ma’lumotlarni tozalash - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = { $title } yaratilmoqda -creatingPageTitleDefault = sahifa -creatingPageWaitMessage = Rasm saqlanmoqda… - -## Home page - -homePageDescription = - .content = Endi brauzerda skrinshot olish osonlashdi. Internetga Firefox bilan kirganingizda skrinshot olish, saqlash va ulashish mumkin. -homePageButtonMyShots = Skrinshotlarga o‘tish -homePageTeaser = Tezda… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Bepul yuklab olish -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots’dan foydalanish -homePageGetStartedTitle = Boshlash -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Manzillar panelidagi sahifa amallari menyusidan Screenshots nishonchasini tanlang. Shundan keyin Screenshots menyusi brauzer oynasining tepa qismida paydo bo‘ladi. -homePageCaptureRegion = Hududni rasmga olish -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Sichqoncha tugmasini bosing va belgilash uchun kerakli hudud ustida surib tanlang. Yoki shunchaki sinchqonchani kerakli hudud usitga olib keling va bosing – Screenshots siz uchun hududni o‘zi tanlaydi. Sizga yoqdimi? Unda skrinshotlarni onlayn e’lon qilish uchun "Saqlash" tugmasini, kompyuterga yuklab olish uchun esa pastga qaragan ko‘rsatkich tugmasini bosing. -homePageCapturePage = Sahifani rasmga olish -homePageCapturePageDescription = Butun sahifani rasmga tushirish uchun tepa o‘ng burchakdagi tugmalardan foydalaning. "Ko‘rinadiganini saqlash" tugmasi bilan sizga ko‘rinib turgan hududni boshqa amal bajarmasdan rasmga olish va "To‘liq sahifani saqlash" bilan esa sahifani to‘liq rasmga olish mumkin. -homePageDownloadCopy = Yuklab olish yoki nusxa olish -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Eng zoʻr skrinshotni hoziroq oling. Endi skrinshotlarni tanlab yuklab olish yoki toʻgʻridan toʻgʻri vaqtinchalik xotiraga nusxa olish mumkin. -homePageLegalLink = Qonuniy -homePagePrivacyLink = Maxfiylik -homePageTermsLink = Shartlar -homePageCookiesLink = Kukilar - -## Leave Screenshots page - -leavePageRemoveAllData = Barcha ma’lumotlarni olib tashlash -leavePageErrorGeneric = Xato yuz berdi -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Firefox Skrinshotlar ma’lumotlari tozalab tashlanadi. -leavePageButtonProceed = Davom etish -leavePageButtonCancel = Bekor qilish -leavePageDeleted = Barcha skrinshotlar o‘chirildi! - -## Not Found page - -notFoundPageTitle = Sahifa topilmadi -notFoundPageIntro = Obbo. -notFoundPageDescription = Sahifa topilmadi. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Skrinshot: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Muddat saqlanmadi -shotPageAlertErrorDeletingShot = Skrinshot o‘chmadi -shotPageAlertErrorUpdatingTitle = Nomi saqlanmadi -shotPageConfirmDelete = Bu skrinshotni o‘chirmoqchimisiz? -shotPageShareButton = - .title = Bo‘lishish -shotPageCopyButton = - .title = Rasmga vaqtinchalik xotiraga nusxa olish -shotPageCopied = Nusxa olindi -shotPageShareFacebook = - .title = Facebookda bo‘lishish -shotPageShareTwitter = - .title = Twitterda bo‘lishish -shotPageSharePinterest = - .title = Pinterestda bo‘lishish -shotPageShareEmail = - .title = Havolani pochta orqali bo‘lishish -shotPageShareLink = Bu skrinshot uchun bo‘lishiladigan havolani olish: -shotPagePrivacyMessage = Bu havolani olgan har qanday inson skrinshotni ko‘ra oladi. -shotPageCopyImageText = - .label = Rasm matnidan nusxa olish -shotPageConfirmDeletion = Bu skrinshotni butunlay o‘chirib tashlamoqchimisiz? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Hech nima qilmasangiz, bu skrinshot o‘chib ketadi. -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = { $date }gacha tiklash -shotPageExpiredMessage = Bu skrinshot muddati tugadi. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Bu sahifa aslida quyidagidan yaratilgan: -shotPageDeleteButton = - .title = Bu skrinshotni o‘chirish -shotPageDownloadShot = - .title = Yuklab olish -shotPageEditButton = - .title = Bu rasmni tahrirlash -shotPagefavoriteButton = - .title = Bu skrinshotni sevimli deb belgilash -shotPageBackToHomeButton = - .title = Bosh sahifa -shotPageAllShotsButton = - .title = Barcha skrinshotlar -shotPageDMCAMessage = Bu skrinshot uchinchi tomonga tegishli intellektual boylik bo‘lganligi uchun endi mavjud emas. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Batafsil ma’lumot uchun { $dmca } pochtasiga xat yozing. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Agar sizga tegishli skrinshotlar ustidan bir necha marta shikoyat qilishsa, Firefox Screenshots xizmatini siz uchun bloklab qo‘yamiz. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Bu skrinshot havolasini xatingizga ilova qiling: { $url } -shotPageKeepFor = Bu skrinshot qancha vaqt saqlansin? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Vaqtni tanlang -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Abadiy ∞ -shotPageKeepTenMinutes = 10 daqiqa -shotPageKeepOneHour = 1 soat -shotPageKeepOneDay = 1 kun -shotPageKeepOneWeek = 1 hafta -shotPageKeepTwoWeeks = 2 hafta -shotPageKeepOneMonth = 1 oy -shotPageSaveExpiration = saqlash -shotPageCancelExpiration = bekor qilish -shotPageDoesNotExpire = muddati tugamaydi -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = muddati tugaydi -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = muddati tugagan -timeDiffJustNow = hozir -timeDiffMinutesAgo = - { $number -> - [one] 1 daqiqa oldin - *[other] { $number } daqiqa oldin - } -timeDiffHoursAgo = - { $number -> - [one] 1 soat oldin - *[other] { $number } soat oldin - } -timeDiffDaysAgo = - { $number -> - [one] kecha - *[other] { $number } kun oldin - } -timeDiffFutureSeconds = bir necha soniya oldin -timeDiffFutureMinutes = - { $number -> - [one] 1 daqiqa ichida - *[other] { $number } daqiqa ichida - } -timeDiffFutureHours = - { $number -> - [one] 1 soat ichida - *[other] { $number } soat ichida - } -timeDiffFutureDays = - { $number -> - [one] ertaga - *[other] { $number } kun ichida - } -errorThirdPartyCookiesEnabled = Bu skrinshotni olgan bo‘lsangiz, lekin o‘chira olmasangiz, brauzeringiz parametrlaridan uchinchi tomon kukilarini vaqtincha yoqib qo‘ying. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Diqqat! -promoMessage = Yangilangan tahrirlash vositalari kesish, ajratish va matn qo‘shish imkonini beradi. -promoLink = Sinab ko‘ring -promoCloseButton = - .title = Bildirishnomani yopish - -## Annotations - -annotationPenButton = - .title = Qalam -annotationHighlighterButton = - .title = Marker -annotationUndoButton = - .title = Bekor qilish -annotationRedoButton = - .title = Qaytarish -annotationTextButton = - .title = Matn qo‘shish -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Tozalash -annotationCropButton = - .title = Kesish -annotationSaveEditButton = Saqlash - .title = Tahrirlarni saqlash -annotationCancelEditButton = Bekor qilish - .title = Tahrirlarni bekor qilish -annotationCropConfirmButton = Tasdiqlash - .title = Tanlovni tasdiqlash -annotationCropCancelButton = Bekor qilish - .title = Tanlovni bekor qilish -annotationColorWhite = - .title = Oq -annotationColorBlack = - .title = Qora -annotationColorRed = - .title = Qizil -annotationColorGreen = - .title = Yashil -annotationColorBlue = - .title = Ko‘k -annotationColorYellow = - .title = Sariq -annotationColorPurple = - .title = Binafsharang -annotationColorSeaGreen = - .title = Dengiz yashili -annotationColorGrey = - .title = Kulrang -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Matn hajmi -# Values shown in text size selection dropdown -textSizeSmall = Kichik -textSizeMedium = O‘rta -textSizeLarge = Katta -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Tasdiqlash - .title = Tasdiqlash -textToolCancelButton = Bekor qilish - .title = Bekor qilish -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Salom - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Xatolik yuz berdi -copyImageErrorMessage = Skrinshotdan vaqtinchalik xotiraga nusxa olinmadi. - -## Settings Page - -settingsDisconnectButton = Uzish - .title = Uzish -settingsGuestAccountMessage = Mehmon hisobi -settingsSignInButton = Kirish - .title = Kirish -SettingsPageHeader = Firefox Screenshots sozlamalari -settingsClosePreferences = - .title = Parametrlarni yopish - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Skrinshot o‘chmadi: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Skrinsholar: { $searchTerm }ni izlash -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Sahifa renderlanmadi: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Skrinshotlarni izlash -shotIndexPageNoShotsMessage = Hech qanday skrinshot saqlanmagan -shotIndexPageNoShotsInvitation = Qani, bir nechta skrinshot yaratib ko‘ring -shotIndexPageLookingForShots = Skrinshotlaringiz qidirilmoqda… -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Qidiruvingiz bo‘yicha hech qanday skrinshot topilmadi. -shotIndexPageMyShotsButton = - .title = Skrinshotlar -shotIndexPageClearSearchButton = - .title = Qidiruvni tozalash -shotIndexPageConfirmShotDelete = Bu skrinshot o‘chirilsinmi? -shotIndexPagePreviousPage = - .title = Oldingi sahifa -shotIndexPageNextPage = - .title = Keyingi sahifa -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Bu sevimli skrinshot emas, shuning uchun saqlanish muddati tugaydi -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Bu sevimli skrinshot, shuning uchun abadiy saqlanadi -shotIndexSyncedShot = - .title = Skrinshot boshqa qurilmada olingan - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Bu skrinshotni o‘chirmoqchimisiz? -shotDeleteCancel = Bekor qilish - .title = Bekor qilish -shotDeleteConfirm = O‘chirsh - .title = O‘chirsh - -## Export page - - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefrox Screenshots statistikasi -metricsPageTotalsQueryTitle = Jami -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Skrinshotlar ko‘rinishi -metricsPageTotalsQueryDevices = Ro‘yxatdan o‘tgan jami qurilmalar -metricsPageTotalsQueryActiveShots = Faol skrinshotlar -metricsPageTotalsQueryExpiredShots = Muddat tugadi (lekin tiklasa bo‘ladi) -metricsPageTotalsQueryExpiredDeletedShots = Muddati tugadi (va o‘chirildi) -metricsPageShotsQueryTitle = Kunlik skrinshotlar -metricsPageShotsQueryDescription = Har kuni yaratilgan skrinshotlar soni (30 kun ichida) -metricsPageShotsQueryCount = Skrinshotlar soni -metricsPageShotsQueryDay = Kun -metricsPageUsersQueryTitle = Kunlik foydalanuvchilar -metricsPageUsersQueryDescription = Kunlik kamida bitta skrinshot yaratgan foydalanuvchilar soni (30 kun ichida) -metricsPageUsersQueryCount = Foydalanuvchilar soni -metricsPageUsersQueryDay = Kun -metricsPageUserShotsQueryTitle = Har bir foydalanuvchi olgan skrinshotlar soni -metricsPageUserShotsQueryDescription = Jami N ta skrinshot olgan foydalanuvchilar soni -metricsPageUserShotsQueryCount = Foydalanuvchilar soni -metricsPageUserShotsQueryShots = Faol (eskirmaydigan) skrinshotlarning taxminiy soni -metricsPageRetentionQueryTitle = Haftalik saqlash -metricsPageRetentionQueryDescription = Foydalanuvchining ilk olgan skrinshotidan eng so‘nggisigacha bo‘lgan kunlaar soni, hafta bo‘yicha guruhlangan -metricsPageRetentionQueryUsers = Foydalanuvchilar soni -metricsPageRetentionQueryDays = Foydalanuvchining ilk olgan skrinshotidan keyingi kunlar -metricsPageRetentionQueryFirstWeek = Foydalanuvchining ilk olgan skrinshoti haftasi -metricsPageTotalRetentionQueryTitle = Jami soni -metricsPageTotalRetentionQueryDescription = Skrinshot yaratish uchun foydalanuvchilar sarflagan vaqt, hafta bo‘yicha guruhlangan -metricsPageTotalRetentionQueryUsers = Foydalanuvchilar soni -metricsPageTotalRetentionQueryDays = Foydalanuvchi skrinshot yaratgan kunlar -metricsPageVersionQueryTitle = Qo‘shimcha dastur versiyasi -metricsPageVersionQueryDescription = Kirish vaqtida foydalanilgan qo‘shimcha dasturning versiyasi, so‘nggi 14 kun ichida -metricsPageVersionQueryUsers = Kirgan foydalanuvchilar soni -metricsPageVersionQueryVersion = Qo‘shimcha dastur versiyasi -metricsPageVersionQueryLastSeen = Kun -metricsPageHeader = Statistika -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Yaratilgan vaqti: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (ma’lumotlar bazasi vaqti: { $time }ms) diff --git a/locales/vi/server.ftl b/locales/vi/server.ftl deleted file mode 100644 index 75ee0ce691..0000000000 --- a/locales/vi/server.ftl +++ /dev/null @@ -1,379 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = Các ảnh chụp của tôi -gHomeLink = Trang chủ -gNoShots = - .alt = Không có ảnh chụp nào -gScreenshotsDescriptionServerless = Ảnh chụp màn hình được tạo đơn giản. Chụp và tải về ảnh chụp màn hình mà không cần rời khỏi Firefox. - -## Header - -buttonSettings = - .title = Cài đặt -buttonSignIn = - .title = Đăng nhập -screenshotsLogo = - .title = Trang chủ Screenshots -bannerSignIn = Đăng nhập hoặc đăng ký để truy cập ảnh của bạn trên các thiết bị và lưu các mục yêu thích của bạn mãi mãi. -bannerUpsell = { gScreenshotsDescription } Tải Firefox ngay -shutdownWarning = Ảnh chụp màn hình đã lưu sắp hết hạn. Bắt đầu từ tháng 6, Screenshots sẽ không còn cung cấp lưu trữ trực tuyến. Bạn muốn giữ bức ảnh từ thư viện của bạn? Tải chúng xuống máy tính của bạn. -shutdownPageTitle = Screenshots đang thay đổi -shutdownPageDescription = Bắt đầu từ tháng 6, Screenshots sẽ không còn cung cấp lưu trữ trực tuyến. Bạn muốn giữ bức ảnh từ thư viện của bạn? Tải xuống các ảnh riêng lẻ hoặc theo đợt. Cảm ơn bạn đã sử dụng tính năng này và chúng tôi xin lỗi vì sự bất tiện này. -shutdownPageContinue = Chúng tôi hy vọng bạn sẽ tiếp tục sử dụng Screenshots để chụp, sao chép và tải xuống ảnh. -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Có gì mới trong Firefox Screenshots? -onboardingPromoMessage = Bây giờ, hãy đăng nhập vào Screenshots bằng Tài khoản Firefox và thực hiện thêm: -onboardingPromoMessageListItem1 = Truy cập thư viện của bạn trên tất cả các thiết bị của bạn -onboardingPromoMessageListItem2 = Lưu trữ ảnh yêu thích của bạn mãi mãi -onboardingPromoDismissButton = Bỏ qua - .title = Bỏ qua -onboardingPromoSigninButton = Đăng nhập - .title = Đăng nhập - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = Điều khoản -footerLinkPrivacy = Chính sách riêng tư -footerReportShot = Báo cáo ảnh chụp - .title = Báo cáo ảnh chụp này vì lạm dụng, spam hay các vấn đề khác -footerLinkFaqs = Câu hỏi thường gặp -footerLinkDMCA = Báo cáo IP vi phạm -footerLinkDiscourse = Gửi phản hồi -footerLinkRemoveAllData = Xóa tất cả dữ liệu - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = Đang tạo { $title } -creatingPageTitleDefault = trang -creatingPageWaitMessage = Đang lưu ảnh chụp… - -## Home page - -homePageDescription = - .content = Bạn có thể tạo các ảnh chụp màn hình trực quan trong trình duyệt của mình. Bạn có thể chụp, lưu và chia sẻ ảnh chụp màn hình khi duyệt web bằng Firefox. -homePageButtonMyShots = Đi đến ảnh chụp của tôi -homePageTeaser = Sắp ra mắt ... -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = Tải về miễn phí -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Cách để Firefox Screenshots làm việc -homePageGetStartedTitle = Bắt đầu -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = Chọn biểu tượng Ảnh chụp màn hình từ trình đơn tác vụ trên trang trong thanh địa chỉ và trình đơn Ảnh chụp màn hình sẽ xuất hiện trên đầu cửa sổ trình duyệt của bạn. -homePageCaptureRegion = Chụp một khu vực -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = Nhấp và kéo để chọn khu vực bạn muốn chụp. Hoặc chỉ cần di chuột và nhấp vào - Ảnh chụp màn hình sẽ chọn khu vực cho bạn. Giống như những gì bạn thấy? Chọn Lưu để truy cập trực tuyến ảnh chụp màn hình hoặc nút mũi tên xuống để tải nó về máy tính của bạn. -homePageCapturePage = Chụp một trang -homePageCapturePageDescription = Sử dụng các nút ở phía trên bên phải để chụp toàn bộ trang. Nút Lưu Ghi nhớ sẽ chụp khu vực bạn có thể xem mà không cần di chuyển, và Lưu toàn bộ Trang sẽ chụp mọi thứ trên trang. -homePageDownloadCopy = Tải về hoặc sao chép -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = Tạo ảnh chụp tốt nhất cho bạn. Screenshots cho phép bạn tải xuống lựa chọn của bạn hoặc sao chép nó ngay vào clipboard của bạn. -homePageLegalLink = Thông tin pháp lý -homePagePrivacyLink = Chính sách riêng tư -homePageTermsLink = Điều khoản -homePageCookiesLink = Cookie - -## Leave Screenshots page - -leavePageRemoveAllData = Xóa toàn bộ dữ liệu -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = Bạn phải cài đặt Firefox Screenshots hoặc đăng nhập vào Tài khoản Firefox để xóa tài khoản của bạn -leavePageErrorGeneric = Đã xảy ra lỗi -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = Thao tác này sẽ xóa vĩnh viễn tất cả dữ liệu Ảnh chụp màn hình Firefox của bạn. -leavePageButtonProceed = Tiếp tục -leavePageButtonCancel = Hủy bỏ -leavePageDeleted = Toàn bộ ảnh chụp của bạn đã xóa! - -## Not Found page - -notFoundPageTitle = Không tìm thấy trang -notFoundPageIntro = Oops. -notFoundPageDescription = Không tìm thấy trang. - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = Ảnh chụp: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = Lỗi khi thay đổi thời hạn hình ảnh -shotPageAlertErrorDeletingShot = Lỗi khi xóa ảnh chụp -shotPageAlertErrorUpdatingTitle = Lỗi khi lưu tiêu đề -shotPageConfirmDelete = Bạn có chắc chắn muốn xóa vĩnh viễn ảnh này? -shotPageShareButton = - .title = Chia sẻ -shotPageCopyButton = - .title = Sao chép hình ảnh vào clipboard -shotPageCopyActionLabel = Sao chép -shotPageCopied = Đã sao chép -shotPageShareFacebook = - .title = Chia sẻ trên Facebook -shotPageShareTwitter = - .title = Chia sẻ trên Twitter -shotPageSharePinterest = - .title = Chia sẻ trên Pinterest -shotPageShareEmail = - .title = Chia sẻ liên kết bằng email -shotPageShareLink = Nhận một liên kết có thể chia sẻ ảnh chụp này: -shotPagePrivacyMessage = Bất kỳ ai có liên kết đều có thể xem ảnh này. -shotPageCopyImageText = - .label = Sao chép hình ảnh văn bản -shotPageConfirmDeletion = Bạn có chắc chắn muốn xóa vĩnh viễn ảnh này? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = Nếu bạn không làm gì, ảnh này sẽ bị xóa vĩnh viễn . -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = khôi phục đến { $date } -shotPageExpiredMessage = Ảnh này đã quá hạn. -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = Đây là trang nó ban đầu được tạo ra từ: -shotPageDeleteButton = - .title = Xóa ảnh này -shotPageDownloadShot = - .title = Tải về -shotPageEditButton = - .title = Chỉnh sửa hình ảnh -shotPagefavoriteButton = - .title = Đánh dấu ảnh này là yêu thích -shotPageBackToHomeButton = - .title = Trang chủ -shotPageAllShotsButton = - .title = Tất cả ảnh chụp -shotPageScreenshotsDescriptionServerless = Ảnh chụp màn hình được tạo đơn giản. Chụp và tải về ảnh chụp màn hình mà không cần rời khỏi Firefox. -shotPageDMCAMessage = Bức ảnh này không còn nữa do yêu cầu sở hữu trí tuệ của bên thứ ba. -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = Vui lòng gửi email cho { $dmca } để yêu cầu thêm thông tin. -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = Nếu ảnh của bạn bị khiếu nại nhiều lần, chúng tôi có thể thu hồi quyền truy cập của bạn vào Ảnh chụp màn hình của Firefox. -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = Vui lòng thêm URL của ảnh này trong email của bạn: { $url } -shotPageKeepFor = Ảnh chụp này được giữ lại trong bao lâu? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = Chọn thời gian -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = Vô hạn ∞ -shotPageKeepTenMinutes = 10 phút -shotPageKeepOneHour = 1 giờ -shotPageKeepOneDay = 1 ngày -shotPageKeepOneWeek = 1 tuần -shotPageKeepTwoWeeks = 2 tuần -shotPageKeepOneMonth = 1 tháng -shotPageSaveExpiration = lưu -shotPageCancelExpiration = huỷ bỏ -shotPageDoesNotExpire = Không có thời hạn -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = Hết hạn vào -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = Đã hết hạn vào -timeDiffJustNow = mới đây -timeDiffMinutesAgo = { $number } phút trước -timeDiffHoursAgo = { $number } giờ trước -timeDiffDaysAgo = - { $number -> - *[other] hôm qua - } -timeDiffFutureSeconds = trong một vài giây -timeDiffFutureMinutes = trong { $number } phút -timeDiffFutureHours = trong { $number } giờ -timeDiffFutureDays = - { $number -> - *[other] ngày mai - } -errorThirdPartyCookiesEnabled = Nếu bạn đã chụp và không thể xóa ảnh đó, bạn có thể phải tạm thời bật cookie của bên thứ ba từ tùy chọn của trình duyệt của mình. - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = Hãy ghi nhớ! -promoMessage = Công cụ chỉnh sửa được cập nhật cho phép bạn cắt, tô sáng và thậm chí thêm văn bản vào ảnh của bạn. -promoLink = Tại sao không thử nó -promoCloseButton = - .title = Đóng thông báo - -## Annotations - -annotationPenButton = - .title = Pen -annotationHighlighterButton = - .title = Đánh dấu -annotationUndoButton = - .title = Hoàn tác -annotationRedoButton = - .title = Làm lại -annotationTextButton = - .title = Thêm văn bản -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = Làm sạch -annotationCropButton = - .title = Crop -annotationSaveEditButton = Lưu - .title = Lưu thay đổi -annotationCancelEditButton = Hủy - .title = Hủy thay đổi -annotationCropConfirmButton = Xác nhận - .title = Lựa chọn xác nhận -annotationCropCancelButton = Hủy - .title = Lựa chọn hủy bỏ -annotationColorWhite = - .title = Trắng -annotationColorBlack = - .title = Đen -annotationColorRed = - .title = Đỏ -annotationColorGreen = - .title = Xanh lá cây -annotationColorBlue = - .title = Xanh dương -annotationColorYellow = - .title = Vàng -annotationColorPurple = - .title = Tím -annotationColorSeaGreen = - .title = Xanh nước biển -annotationColorGrey = - .title = Xám -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = Cỡ chữ -# Values shown in text size selection dropdown -textSizeSmall = Nhỏ -textSizeMedium = Vừa -textSizeLarge = Lớn -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = Xác nhận - .title = title -textToolCancelButton = Hủy bỏ - .title = Cancel -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = Xin chào - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = Có thứ gì đó không ổn -copyImageErrorMessage = Không thể sao chép ảnh chụp của bạn vào clipboard. - -## Settings Page - -settingsDisconnectButton = Ngắt kết nối - .title = Ngắt kết nối -settingsGuestAccountMessage = Tài khoản khách -settingsSignInButton = Đăng nhập - .title = Đăng nhập -SettingsPageHeader = Cài đặt Firefox Screenshots -settingsFirefoxAccountSubHeader = Tài khoản Firefox -settingsClosePreferences = - .title = Đóng cài đặt -settingsFxaDisconnectAlertMessage = Bạn có chắc chắn muốn ngắt kết nối thiết bị này khỏi Tài khoản Firefox của mình không? -settingsFxaDisconnectDescription = Nếu bạn đăng xuất, bạn sẽ cần phải đăng nhập lại để lấy lại quyền truy cập vào ảnh chụp màn hình của mình. -settingsFxaConnectDescription = Bạn có thể đăng nhập để truy cập ảnh chụp màn hình của mình trên các thiết bị. - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = Lỗi khi xóa ảnh chụp: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = Ảnh chụp của tôi: tìm kiếm { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = Đã xảy ra lỗi khi tạo trang: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = Tìm kiếm ảnh chụp của tôi -shotIndexPageNoShotsMessage = Không có ảnh chụp đã lưu. -shotIndexPageNoShotsInvitation = Bắt đầu, tạo một vài ảnh. -shotIndexPageLookingForShots = Tìm kiếm ảnh chụp của bạn... -shotIndexPageNoSearchResultsIntro = Hmm -shotIndexPageNoSearchResults = Chúng tôi không thể tìm thấy ảnh chụp nào trùng khớp với từ khóa của bạn. -shotIndexPageMyShotsButton = - .title = Các ảnh chụp của tôi -shotIndexPageClearSearchButton = - .title = Xóa lịch sử tìm kiếm -shotIndexPageConfirmShotDelete = Xóa ảnh chụp này? -shotIndexPagePreviousPage = - .title = Trang trước -shotIndexPageNextPage = - .title = Trang kế tiếp -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = Đây không phải là ảnh ưa thích và nó sẽ hết hạn -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = Đây là ảnh chụp yêu thích và nó không hết hạn -shotIndexSyncedShot = - .title = Ảnh đã được chụp từ thiết bị khác -shotIndexAlertErrorFavoriteShot = Có lỗi xảy ra khi cập nhật trạng thái ảnh yêu thích - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = Bạn có muốn xóa ảnh chụp này? -shotDeleteCancel = Hủy bỏ - .title = Hủy bỏ -shotDeleteConfirm = Xóa - .title = Xóa - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = Để xuất ảnh: sử dụng Tập tin > Lưu trang dưới dạng... và bạn sẽ tìm thấy ảnh chụp màn hình của mình trong thư mục { $folder } - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Số liệu thống kê Firefox Screenshots -metricsPageTotalsQueryTitle = Tổng cộng -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Tổng quan về Ảnh chụp màn hình -metricsPageTotalsQueryDevices = Tổng thiết bị đăng kí -metricsPageTotalsQueryActiveShots = Ảnh chụp hoạt động -metricsPageTotalsQueryExpiredShots = Đã hết hạn (nhưng có thể khôi phục) -metricsPageTotalsQueryExpiredDeletedShots = Đã hết hạn (và đã xóa) -metricsPageShotsQueryTitle = Ảnh chụp theo Ngày -metricsPageShotsQueryDescription = Số lượng ảnh chụp được tạo ra mỗi ngày (trong 30 ngày qua) -metricsPageShotsQueryCount = Số ảnh chụp -metricsPageShotsQueryDay = Ngày -metricsPageUsersQueryTitle = Người dùng theo Ngày -metricsPageUsersQueryDescription = Số lượng người dùng tạo ít nhất một lần, theo ngày (30 ngày qua) -metricsPageUsersQueryCount = Số người dùng -metricsPageUsersQueryDay = Ngày -metricsPageUserShotsQueryTitle = Số lượng ảnh chụp trên mỗi người dùng -metricsPageUserShotsQueryDescription = Số lượng người dùng có tổng số N ảnh chụp -metricsPageUserShotsQueryCount = Số người dùng -metricsPageUserShotsQueryShots = Số lượng tương tác của các bức ảnh chụp đang hoạt động (chưa hết hạn) -metricsPageRetentionQueryTitle = Tỷ lệ duy trì hàng tuần -metricsPageRetentionQueryDescription = Số ngày từ lần sử dụng đầu tiên của người dùng cho lần chụp gần đây nhất, được nhóm lại theo tuần bắt đầu -metricsPageRetentionQueryUsers = Số người dùng -metricsPageRetentionQueryDays = Ngày từ người dùng đầu tiên đến ảnh gần đây nhất -metricsPageRetentionQueryFirstWeek = Tuần người dùng đầu tiên tạo ra một ảnh chụp -metricsPageTotalRetentionQueryTitle = Tổng tỉ lệ duy trì -metricsPageTotalRetentionQueryDescription = Khoảng thời gian người dùng đã tạo ảnh chụp, được nhóm theo tuần -metricsPageTotalRetentionQueryUsers = Số người dùng -metricsPageTotalRetentionQueryDays = Ngày người dùng đã tạo ảnh chụp -metricsPageVersionQueryTitle = Phiên bản tiện ích -metricsPageVersionQueryDescription = Phiên bản tiện ích được sử dụng trong quá trình đăng nhập, trong 14 ngày qua -metricsPageVersionQueryUsers = Số lượng người dùng đăng nhập -metricsPageVersionQueryVersion = Phiên bản tiện ích -metricsPageVersionQueryLastSeen = Ngày -metricsPageHeader = Các số liệu -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = Được tạo lúc: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (cơ sở dữ liệu: { $time }ms) diff --git a/locales/wo/server.ftl b/locales/wo/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/wo/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/xh/server.ftl b/locales/xh/server.ftl deleted file mode 100644 index 1eac0c940b..0000000000 --- a/locales/xh/server.ftl +++ /dev/null @@ -1,40 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - - -## Footer - - -## Creating page - - -## Home page - - -## Leave Screenshots page - - -## Not Found page - - -## Shot page - - -## Annotations - - -## Settings Page - - -## Shotindex page - - -## Delete Confirmation Dialog - - -## Metrics page -## All metrics strings are optional for translation - diff --git a/locales/zh-CN/server.ftl b/locales/zh-CN/server.ftl deleted file mode 100644 index 5e8c1b35e8..0000000000 --- a/locales/zh-CN/server.ftl +++ /dev/null @@ -1,379 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = 我的截图 -gHomeLink = 首页 -gNoShots = - .alt = 没有找到截图 -gScreenshotsDescriptionServerless = 截图顺手拈来,不必离开 Firefox 即可截取和下载屏幕截图。 - -## Header - -buttonSettings = - .title = 设置 -buttonSignIn = - .title = 登录 -screenshotsLogo = - .title = Screenshots 主页 -bannerSignIn = 请注册或登录,即可跨设备访问您的截图,并永久保存收藏的截图。 -bannerUpsell = { gScreenshotsDescription }立即下载 Firefox -shutdownWarning = 已保存的屏幕截图即将到期。从六月开始,Screenshots 将不再提供在线存储空间。想要保留图库中的截图吗?将它们下载到您的计算机中。 -shutdownPageTitle = Screenshots 有所变动 -shutdownPageDescription = 自六月起,Screenshots 将不再提供在线存储空间。想要保留图库中的截图吗?请将截图单张或批量下载至本地。感谢您使用此功能,对于给您带来的不便,我们深表歉意。 -shutdownPageContinue = 我们希望您能够继续使用 Screenshots 来截取、复制和下载截图。 -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefox Screenshots 有什么新变化? -onboardingPromoMessage = 现在,使用 Firefox 账号登录 Screenshots 可执行更多操作: -onboardingPromoMessageListItem1 = 在您所有的设备上访问图库 -onboardingPromoMessageListItem2 = 永久存储您收藏的截图 -onboardingPromoDismissButton = 知道了 - .title = 知道了 -onboardingPromoSigninButton = 登录 - .title = 登录 - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = 使用条款 -footerLinkPrivacy = 隐私声明 -footerReportShot = 举报截图 - .title = 举报这张截图有滥用、垃圾信息或其他问题 -footerLinkFaqs = 常见问题 -footerLinkDMCA = 举报侵犯知识产权 -footerLinkDiscourse = 提供反馈 -footerLinkRemoveAllData = 清除所有数据 - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = 创建 { $title } -creatingPageTitleDefault = 页面 -creatingPageWaitMessage = 正在保存您的截图… - -## Home page - -homePageDescription = - .content = 直接在浏览器内截图。使用 Firefox 浏览网页时可以截取、保存和分享网页截图。 -homePageButtonMyShots = 转至我的截图 -homePageTeaser = 即将推出… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = 免费下载 -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = 如何使用 Firefox Screenshots -homePageGetStartedTitle = 开始使用 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = 点击地址栏中的“页面动作”菜单,选择“截图”按钮,截图菜单会显示在您的浏览器窗口的顶部。 -homePageCaptureRegion = 截取选定区域 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = 单击并拖动以选择要截图的区域。或者悬停并单击,让屏幕截图为您选中区域。您可以选择“保存”进入您的在线截图库或点击“向下箭头”按钮下载截图到您的计算机。 -homePageCapturePage = 截取整个网页 -homePageCapturePageDescription = 使用右上角的按钮来截图整个页面。保存可视区域将截取当前可见区域的内容,保存完整页面将截取整个网页的内容。 -homePageDownloadCopy = 下载或复制 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = 秀出您最棒的截图。Screenshots 可让您下载所截区域图像,或是直接复制到剪贴板。 -homePageLegalLink = 法律 -homePagePrivacyLink = 隐私 -homePageTermsLink = 使用条款 -homePageCookiesLink = Cookie - -## Leave Screenshots page - -leavePageRemoveAllData = 移除全部数据 -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = 您必须已安装 Firefox Screenshots 或者已登录 Firefox 账号才能删除您的账号 -leavePageErrorGeneric = 发生错误 -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = 这将永久删除您的 Firefox Screenshots 数据。 -leavePageButtonProceed = 确认 -leavePageButtonCancel = 取消 -leavePageDeleted = 您的截图已全部删除! - -## Not Found page - -notFoundPageTitle = 找不到网页 -notFoundPageIntro = 出错了。 -notFoundPageDescription = 找不到网页。 - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = 截图:{ $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = 保存到期时间时出错 -shotPageAlertErrorDeletingShot = 删除截图时出错 -shotPageAlertErrorUpdatingTitle = 保存标题时出错 -shotPageConfirmDelete = 您确定要永久删除此截图? -shotPageShareButton = - .title = 分享 -shotPageCopyButton = - .title = 复制截图到剪贴板 -shotPageCopyActionLabel = 复制 -shotPageCopied = 已复制 -shotPageShareFacebook = - .title = 分享到 Facebook -shotPageShareTwitter = - .title = 分享到 Twitter -shotPageSharePinterest = - .title = 分享到 Pinterest -shotPageShareEmail = - .title = 以电子邮件分享链接 -shotPageShareLink = 获取此截图的可分享链接: -shotPagePrivacyMessage = 任何持有此链接的人可以查看此截图。 -shotPageCopyImageText = - .label = 复制图像文本 -shotPageConfirmDeletion = 您确定要永久删除此截图? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = 如果您不做操作,此截图将在 后被永久删除。 -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = 在 { $date } 前可恢复 -shotPageExpiredMessage = 此截图已过期。 -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = 这是最初创建的页面: -shotPageDeleteButton = - .title = 删除此截图 -shotPageDownloadShot = - .title = 下载 -shotPageEditButton = - .title = 编辑此图像 -shotPagefavoriteButton = - .title = 收藏此截图 -shotPageBackToHomeButton = - .title = 主页 -shotPageAllShotsButton = - .title = 所有截图 -shotPageScreenshotsDescriptionServerless = 截图顺手拈来,不必离开 Firefox 即可截取和下载屏幕截图。 -shotPageDMCAMessage = 由于第三方宣告知识产权,此截图不再可用。 -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = 请发送电子邮件至 { $dmca } 来请求进一步信息。 -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = 如果您的截图被第三方宣告涉及知识产权,我们可能限制您访问 Firefox Screenshots。 -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = 请在您的电子邮件中包含此截图的网址:{ $url } -shotPageKeepFor = 此截图保留多久? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = 选择时间 -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = 无限 ∞ -shotPageKeepTenMinutes = 10 分钟 -shotPageKeepOneHour = 1 小时 -shotPageKeepOneDay = 1 天 -shotPageKeepOneWeek = 1 周 -shotPageKeepTwoWeeks = 2 周 -shotPageKeepOneMonth = 1 个月 -shotPageSaveExpiration = 保存 -shotPageCancelExpiration = 取消 -shotPageDoesNotExpire = 不会到期 -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = 后过期 -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = 前已过期 -timeDiffJustNow = 刚刚 -timeDiffMinutesAgo = - { $number -> - *[other] { $number } 分钟前 - } -timeDiffHoursAgo = - { $number -> - *[other] { $number } 小时前 - } -timeDiffDaysAgo = { $number } 天前 -timeDiffFutureSeconds = 几秒内 -timeDiffFutureMinutes = { $number } 分钟内 -timeDiffFutureHours = { $number } 小时内 -timeDiffFutureDays = { $number } 天内 -errorThirdPartyCookiesEnabled = 如果您无法删除截图,可能需要暂时在浏览器的设置中启用第三方 Cookie。 - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = 请注意! -promoMessage = 最新的编辑工具支持裁剪、高亮,以及为您的截图添加文字。 -promoLink = 试一试 -promoCloseButton = - .title = 关闭通知 - -## Annotations - -annotationPenButton = - .title = 钢笔 -annotationHighlighterButton = - .title = 荧光笔 -annotationUndoButton = - .title = 撤销 -annotationRedoButton = - .title = 重做 -annotationTextButton = - .title = 添加文字 -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = 清除 -annotationCropButton = - .title = 裁剪 -annotationSaveEditButton = 保存 - .title = 保存编辑 -annotationCancelEditButton = 取消 - .title = 取消编辑 -annotationCropConfirmButton = 确认 - .title = 确认选择 -annotationCropCancelButton = 取消 - .title = 取消选择 -annotationColorWhite = - .title = 白色 -annotationColorBlack = - .title = 黑色 -annotationColorRed = - .title = 红色 -annotationColorGreen = - .title = 绿色 -annotationColorBlue = - .title = 蓝色 -annotationColorYellow = - .title = 黄色 -annotationColorPurple = - .title = 紫色 -annotationColorSeaGreen = - .title = 海绿色 -annotationColorGrey = - .title = 灰色 -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = 文字大小 -# Values shown in text size selection dropdown -textSizeSmall = 小 -textSizeMedium = 中 -textSizeLarge = 大 -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = 确认 - .title = 确认 -textToolCancelButton = 取消 - .title = 取消 -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = 你好 - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = 出了点问题 -copyImageErrorMessage = 无法将截图复制到剪贴板。 - -## Settings Page - -settingsDisconnectButton = 断开连接 - .title = 断开连接 -settingsGuestAccountMessage = 游客账户 -settingsSignInButton = 登录 - .title = 登录 -SettingsPageHeader = Firefox Screenshots 设置 -settingsFirefoxAccountSubHeader = Firefox 账户 -settingsClosePreferences = - .title = 关闭首选项 -settingsFxaDisconnectAlertMessage = 您确定要将此设备与 Firefox 账户断开连接吗? -settingsFxaDisconnectDescription = 退出后,需要再次登录才能访问截图。 -settingsFxaConnectDescription = 您可以登录以跨设备访问屏幕截图。 - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = 删除截图时出错:{ $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = 我的截图:搜索 { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = 呈现页面时出错:{ $error } -shotIndexPageSearchPlaceholder = - .placeholder = 搜索我的截图 -shotIndexPageNoShotsMessage = 没有保存截图。 -shotIndexPageNoShotsInvitation = 快来创建一些吧。 -shotIndexPageLookingForShots = 正在查找您的截图… -shotIndexPageNoSearchResultsIntro = 呃 -shotIndexPageNoSearchResults = 我们没找到匹配您的搜索条件的截图。 -shotIndexPageMyShotsButton = - .title = 我的截图 -shotIndexPageClearSearchButton = - .title = 清空搜索 -shotIndexPageConfirmShotDelete = 删除此截图? -shotIndexPagePreviousPage = - .title = 上一页 -shotIndexPageNextPage = - .title = 下一页 -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = 这不是一张收藏的截图,它将会过期 -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = 这是一张收藏的截图,不会过期 -shotIndexSyncedShot = - .title = 其他设备上的截图 -shotIndexAlertErrorFavoriteShot = 更新收藏截图状态时出错 - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = 您确定要删除这张截图吗? -shotDeleteCancel = 取消 - .title = 取消 -shotDeleteConfirm = 删除 - .title = 删除 - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = 若要导出:选择“文件 > 另存文件为…”就可以在 { $folder } 文件夹中找到您的屏幕截图 - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots 统计 -metricsPageTotalsQueryTitle = 总计 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Screenshots 概览 -metricsPageTotalsQueryDevices = 总计注册设备 -metricsPageTotalsQueryActiveShots = 活跃截图 -metricsPageTotalsQueryExpiredShots = 已过期(但可恢复) -metricsPageTotalsQueryExpiredDeletedShots = 已过期(并已删除) -metricsPageShotsQueryTitle = 各日截图数 -metricsPageShotsQueryDescription = 每日创建截图数(最近 30 天) -metricsPageShotsQueryCount = 截图数 -metricsPageShotsQueryDay = 日 -metricsPageUsersQueryTitle = 各日用户数 -metricsPageUsersQueryDescription = 至少创建一张截图的用户数,最近 30 天 -metricsPageUsersQueryCount = 用户数 -metricsPageUsersQueryDay = 日 -metricsPageUserShotsQueryTitle = 每用户截图数 -metricsPageUserShotsQueryDescription = 有总共 N 个截图的用户数量 -metricsPageUserShotsQueryCount = 用户数 -metricsPageUserShotsQueryShots = 大致的活跃(未过期)截图数 -metricsPageRetentionQueryTitle = 按周保留 -metricsPageRetentionQueryDescription = 用户第一张截图到最近一张截图的天数,按周分组 -metricsPageRetentionQueryUsers = 用户数 -metricsPageRetentionQueryDays = 用户从第一张到最近一张截图的天数 -metricsPageRetentionQueryFirstWeek = 用户第一次创建截图的周数 -metricsPageTotalRetentionQueryTitle = 所有保留 -metricsPageTotalRetentionQueryDescription = 用户已创建截图的时间长度,按周分组 -metricsPageTotalRetentionQueryUsers = 用户数 -metricsPageTotalRetentionQueryDays = 用户创建截图的天数 -metricsPageVersionQueryTitle = 附加组件版本 -metricsPageVersionQueryDescription = 过去 14 天内进行登录的附加组件版本 -metricsPageVersionQueryUsers = 用户登录数 -metricsPageVersionQueryVersion = 附加组件版本 -metricsPageVersionQueryLastSeen = 日 -metricsPageHeader = 统计 -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = 生成时间:{ $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (数据库用时:{ $time } 毫秒) diff --git a/locales/zh-TW/server.ftl b/locales/zh-TW/server.ftl deleted file mode 100644 index ae2be7fb24..0000000000 --- a/locales/zh-TW/server.ftl +++ /dev/null @@ -1,373 +0,0 @@ -### Localization for Server-side strings of Firefox Screenshots -### Please don't localize Firefox, Firefox Screenshots, or Screenshots - - -## Global phrases shared across pages, prefixed with 'g' - -gMyShots = 我的擷圖 -gHomeLink = 首頁 -gNoShots = - .alt = 沒有找到擷取圖 -gScreenshotsDescriptionServerless = 拍攝畫面擷圖變得簡單。不需離開 Firefox 即可拍攝並下載畫面擷圖。 - -## Header - -buttonSettings = - .title = 設定 -buttonSignIn = - .title = 登入 -screenshotsLogo = - .title = Screenshots 首頁 -bannerSignIn = 請註冊或登入,即可在不同裝置間存取您的擷圖,並永久保存最愛的圖片。 -bannerUpsell = { gScreenshotsDescription } 立即下載 Firefox -shutdownWarning = 將結束儲存擷圖到雲端的功能六月起,Screenshots 將不再提供雲端儲存空間。想把圖片存下來?可以下載到您的電腦上。 -shutdownPageTitle = Screenshots 將有異動 -shutdownPageDescription = 六月起,Screenshots 將不再提供線上儲存空間。想要將儲藏庫中的擷圖下載下來嗎?可以一張一張或一次整批下載。感謝您使用此功能,若對您帶來任何不便,我們也很抱歉。 -shutdownPageContinue = 希望您會繼續使用 Screenshots 來拍攝、複製、下載擷圖。 -# Text used in Firefox Account onboarding promo shown below -# Sign in button in header -onboardingPromoTitle = Firefox Screenshots 有什麼新鮮事? -onboardingPromoMessage = 現在起,使用 Firefox 帳號登入至 Screenshots 後,還可以做更多: -onboardingPromoMessageListItem1 = 在您所有的裝置上開啟圖片庫 -onboardingPromoMessageListItem2 = 永久儲存您最愛的擷圖 -onboardingPromoDismissButton = 知道了! - .title = 知道了! -onboardingPromoSigninButton = 登入 - .title = 登入 - -## Footer - -# Note: link text for a link to mozilla.org -footerLinkMozilla = Mozilla -footerLinkTerms = 使用條款 -footerLinkPrivacy = 隱私權公告 -footerReportShot = 回報擷圖 - .title = 回報這張擷圖有濫用、廣告或其他問題 -footerLinkFaqs = 常見問題 -footerLinkDMCA = 回報智財權侵害案件 -footerLinkDiscourse = 提供意見回饋 -footerLinkRemoveAllData = 移除所有資料 - -## Creating page - -# Note: { $title } is a placeholder for the title of the web page -# captured in the screenshot. The default, for pages without titles, is -# creatingPageTitleDefault. -creatingPageTitle = 正在建立 { $title } -creatingPageTitleDefault = 頁面 -creatingPageWaitMessage = 正在儲存擷圖… - -## Home page - -homePageDescription = - .content = 使用 Firefox 上網時,直接在瀏覽器內拍攝網頁擷圖、儲存、並分享。 -homePageButtonMyShots = 前往我的擷圖 -homePageTeaser = 即將上線… -homePageDownloadFirefoxTitle = Firefox -homePageDownloadFirefoxSubTitle = 免費下載 -# Note: do not translate 'Firefox Screenshots' when translating this string -homePageHowScreenshotsWorks = Firefox Screenshots 的原理是什麼? -homePageGetStartedTitle = 開始使用 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageGetStartedDescriptionPageAction = 選擇網址列中,頁面操作選單的 Screenshots 圖示,Screenshots 選單就會顯示在瀏覽器視窗的最上層。 -homePageCaptureRegion = 選擇拍攝區域 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageCaptureRegionDescription = 點擊並拖曳出您想要擷取的範圍,或也可將滑鼠指到想拍照的地方點擊,Screenshots 就會自動為您選擇要拍攝的範圍。覺得拍得不錯的話,即可點擊「儲存」將拍攝到的擷圖上傳到雲端平台,或是直接點擊「下載」按鈕,儲存到電腦上。 -homePageCapturePage = 拍攝整張網頁 -homePageCapturePageDescription = 可使用右上角的按鈕來拍攝整張網頁。點擊「儲存可見範圍」按鈕即可不必捲動,直接拍攝您當下看到的範圍,或是點擊「儲存完整頁面」拍攝整張網頁。 -homePageDownloadCopy = 下載或複製 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -homePageDownloadCopyDescription = 拍出您最棒的擷圖。Screenshots 可讓您下載選擇範圍,或是直接複製到剪貼簿上。 -homePageLegalLink = 法律資訊 -homePagePrivacyLink = 隱私權 -homePageTermsLink = 使用條款 -homePageCookiesLink = Cookies - -## Leave Screenshots page - -leavePageRemoveAllData = 移除所有資料 -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageErrorAuthRequired = 您必須安裝 Firefox Screenshots 或登入 Firefox 帳號才可以刪除帳號 -leavePageErrorGeneric = 發生錯誤 -# Note: do not translate 'Firefox Screenshots' when translating this string -leavePageWarning = 將會永久清除您所有的 Firefox Screenshots 資料。 -leavePageButtonProceed = 確定繼續 -leavePageButtonCancel = 取消 -leavePageDeleted = 已清除您所有擷取過的圖片! - -## Not Found page - -notFoundPageTitle = 找不到頁面 -notFoundPageIntro = 糟糕。 -notFoundPageDescription = 找不到頁面。 - -## Shot page - -# This is the HTML title tag of the page -shotPageTitle = 畫面擷圖: { $originalTitle } -shotPageAlertErrorUpdatingExpirationTime = 儲存到期時間時發生錯誤 -shotPageAlertErrorDeletingShot = 刪除擷圖時發生錯誤 -shotPageAlertErrorUpdatingTitle = 儲存標題時發生錯誤 -shotPageConfirmDelete = 您確定要刪除這張圖片嗎? -shotPageShareButton = - .title = 分享 -shotPageCopyButton = - .title = 複製圖片到剪貼簿 -shotPageCopyActionLabel = 複製 -shotPageCopied = 已複製! -shotPageShareFacebook = - .title = 分享到 Facebook -shotPageShareTwitter = - .title = 分享到 Twitter -shotPageSharePinterest = - .title = 分享到 Pinterest -shotPageShareEmail = - .title = 透過電子郵件分享鏈結 -shotPageShareLink = 取得擷圖的分享用鏈結: -shotPagePrivacyMessage = 任何有鏈結的人都能看到這張擷圖。 -shotPageCopyImageText = - .label = 複製圖片文字 -shotPageConfirmDeletion = 您確定要永久刪除這張擷圖嗎? -# Note: is a placeholder for a future relative time clause like 'in 3 days' or 'tomorrow' -shotPageTimeExpirationMessage = 若不做任何事,將在 刪除此擷圖。 -# Note: { $date } is a placeholder for a localized future date as returned by Date.toLocaleString. -# For example, in en-US, { $date } could be "7/12/2017, 1:52:50 PM". -shotPageRestoreButton = 還原直到 { $date } -shotPageExpiredMessage = 此擷圖已過期。 -# Note: This phrase is followed by an empty line, then the URL of the source page -shotPageExpiredMessageDetails = 以下是該擷圖的原始產生頁面: -shotPageDeleteButton = - .title = 刪除此擷圖 -shotPageDownloadShot = - .title = 下載 -shotPageEditButton = - .title = 編輯此圖片 -shotPagefavoriteButton = - .title = 將這張擷圖設為最愛 -shotPageBackToHomeButton = - .title = 首頁 -shotPageAllShotsButton = - .title = 所有擷圖 -shotPageScreenshotsDescriptionServerless = 拍攝畫面擷圖變得簡單。不需離開 Firefox 即可拍攝並下載畫面擷圖。 -shotPageDMCAMessage = 因為第三方提出智慧財產權通知,此擷圖已被下架。 -# Note: { $dmca } is a placeholder for a link to send email (a 'mailto' link) -shotPageDMCAContact = 請寄信到 { $dmca } 要求更多資訊。 -# Note: do not translate 'Firefox Screenshots' when translating this string -shotPageDMCAWarning = 若我們收到多次關於您的照片的版權要求,我們可能會封鎖您的 Firefox Screenshots 使用權。 -# Note: { $url } is a placeholder for a shot page URL -shotPageDMCAIncludeLink = 請在郵件中包含此擷圖的網址: { $url } -shotPageKeepFor = 這張擷圖應該保存多久? -# Note: shotPageSelectTime is a placeholder label for the time selection dropdown. -shotPageSelectTime = 選擇時間 -# The ∞ is used to indicate that the shot won't expire. It is also used in -# shotIndexNoExpirationSymbol. Try to use the same symbol in both strings, or -# if no such symbol is available for a language/culture, simply leave it out. -shotPageKeepIndefinitelyWithSymbol = 無限期 ∞ -shotPageKeepTenMinutes = 10 分鐘 -shotPageKeepOneHour = 1 小時 -shotPageKeepOneDay = 1 天 -shotPageKeepOneWeek = 1 星期 -shotPageKeepTwoWeeks = 2 星期 -shotPageKeepOneMonth = 1 個月 -shotPageSaveExpiration = 儲存 -shotPageCancelExpiration = 取消 -shotPageDoesNotExpire = 不過期 -# Note: is a placeholder for a future relative time clause, like "in 1 week" or "tomorrow" -shotPageTimeExpiresIn = 過期 -# Note: is a placeholder for a past relative time clause, like "1 week ago" or "yesterday" -shotPageTimeExpired = 已於 過期 -timeDiffJustNow = 剛剛 -timeDiffMinutesAgo = { $number } 分鐘前 -timeDiffHoursAgo = { $number } 小時前 -timeDiffDaysAgo = { $number } 天前 -timeDiffFutureSeconds = 幾秒後 -timeDiffFutureMinutes = { $number } 分鐘後 -timeDiffFutureHours = { $number } 小時後 -timeDiffFutureDays = { $number } 天後 -errorThirdPartyCookiesEnabled = 若您拍了這張圖卻無法山圖,可能需要到瀏覽器的偏好設定中暫時允許第三方 Cookie。 - -## Shot Page New Feature Promotion Dialog. - -# Note: If possible, choose a short translation to better fit into the card. -promoTitle = 記下筆記! -promoMessage = 更新過的編輯工具可讓您裁切擷圖、強調文字,甚至新增文字到圖片上。 -promoLink = 快試試看 -promoCloseButton = - .title = 關閉通知 - -## Annotations - -annotationPenButton = - .title = 筆 -annotationHighlighterButton = - .title = 螢光筆 -annotationUndoButton = - .title = 復原 -annotationRedoButton = - .title = 重做 -annotationTextButton = - .title = 新增文字 -# Note: This button reverts all the changes on the image since the start of the editing session. -annotationClearButton = - .title = 清除 -annotationCropButton = - .title = 裁切 -annotationSaveEditButton = 儲存 - .title = 儲存編輯 -annotationCancelEditButton = 取消 - .title = 取消編輯 -annotationCropConfirmButton = 確認 - .title = 確認選擇 -annotationCropCancelButton = 取消 - .title = 取消選擇 -annotationColorWhite = - .title = 白色 -annotationColorBlack = - .title = 黑色 -annotationColorRed = - .title = 紅色 -annotationColorGreen = - .title = 綠色 -annotationColorBlue = - .title = 藍色 -annotationColorYellow = - .title = 黃色 -annotationColorPurple = - .title = 紫色 -annotationColorSeaGreen = - .title = 海綠色 -annotationColorGrey = - .title = 灰色 -# Note: annotationTextSize is a title for text size selection dropdown. -annotationTextSize = - .title = 文字大小 -# Values shown in text size selection dropdown -textSizeSmall = 小 -textSizeMedium = 中 -textSizeLarge = 大 -# Confirm and Cancel button title shown when using text tool -textToolConfirmButton = 確認 - .title = 確認 -textToolCancelButton = 取消 - .title = 取消 -# Default placeholder used in input field when adding text annotations -textToolInputPlaceholder = - .placeholder = 哈囉 - -## The following are the title and message for an error displayed as a Firefox -## notification. It is triggered by an action in the shot page and the strings -## are passed from the shot page to the addon. - -copyImageErrorTitle = 有些東西不對勁 -copyImageErrorMessage = 無法將您的擷圖複製到剪貼簿。 - -## Settings Page - -settingsDisconnectButton = 取消連線 - .title = 取消連線 -settingsGuestAccountMessage = 訪客帳號 -settingsSignInButton = 登入 - .title = 登入 -SettingsPageHeader = Firefox Screenshots 設定 -settingsFirefoxAccountSubHeader = Firefox 帳號 -settingsClosePreferences = - .title = 關閉偏好設定 -settingsFxaDisconnectAlertMessage = 您確定要將中斷裝置與 Firefox 帳號的連結嗎? -settingsFxaDisconnectDescription = 登出後,需要再次登入才能取回擷圖。 -settingsFxaConnectDescription = 您可以登入,即可在不同裝置間存取擷圖。 - -## Shotindex page - -# { $status } is a placeholder for an HTTP status code, like '500'. -# { $statusText } is a text description of the status code, like 'Internal server error'. -shotIndexPageErrorDeletingShot = 刪除擷圖時發生錯誤: { $status } { $statusText } -# { $searchTerm } is a placeholder for text the user typed into the search box -shotIndexPageSearchResultsTitle = 我的擷圖: 搜尋 { $searchTerm } -# { $error } is a placeholder for a non-translated error message that could be shared -# with developers when debugging an error. -shotIndexPageErrorRendering = 產生頁面時發生錯誤: { $error } -shotIndexPageSearchPlaceholder = - .placeholder = 搜尋我的擷圖 -shotIndexPageNoShotsMessage = 沒有已存的擷圖。 -shotIndexPageNoShotsInvitation = 去吧!拍幾張照。 -shotIndexPageLookingForShots = 正在尋找您的擷圖… -shotIndexPageNoSearchResultsIntro = 呃… -shotIndexPageNoSearchResults = 我們找不到符合您的搜尋條件的擷圖。 -shotIndexPageMyShotsButton = - .title = 我的擷圖 -shotIndexPageClearSearchButton = - .title = 清除搜尋 -shotIndexPageConfirmShotDelete = 要刪除這張擷圖嗎? -shotIndexPagePreviousPage = - .title = 上一頁 -shotIndexPageNextPage = - .title = 下一頁 -# This is tooltip for a "blank heart" symbol used in the upper top corner of the card for a shot on the -# My Shots page to indicate that the shot does expire. -shotIndexNonFavoriteIcon = - .title = 這不是最愛的擷圖,將會過期 -# This is the tooltip for a "heart" symbol in the upper top corner of the -# card for a shot on the My Shots page. It indicate that the shot was marked as -# a favorite by the owner. -shotIndexFavoriteIcon = - .title = 這是最愛的擷圖,不會過期 -shotIndexSyncedShot = - .title = 在其他裝置上拍攝的擷圖 -shotIndexAlertErrorFavoriteShot = 更新最愛的擷圖狀態時發生錯誤 - -## Delete Confirmation Dialog - -shotDeleteConfirmationMessage = 您確定要刪除這張擷圖嗎? -shotDeleteCancel = 取消 - .title = 取消 -shotDeleteConfirm = 刪除 - .title = 刪除 - -## Export page - -# Note: "File" should match the name of the File Menu, and "Save Page As" should match that menu item. $folder is replaced with the name of the folder that will be created -exportInstructions = 若要匯出: 使用「檔案 > 另存新檔…」就可以在 { $folder } 找到您拍攝的畫面擷圖 - -## Metrics page -## All metrics strings are optional for translation - -# Note: 'Firefox Screenshots' should not be translated -metricsPageTitle = Firefox Screenshots 統計 -metricsPageTotalsQueryTitle = 總數 -# Note: Screenshots is an abbreviation for Firefox Screenshots, and should not be translated. -metricsPageTotalsQueryDescription = Screenshots 概觀 -metricsPageTotalsQueryDevices = 已註冊裝置數 -metricsPageTotalsQueryActiveShots = 未過期擷圖數 -metricsPageTotalsQueryExpiredShots = 已過期(但可恢復) -metricsPageTotalsQueryExpiredDeletedShots = 已過期(且已刪除) -metricsPageShotsQueryTitle = 逐日擷圖數 -metricsPageShotsQueryDescription = 最近 30 天內,每天新建立的擷圖數量 -metricsPageShotsQueryCount = 擷圖數量 -metricsPageShotsQueryDay = 日期 -metricsPageUsersQueryTitle = 逐日使用者數 -metricsPageUsersQueryDescription = 最近 30 天內,每天至少有建立一張擷圖的使用者數量 -metricsPageUsersQueryCount = 使用者數 -metricsPageUsersQueryDay = 日期 -metricsPageUserShotsQueryTitle = 單一使用者拍攝的擷圖數 -metricsPageUserShotsQueryDescription = 目前有多少使用者,以及各使用者上傳的擷圖總數 -metricsPageUserShotsQueryCount = 使用者數 -metricsPageUserShotsQueryShots = 未過期擷圖的大約數量 -metricsPageRetentionQueryTitle = 週停留量 -metricsPageRetentionQueryDescription = 使用者第一次拍攝擷圖,到最新擷圖的天數,依照開始當週分組 -metricsPageRetentionQueryUsers = 使用者數 -metricsPageRetentionQueryDays = 使用者第一次拍攝擷圖,到最新擷圖的天數 -metricsPageRetentionQueryFirstWeek = 使用者首次拍攝擷圖的當週 -metricsPageTotalRetentionQueryTitle = 總停留 -metricsPageTotalRetentionQueryDescription = 使用者已建立擷圖的時間長度,依照週數分組 -metricsPageTotalRetentionQueryUsers = 使用者數 -metricsPageTotalRetentionQueryDays = 使用者已建立擷圖的天數 -metricsPageVersionQueryTitle = 附加元件版本 -metricsPageVersionQueryDescription = 過去 14 天當中附加元件登入時的版本 -metricsPageVersionQueryUsers = 登入的使用者數 -metricsPageVersionQueryVersion = 附加元件版本 -metricsPageVersionQueryLastSeen = 日期 -metricsPageHeader = 統計 -# Note: { $created } is a placeholder for a localized date and time, like '4/21/2017, 3:40:04 AM' -metricsPageGeneratedDateTime = 產生於: { $created } -# Note { $time } is a placeholder for a number of milliseconds, like '100' -metricsPageDatabaseQueryTime = (資料庫時間: { $time }ms) diff --git a/package.json b/package.json index 893a288408..1a1fe22d49 100644 --- a/package.json +++ b/package.json @@ -7,59 +7,14 @@ "url": "https://github.com/mozilla-services/screenshots/issues" }, "dependencies": { - "accepts": "1.3.5", - "ajv": "6.7.0", - "atob": "2.1.2", - "aws-sdk": "2.388.0", - "btoa": "1.2.1", - "classnames": "2.2.6", - "content-disposition": "0.5.3", - "convict": "4.4.1", - "cookies": "0.7.3", - "core-js": "2.6.2", - "csurf": "1.9.0", - "envc": "2.5.0", - "escape-html": "1.0.3", - "express": "4.16.4", - "fluent": "0.9.1", - "fluent-intl-polyfill": "0.1.0", - "fluent-langneg": "0.1.0", - "fluent-react": "0.8.2", - "form-data": "2.3.3", - "hawk": "7.0.10", - "jpm": "1.3.1", - "jsdom": "13.1.0", - "keygrip": "1.0.3", - "mobile-detect": "1.4.3", - "morgan": "1.9.1", - "mozlog": "2.2.0", - "multer": "1.4.1", - "node-fetch": "2.3.0", - "node-statsd": "0.1.1", - "nodemon": "1.18.9", - "nodify-uuid": "0.0.1", - "pg": "6.2.5", - "pg-patcher": "0.4.0", - "query-string": "6.2.0", "raven": "2.6.4", - "raven-js": "3.27.0", - "react": "16.6.3", - "react-dom": "16.6.3", - "react-masonry-component": "6.2.1", - "rimraf": "2.6.3", - "universal-analytics": "0.4.20", - "uuid": "3.3.2", - "valid-url": "1.0.9" + "raven-js": "3.27.0" }, "devDependencies": { + "jpm": "1.3.1", + "nodemon": "1.18.9", "addons-linter": "1.5.3", "audit-filter": "0.3.0", - "babel-cli": "6.26.0", - "babel-polyfill": "6.26.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-react": "6.24.1", - "body-parser": "1.18.3", - "browserify": "16.2.3", "envify": "4.1.0", "eslint": "4.19.1", "eslint-plugin-mozilla": "1.0.4", @@ -68,7 +23,6 @@ "eslint-plugin-react": "7.11.1", "fx-runner": "1.0.9", "geckodriver": "1.14.1", - "istanbul-middleware": "0.2.2", "mocha": "5.2.0", "node-sass": "4.11.0", "npm-run-all": "4.1.5", @@ -78,8 +32,6 @@ "sass-lint": "1.12.1", "selenium-webdriver": "4.0.0-alpha.1", "svgo": "1.1.1", - "uglify-es": "3.3.9", - "uglifyify": "5.0.1", "web-ext": "2.9.3" }, "engine-strict": true, @@ -87,7 +39,7 @@ "node": ">=8.0.0", "npm": ">=6.4.1" }, - "homepage": "https://screenshots.firefox.com", + "homepage": "https://github.com/mozilla-services/screenshots", "license": "MPL-2.0", "repository": { "type": "git", @@ -104,10 +56,8 @@ "posttest": "npm run lint", "test": "bin/test-helpers/make_addon_with_unavailable_server && mocha test/ test/server/unit/*", "test:selenium": "bin/test-helpers/make_addon_with_unavailable_server && mocha test/test.js", - "test:server": "make .venv && make server && cd test/server && ../../.venv/bin/pytest", "test:accessibility": "make .venv && .venv/bin/pytest test/accessibility --driver Firefox -srx --axe --verbose", "make_versions_exact": "node bin/build-scripts/make_versions_exact.js", - "fill_database": "make .venv && ./.venv/bin/python ./bin/load_test_exercise.py -q --little-image --create=50 --read-shot=0 --read-my-shots=0 --search=0 --new-account http://localhost:10080", "svgo": "find webextension/icons/*.svg | grep -v icon-v2.svg | xargs svgo && svgo --folder=static/img" } } diff --git a/server/db-patches/patch-0-1.sql b/server/db-patches/patch-0-1.sql deleted file mode 100644 index aea0687595..0000000000 --- a/server/db-patches/patch-0-1.sql +++ /dev/null @@ -1,41 +0,0 @@ --- This is the metadata for pg-patcher (pg-patcher will automatically update --- this for future updates): -CREATE TABLE property ( - key TEXT PRIMARY KEY, - value TEXT -); -INSERT INTO property(key, value) VALUES('patch', 1); - -CREATE TABLE accounts ( - id VARCHAR(200) PRIMARY KEY, - token TEXT -); - -CREATE TABLE devices ( - id varchar(200) PRIMARY KEY, - secret varchar(200) NOT NULL, - nickname TEXT, - avatarurl TEXT, - accountid VARCHAR(200) REFERENCES accounts(id) ON DELETE SET NULL -); - -CREATE INDEX devices_accountid_idx ON devices(accountid); - -CREATE TABLE data ( - id varchar(120) PRIMARY KEY, - deviceid varchar(200) REFERENCES devices (id), - created TIMESTAMP DEFAULT NOW(), - value TEXT NOT NULL -); - -CREATE TABLE signing_keys ( - created TIMESTAMP DEFAULT NOW(), - key TEXT -); - -CREATE TABLE states ( - state VARCHAR(64) PRIMARY KEY, - deviceid VARCHAR(200) REFERENCES devices(id) ON DELETE CASCADE -); - -CREATE INDEX states_deviceid_idx ON states(deviceid); diff --git a/server/db-patches/patch-1-0.sql b/server/db-patches/patch-1-0.sql deleted file mode 100644 index 1bbef6d929..0000000000 --- a/server/db-patches/patch-1-0.sql +++ /dev/null @@ -1,6 +0,0 @@ -DROP TABLE property; -DROP TABLE states; -DROP TABLE devices; -DROP TABLE accounts; -DROP TABLE signing_keys; -DROP TABLE data; diff --git a/server/db-patches/patch-1-2.sql b/server/db-patches/patch-1-2.sql deleted file mode 100644 index c74d22927c..0000000000 --- a/server/db-patches/patch-1-2.sql +++ /dev/null @@ -1,10 +0,0 @@ -ALTER TABLE data ADD head TEXT; -ALTER TABLE data ADD body TEXT; - -CREATE TABLE images ( - id VARCHAR(200) PRIMARY KEY, - shotid VARCHAR(200) NOT NULL REFERENCES data (id) ON DELETE CASCADE, - clipid VARCHAR(200) NOT NULL, - image BYTEA NOT NULL, - contenttype TEXT NOT NULL -); diff --git a/server/db-patches/patch-10-11.sql b/server/db-patches/patch-10-11.sql deleted file mode 100644 index ec03bafb9a..0000000000 --- a/server/db-patches/patch-10-11.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE TABLE metrics_cache ( - created TIMESTAMP DEFAULT NOW(), - data TEXT -); diff --git a/server/db-patches/patch-10-9.sql b/server/db-patches/patch-10-9.sql deleted file mode 100644 index 709feac393..0000000000 --- a/server/db-patches/patch-10-9.sql +++ /dev/null @@ -1 +0,0 @@ --- No reverse migration because 9->10 is a fixup for a bad 8->9 diff --git a/server/db-patches/patch-11-10.sql b/server/db-patches/patch-11-10.sql deleted file mode 100644 index b63c8cea61..0000000000 --- a/server/db-patches/patch-11-10.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE metrics_cache; diff --git a/server/db-patches/patch-11-12.sql b/server/db-patches/patch-11-12.sql deleted file mode 100644 index bef59f04d7..0000000000 --- a/server/db-patches/patch-11-12.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE device_activity; diff --git a/server/db-patches/patch-12-11.sql b/server/db-patches/patch-12-11.sql deleted file mode 100644 index 07192d9d87..0000000000 --- a/server/db-patches/patch-12-11.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE TABLE device_activity ( - deviceid character varying(200), - event_date timestamp without time zone DEFAULT now(), - event_type text, - event_info text -); diff --git a/server/db-patches/patch-12-13.sql b/server/db-patches/patch-12-13.sql deleted file mode 100644 index f45eff60ff..0000000000 --- a/server/db-patches/patch-12-13.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE devices ADD COLUMN ab_tests TEXT; diff --git a/server/db-patches/patch-13-12.sql b/server/db-patches/patch-13-12.sql deleted file mode 100644 index 2095e8e82e..0000000000 --- a/server/db-patches/patch-13-12.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE devices DROP COLUMN ab_tests; diff --git a/server/db-patches/patch-13-14.sql b/server/db-patches/patch-13-14.sql deleted file mode 100644 index 9863599551..0000000000 --- a/server/db-patches/patch-13-14.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE data DROP COLUMN head; -ALTER TABLE data DROP COLUMN body; diff --git a/server/db-patches/patch-14-13.sql b/server/db-patches/patch-14-13.sql deleted file mode 100644 index 1061dc4f28..0000000000 --- a/server/db-patches/patch-14-13.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE data ADD COLUMN head TEXT; -ALTER TABLE data ADD COLUMN body TEXT; diff --git a/server/db-patches/patch-14-15.sql b/server/db-patches/patch-14-15.sql deleted file mode 100644 index 4ba988151b..0000000000 --- a/server/db-patches/patch-14-15.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE data ALTER COLUMN url DROP NOT NULL; diff --git a/server/db-patches/patch-15-14.sql b/server/db-patches/patch-15-14.sql deleted file mode 100644 index 20495286c1..0000000000 --- a/server/db-patches/patch-15-14.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE data ALTER COLUMN url SET NOT NULL; diff --git a/server/db-patches/patch-15-16.sql b/server/db-patches/patch-15-16.sql deleted file mode 100644 index 273674cc76..0000000000 --- a/server/db-patches/patch-15-16.sql +++ /dev/null @@ -1,2 +0,0 @@ -CREATE TYPE shot_block_type AS ENUM ('none', 'dmca'); -ALTER TABLE data ADD COLUMN block_type shot_block_type DEFAULT 'none' NOT NULL; diff --git a/server/db-patches/patch-16-15.sql b/server/db-patches/patch-16-15.sql deleted file mode 100644 index 654a125640..0000000000 --- a/server/db-patches/patch-16-15.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE data DROP COLUMN block_type; -DROP TYPE shot_block_type; diff --git a/server/db-patches/patch-16-17.sql b/server/db-patches/patch-16-17.sql deleted file mode 100644 index 2310445222..0000000000 --- a/server/db-patches/patch-16-17.sql +++ /dev/null @@ -1,5 +0,0 @@ -ALTER TABLE devices DROP COLUMN avatarurl; -ALTER TABLE devices DROP COLUMN nickname; -ALTER TABLE accounts ADD COLUMN avatarurl text; -ALTER TABLE accounts ADD COLUMN nickname text; -ALTER TABLE accounts ADD COLUMN email text; diff --git a/server/db-patches/patch-17-16.sql b/server/db-patches/patch-17-16.sql deleted file mode 100644 index ee2779ecbc..0000000000 --- a/server/db-patches/patch-17-16.sql +++ /dev/null @@ -1,5 +0,0 @@ -ALTER TABLE devices ADD COLUMN avatarurl text; -ALTER TABLE devices ADD COLUMN nickname text; -ALTER TABLE accounts DROP COLUMN avatarurl; -ALTER TABLE accounts DROP COLUMN nickname; -ALTER TABLE accounts DROP COLUMN email; diff --git a/server/db-patches/patch-17-18.sql b/server/db-patches/patch-17-18.sql deleted file mode 100644 index b27465e848..0000000000 --- a/server/db-patches/patch-17-18.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE images ADD COLUMN size INT DEFAULT NULL; diff --git a/server/db-patches/patch-18-17.sql b/server/db-patches/patch-18-17.sql deleted file mode 100644 index 529fab54f6..0000000000 --- a/server/db-patches/patch-18-17.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE images DROP COLUMN size; diff --git a/server/db-patches/patch-18-19.sql b/server/db-patches/patch-18-19.sql deleted file mode 100644 index 18555f0cda..0000000000 --- a/server/db-patches/patch-18-19.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE images ADD COLUMN failed_delete BOOLEAN NOT NULL DEFAULT FALSE; diff --git a/server/db-patches/patch-19-18.sql b/server/db-patches/patch-19-18.sql deleted file mode 100644 index f89221fcb9..0000000000 --- a/server/db-patches/patch-19-18.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE images DROP COLUMN failed_delete; diff --git a/server/db-patches/patch-19-20.sql b/server/db-patches/patch-19-20.sql deleted file mode 100644 index 674f01a238..0000000000 --- a/server/db-patches/patch-19-20.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE INDEX data_deviceid_idx ON data (deviceid); diff --git a/server/db-patches/patch-2-1.sql b/server/db-patches/patch-2-1.sql deleted file mode 100644 index 17f392b7f6..0000000000 --- a/server/db-patches/patch-2-1.sql +++ /dev/null @@ -1,4 +0,0 @@ -ALTER TABLE data DROP COLUMN head; -ALTER TABLE data DROP COLUMN body; - -DROP TABLE images; diff --git a/server/db-patches/patch-2-3.sql b/server/db-patches/patch-2-3.sql deleted file mode 100644 index 592889be29..0000000000 --- a/server/db-patches/patch-2-3.sql +++ /dev/null @@ -1,10 +0,0 @@ -ALTER TABLE data ADD url TEXT; -ALTER TABLE data ADD expire_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP + INTERVAL '2 weeks'; -ALTER TABLE data ADD deleted BOOLEAN NOT NULL DEFAULT FALSE; - -UPDATE data SET url=(subquery.value::json->>'url') FROM (SELECT value, id FROM data WHERE url IS NULL) AS subquery WHERE data.id = subquery.id; - --- The test value rows are inserted without valid json, so they will still have null urls. -UPDATE data SET url='' WHERE url IS NULL; - -ALTER TABLE data ALTER COLUMN url SET NOT NULL; diff --git a/server/db-patches/patch-20-19.sql b/server/db-patches/patch-20-19.sql deleted file mode 100644 index 27f88e40e7..0000000000 --- a/server/db-patches/patch-20-19.sql +++ /dev/null @@ -1 +0,0 @@ -DROP INDEX data_deviceid_idx; diff --git a/server/db-patches/patch-20-21.sql b/server/db-patches/patch-20-21.sql deleted file mode 100644 index 686119d38f..0000000000 --- a/server/db-patches/patch-20-21.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE INDEX images_shotid_idx ON images (shotid); diff --git a/server/db-patches/patch-21-20.sql b/server/db-patches/patch-21-20.sql deleted file mode 100644 index 273ad385de..0000000000 --- a/server/db-patches/patch-21-20.sql +++ /dev/null @@ -1 +0,0 @@ -DROP INDEX images_shotid_idx; diff --git a/server/db-patches/patch-21-22.sql b/server/db-patches/patch-21-22.sql deleted file mode 100644 index 23eb5bbe11..0000000000 --- a/server/db-patches/patch-21-22.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE data ALTER COLUMN id TYPE character varying(270); -ALTER TABLE images ALTER COLUMN shotid TYPE character varying(270); diff --git a/server/db-patches/patch-22-23.sql b/server/db-patches/patch-22-23.sql deleted file mode 100644 index 7fd1d0db26..0000000000 --- a/server/db-patches/patch-22-23.sql +++ /dev/null @@ -1,9 +0,0 @@ --- pg-patcher runs migrations in transactions. However, ALTER TYPE ... ADD VALUE --- cannot be executed inside a transaction block. We will swap out the enum type --- with a new one instead. -ALTER TYPE shot_block_type RENAME TO old_shot_block_type; -CREATE TYPE shot_block_type AS ENUM ('none', 'dmca', 'abuse', 'usererror', 'watchdog'); -ALTER TABLE data ALTER COLUMN block_type DROP DEFAULT; -ALTER TABLE data ALTER COLUMN block_type TYPE shot_block_type USING block_type::text::shot_block_type; -ALTER TABLE data ALTER COLUMN block_type SET DEFAULT 'none'::shot_block_type; -DROP TYPE old_shot_block_type; diff --git a/server/db-patches/patch-23-22.sql b/server/db-patches/patch-23-22.sql deleted file mode 100644 index 64951e908d..0000000000 --- a/server/db-patches/patch-23-22.sql +++ /dev/null @@ -1,4 +0,0 @@ --- Records using the new enum values from 22-23 must be updated or deleted in --- order to update the enum type. Moreover, the entire `data` table must be --- updated to use a new enum type (see 22-23 for what's entailed). --- For those reasons, we refrain from removing the enum values in here. diff --git a/server/db-patches/patch-23-24.sql b/server/db-patches/patch-23-24.sql deleted file mode 100644 index 0a56256ac1..0000000000 --- a/server/db-patches/patch-23-24.sql +++ /dev/null @@ -1,12 +0,0 @@ -CREATE TABLE watchdog_submissions ( - id SERIAL, - shot_id CHARACTER VARYING(270) NOT NULL, - request_id CHARACTER(36) NOT NULL, - nonce CHARACTER(36) NOT NULL, - positive_result boolean, - CONSTRAINT watchdog_pkey PRIMARY KEY (id), - CONSTRAINT watchdog_shot_id_fkey FOREIGN KEY (shot_id) - REFERENCES data(id) - ON UPDATE NO ACTION - ON DELETE CASCADE -); diff --git a/server/db-patches/patch-24-23.sql b/server/db-patches/patch-24-23.sql deleted file mode 100644 index a547c76989..0000000000 --- a/server/db-patches/patch-24-23.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE watchdog_submissions; diff --git a/server/db-patches/patch-24-25.sql b/server/db-patches/patch-24-25.sql deleted file mode 100644 index 0907ba1781..0000000000 --- a/server/db-patches/patch-24-25.sql +++ /dev/null @@ -1,3 +0,0 @@ -ALTER TABLE data ADD COLUMN firefox_major_version INT DEFAULT NULL; -ALTER TABLE data ADD COLUMN firefox_channel TEXT DEFAULT NULL; -CREATE INDEX firefox_major_version_created ON data (firefox_major_version, created); diff --git a/server/db-patches/patch-25-24.sql b/server/db-patches/patch-25-24.sql deleted file mode 100644 index c6660ae698..0000000000 --- a/server/db-patches/patch-25-24.sql +++ /dev/null @@ -1,3 +0,0 @@ -ALTER TABLE data DROP COLUMN firefox_major_version; -ALTER TABLE data DROP COLUMN firefox_channel; -DROP INDEX firefox_major_version_created; diff --git a/server/db-patches/patch-25-26.sql b/server/db-patches/patch-25-26.sql deleted file mode 100644 index 999b2dd78a..0000000000 --- a/server/db-patches/patch-25-26.sql +++ /dev/null @@ -1,5 +0,0 @@ -ALTER TABLE signing_keys ADD COLUMN scope TEXT; --- We don't want 'legacy' to actually be the default, we just want to set our existing --- keys to this scope, and force new keys to have an explicit scope set: -UPDATE signing_keys SET scope = 'legacy'; -ALTER TABLE signing_keys ALTER COLUMN scope SET NOT NULL; diff --git a/server/db-patches/patch-26-25.sql b/server/db-patches/patch-26-25.sql deleted file mode 100644 index 008850f96c..0000000000 --- a/server/db-patches/patch-26-25.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE signing_keys DROP COLUMN scope; diff --git a/server/db-patches/patch-26-27.sql b/server/db-patches/patch-26-27.sql deleted file mode 100644 index c7a4e026b8..0000000000 --- a/server/db-patches/patch-26-27.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE INDEX data_firefox_channel ON data (firefox_channel); diff --git a/server/db-patches/patch-27-26.sql b/server/db-patches/patch-27-26.sql deleted file mode 100644 index 6606d02c44..0000000000 --- a/server/db-patches/patch-27-26.sql +++ /dev/null @@ -1 +0,0 @@ -DROP INDEX data_firefox_channel; diff --git a/server/db-patches/patch-27-28.sql b/server/db-patches/patch-27-28.sql deleted file mode 100644 index 8011ea2354..0000000000 --- a/server/db-patches/patch-27-28.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE states DROP CONSTRAINT states_deviceid_fkey; diff --git a/server/db-patches/patch-28-27.sql b/server/db-patches/patch-28-27.sql deleted file mode 100644 index cda1701170..0000000000 --- a/server/db-patches/patch-28-27.sql +++ /dev/null @@ -1,4 +0,0 @@ -DELETE FROM STATES WHERE DEVICEID NOT IN -(SELECT DEVICEID FROM STATES, DEVICES WHERE STATES.DEVICEID = DEVICES.ID); -ALTER TABLE ONLY states -ADD CONSTRAINT states_deviceid_fkey FOREIGN KEY (deviceid) REFERENCES devices(id) ON DELETE CASCADE; diff --git a/server/db-patches/patch-3-2.sql b/server/db-patches/patch-3-2.sql deleted file mode 100644 index ce57f493f1..0000000000 --- a/server/db-patches/patch-3-2.sql +++ /dev/null @@ -1,3 +0,0 @@ -ALTER TABLE data DROP COLUMN url; -ALTER TABLE data DROP COLUMN expire_time; -ALTER TABLE data DROP COLUMN deleted; diff --git a/server/db-patches/patch-3-4.sql b/server/db-patches/patch-3-4.sql deleted file mode 100644 index 9c46c532b5..0000000000 --- a/server/db-patches/patch-3-4.sql +++ /dev/null @@ -1,3 +0,0 @@ - -ALTER TABLE data DROP CONSTRAINT data_deviceid_fkey; -ALTER TABLE data ADD CONSTRAINT data_deviceid_fkey FOREIGN KEY (deviceid) REFERENCES devices (id) ON DELETE CASCADE; diff --git a/server/db-patches/patch-4-3.sql b/server/db-patches/patch-4-3.sql deleted file mode 100644 index 313f07bdc9..0000000000 --- a/server/db-patches/patch-4-3.sql +++ /dev/null @@ -1,3 +0,0 @@ - -ALTER TABLE data DROP CONSTRAINT data_deviceid_fkey; -ALTER TABLE data ADD CONSTRAINT data_deviceid_fkey FOREIGN KEY (deviceid) REFERENCES devices (id); diff --git a/server/db-patches/patch-4-5.sql b/server/db-patches/patch-4-5.sql deleted file mode 100644 index 8cb415713b..0000000000 --- a/server/db-patches/patch-4-5.sql +++ /dev/null @@ -1,11 +0,0 @@ -ALTER TABLE devices ADD COLUMN last_addon_version TEXT; -ALTER TABLE devices ADD COLUMN last_login TIMESTAMP; -ALTER TABLE devices ADD COLUMN created TIMESTAMP DEFAULT NOW(); -ALTER TABLE devices ADD COLUMN session_count INTEGER DEFAULT 0; - -CREATE TABLE device_activity ( - deviceid VARCHAR(200) REFERENCES devices (id) ON DELETE CASCADE, - event_date TIMESTAMP DEFAULT NOW(), - event_type TEXT, - event_info TEXT -); diff --git a/server/db-patches/patch-5-4.sql b/server/db-patches/patch-5-4.sql deleted file mode 100644 index 8d84d3d560..0000000000 --- a/server/db-patches/patch-5-4.sql +++ /dev/null @@ -1,6 +0,0 @@ -ALTER TABLE devices DROP COLUMN last_addon_version; -ALTER TABLE devices DROP COLUMN last_login; -ALTER TABLE devices DROP COLUMN created; -ALTER TABLE devices DROP COLUMN session_count; - -DROP TABLE device_activity; diff --git a/server/db-patches/patch-5-6.sql b/server/db-patches/patch-5-6.sql deleted file mode 100644 index 253ed58d4c..0000000000 --- a/server/db-patches/patch-5-6.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE data ADD COLUMN title TEXT; diff --git a/server/db-patches/patch-6-5.sql b/server/db-patches/patch-6-5.sql deleted file mode 100644 index e2ff2a0e29..0000000000 --- a/server/db-patches/patch-6-5.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE data DROP COLUMN title; diff --git a/server/db-patches/patch-6-7.sql b/server/db-patches/patch-6-7.sql deleted file mode 100644 index c92555e4f4..0000000000 --- a/server/db-patches/patch-6-7.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE images DROP COLUMN image; -ALTER TABLE images ADD COLUMN url TEXT; diff --git a/server/db-patches/patch-7-6.sql b/server/db-patches/patch-7-6.sql deleted file mode 100644 index 9172e72d3e..0000000000 --- a/server/db-patches/patch-7-6.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE images DROP COLUMN url; -ALTER TABLE images ADD COLUMN image bytea NOT NULL; diff --git a/server/db-patches/patch-7-8.sql b/server/db-patches/patch-7-8.sql deleted file mode 100644 index 6f88047269..0000000000 --- a/server/db-patches/patch-7-8.sql +++ /dev/null @@ -1,3 +0,0 @@ -ALTER TABLE data ADD COLUMN searchable_text tsvector; -ALTER TABLE data ADD COLUMN searchable_version INT; -CREATE INDEX searchable_text_idx ON data USING GIN(searchable_text); diff --git a/server/db-patches/patch-8-7.sql b/server/db-patches/patch-8-7.sql deleted file mode 100644 index 38ea23eac8..0000000000 --- a/server/db-patches/patch-8-7.sql +++ /dev/null @@ -1,3 +0,0 @@ -ALTER TABLE data DROP COLUMN searchable_text; -ALTER TABLE data DROP COLUMN searchable_version; -DROP INDEX IF EXISTS searchable_text_idx; diff --git a/server/db-patches/patch-8-9.sql b/server/db-patches/patch-8-9.sql deleted file mode 100644 index 036b772f3a..0000000000 --- a/server/db-patches/patch-8-9.sql +++ /dev/null @@ -1,11 +0,0 @@ -ALTER TABLE devices ADD COLUMN secret_hashed TEXT; --- This is necessary for migrating a live database that existed at an earlier level --- This is the only case where we need pgcrypto, and that can make it harder to get this app running --- Therefore we are commenting out this migration on the assumption that no one in the world has a --- database with accounts that need migrating --- ---CREATE EXTENSION IF NOT EXISTS pgcrypto; ---UPDATE devices --- SET secret_hashed = 'shaHmac:migrated:' || encode(hmac(secret, 'migrated', 'sha256'), 'hex'); - -ALTER TABLE devices DROP COLUMN secret; diff --git a/server/db-patches/patch-9-10.sql b/server/db-patches/patch-9-10.sql deleted file mode 100644 index c96d76bc65..0000000000 --- a/server/db-patches/patch-9-10.sql +++ /dev/null @@ -1,2 +0,0 @@ --- This is a fix for a bad 8->9 migration -ALTER TABLE devices DROP COLUMN IF EXISTS secret; diff --git a/server/db-patches/patch-9-8.sql b/server/db-patches/patch-9-8.sql deleted file mode 100644 index 2e92d96fcc..0000000000 --- a/server/db-patches/patch-9-8.sql +++ /dev/null @@ -1,3 +0,0 @@ --- Note: we can't recover secret, so this is kind of a bad reverse-migration -ALTER TABLE devices ADD COLUMN secret TEXT; -ALTER TABLE devices DROP COLUMN secret_hashed; diff --git a/server/schema.sql b/server/schema.sql deleted file mode 100644 index bab139dfb9..0000000000 --- a/server/schema.sql +++ /dev/null @@ -1,107 +0,0 @@ -CREATE TYPE shot_block_type AS ENUM ( - 'none', - 'dmca', - 'abuse', - 'usererror', - 'watchdog' -); -CREATE TABLE accounts ( - id character varying(200) NOT NULL, - token text, - avatarurl text, - nickname text, - email text -); -CREATE TABLE data ( - id character varying(270) NOT NULL, - deviceid character varying(200), - created timestamp without time zone DEFAULT now(), - value text NOT NULL, - url text, - expire_time timestamp without time zone DEFAULT (now() + '14 days'::interval), - deleted boolean DEFAULT false NOT NULL, - title text, - searchable_text tsvector, - searchable_version integer, - block_type shot_block_type DEFAULT 'none'::shot_block_type NOT NULL -); -CREATE TABLE devices ( - id character varying(200) NOT NULL, - accountid character varying(200), - last_addon_version text, - last_login timestamp without time zone, - created timestamp without time zone DEFAULT now(), - session_count integer DEFAULT 0, - secret_hashed text, - ab_tests text -); -CREATE TABLE images ( - id character varying(200) NOT NULL, - shotid character varying(270) NOT NULL, - clipid character varying(200) NOT NULL, - contenttype text NOT NULL, - url text, - size integer, - failed_delete boolean DEFAULT false NOT NULL -); -CREATE TABLE metrics_cache ( - created timestamp without time zone DEFAULT now(), - data text -); -CREATE TABLE property ( - key text NOT NULL, - value text -); -CREATE TABLE signing_keys ( - created timestamp without time zone DEFAULT now(), - key text -); -CREATE TABLE states ( - state character varying(64) NOT NULL, - deviceid character varying(200) -); -CREATE TABLE watchdog_submissions ( - id integer NOT NULL, - shot_id character varying(270) NOT NULL, - request_id character(36) NOT NULL, - nonce character(36) NOT NULL, - positive_result boolean -); -CREATE SEQUENCE watchdog_submissions_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; -ALTER SEQUENCE watchdog_submissions_id_seq OWNED BY watchdog_submissions.id; -ALTER TABLE ONLY watchdog_submissions ALTER COLUMN id SET DEFAULT nextval('watchdog_submissions_id_seq'::regclass); -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (id); -ALTER TABLE ONLY data - ADD CONSTRAINT data_pkey PRIMARY KEY (id); -ALTER TABLE ONLY devices - ADD CONSTRAINT devices_pkey PRIMARY KEY (id); -ALTER TABLE ONLY images - ADD CONSTRAINT images_pkey PRIMARY KEY (id); -ALTER TABLE ONLY property - ADD CONSTRAINT property_pkey PRIMARY KEY (key); -ALTER TABLE ONLY states - ADD CONSTRAINT states_pkey PRIMARY KEY (state); -ALTER TABLE ONLY watchdog_submissions - ADD CONSTRAINT watchdog_pkey PRIMARY KEY (id); -CREATE INDEX data_deviceid_idx ON data USING btree (deviceid); -CREATE INDEX devices_accountid_idx ON devices USING btree (accountid); -CREATE INDEX images_shotid_idx ON images USING btree (shotid); -CREATE INDEX searchable_text_idx ON data USING gin (searchable_text); -CREATE INDEX states_deviceid_idx ON states USING btree (deviceid); -ALTER TABLE ONLY data - ADD CONSTRAINT data_deviceid_fkey FOREIGN KEY (deviceid) REFERENCES devices(id) ON DELETE CASCADE; -ALTER TABLE ONLY devices - ADD CONSTRAINT devices_accountid_fkey FOREIGN KEY (accountid) REFERENCES accounts(id) ON DELETE SET NULL; -ALTER TABLE ONLY images - ADD CONSTRAINT images_shotid_fkey FOREIGN KEY (shotid) REFERENCES data(id) ON DELETE CASCADE; -ALTER TABLE ONLY states - ADD CONSTRAINT states_deviceid_fkey FOREIGN KEY (deviceid) REFERENCES devices(id) ON DELETE CASCADE; -ALTER TABLE ONLY watchdog_submissions - ADD CONSTRAINT watchdog_shot_id_fkey FOREIGN KEY (shot_id) REFERENCES data(id) ON DELETE CASCADE; --- pg-patch version: 24 diff --git a/server/src/ab-tests.js b/server/src/ab-tests.js deleted file mode 100644 index ef69409090..0000000000 --- a/server/src/ab-tests.js +++ /dev/null @@ -1,250 +0,0 @@ -/** A/B test assignment support - -This assigns users to tests using the `abTests.updateAbTests(obj)` function - -Tests are defined directly in this file, in the `allTests` variable. A comment -below shows what these test objects look like. -*/ -// Note: these get turned into Test objects: -let allTests = { - shotShareIcon: { - description: "Use a different share icon", - gaField: "cd7", - version: 1, - options: [ - {name: "newicon", probability: 0.1}, - ], - exclude: ["*"], - }, - downloadText: { - description: "Test the effect of removing the word 'Download' from the download button on the shot page", - gaField: "cd9", - version: 1, - options: [ - {name: "no-download-text", probability: 0.1}, - ], - exclude: ["*"], - appliesToPublic: true, - }, -}; - -/* Example of how this could be set: */ -/* -let allTests = { - autoOpenSharePanel: { - description: "Open the share panel immediately after shot creation", - // Any actions the user does will have this GA field set: - gaField: "cd3", - // If the user creates a shot, and then someone else VIEWS that shot, then - // this field will be set in the viewers events: - shotField: "cd4", - // If you make updates (like add an option) and increment this, then users - // who were previously excluded may get put into a new group: - version: 1, - // Exclude the user if they are in any of these tests: - exclude: ["highlightButtonOnInstall", "myShotsDisplay"], - // Or exclude them if they are in any test: - // exclude: ["*"], - // If you want this A/B test to apply to unauthenticated users: - appliesToPublic: true, - // These are the actual allowed A/B options (control is never specified): - options: [ - // The name of the option, and its probabilty (e.g., 10% chance of getting - // into this group). This will cause 5% of people to be in autoopen, 5% of - // people to be in control, and 90% to be in exclude: - {name: "autoopen", probability: 0.1} - ] - }, - highlightButtonOnInstall: { - description: "Highlight the toolbar button when extension is installed", - gaField: "cd5", - version: 1, - exclude: ["autoOpenSharePanel", "myShotsDisplay"], - options: [ - {name: "uitour", probability: 0.1} - ] - }, - myShotsDisplay: { - description: "Show My Shots button/CTA differently", - gaField: "cd6", - version: 1, - exclude: ["highlightButtonOnInstall", "autoOpenSharePanel"], - options: [ - // Note no one will end up in exclude in this example (but 50% will still - // be control): - {name: "intropopup", probability: 0.9}, - {name: "blink", probability: 0.1} - ] - } -}; -*/ - -// Any test names listed here will get removed from the A/B tests. Tests should -// be moved here once we are uninterested in any future data from the test: -const deprecatedTests = ["highlightButtonOnInstall", "styleMyShotsButton", "autoOpenSharePanel"]; - -class Test { - constructor(options) { - const requiredFields = ["name", "gaField", "description", "version", "options"]; - const allowedFields = requiredFields.concat(["shotField", "exclude", "appliesToPublic"]); - for (const required of requiredFields) { - if (!(required in options)) { - throw new Error(`Missing constructor field: ${required}`); - } - } - for (const found in options) { - if (!allowedFields.includes(found)) { - throw new Error(`Unexpected constructor field: ${found}`); - } - } - Object.assign(this, options); - } - - updateTest(tests, forceValue, unauthed) { - if (unauthed && !this.appliesToPublic) { - return; - } - if (forceValue) { - tests[this.name] = this.testWithValue(forceValue); - } - if (tests[this.name] && tests[this.name].version >= this.version) { - return; - } - if (this.shouldExclude(tests)) { - tests[this.name] = this.testWithValue("exclude"); - } else { - let prob = getRandom(); - let setAny = false; - for (const option of this.options) { - if (prob < option.probability) { - const controlProb = getRandom(); - if (controlProb < 0.5) { - tests[this.name] = this.testWithValue("control"); - } else { - tests[this.name] = this.testWithValue(option.name); - } - setAny = true; - break; - } - prob -= option.probability; - } - if (!setAny) { - tests[this.name] = this.testWithValue("exclude"); - } - } - } - - testWithValue(value) { - const result = {value, gaField: this.gaField, version: this.version}; - if (this.shotField) { - result.shotField = this.shotField; - } - return result; - } - - shouldExclude(tests) { - const excludes = this.exclude || []; - for (const testName of excludes) { - if (tests[testName] && tests[testName].value !== "exclude") { - return true; - } - } - if (excludes.includes("*")) { - for (const testName in tests) { - if (testName !== this.name && tests[testName].value !== "exclude") { - return true; - } - } - } - return false; - } - -} - -/** Update a user's abTests values. - The optional forceTests looks like {aTests: "forceValue"} */ -exports.updateAbTests = function(tests, forceTests, unauthed) { - for (const testName in allTests) { - allTests[testName].updateTest(tests, forceTests && forceTests[testName], unauthed); - } - for (const testName of deprecatedTests) { - if (testName in tests) { - delete tests[testName]; - } - } - return tests; -}; - -let randomSeq; - -exports.setRandomSequenceForTesting = function(seq) { - seq = seq || undefined; - if (seq) { - if (!Array.isArray(seq)) { - throw new Error("setRandomSequenceForTesting([]) can only take an Array"); - } - for (const i of seq) { - if (typeof i !== "number" || i < 0 || i >= 1) { - throw new Error(`Bad item in array: ${JSON.stringify(i)}`); - } - } - } - randomSeq = seq; -}; - -exports.setAllTestsForTesting = function(x) { - if (x === undefined) { - allTests = origAllTests; - return; - } - setTests(x); -}; - -function setTests(tests) { - const seenFields = {}; - allTests = {}; - for (const testName in tests) { - const test = new Test(Object.assign({name: testName}, tests[testName])); - allTests[testName] = test; - if (seenFields[test.gaField]) { - throw new Error(`Two tests with field ${test.gaField}`); - } - seenFields[test.gaField] = true; - if (test.shotField) { - if (seenFields[test.shotField]) { - throw new Error(`Two tests with field ${test.shotField}`); - } - seenFields[test.shotField] = true; - } - } -} - -setTests(allTests); -const origAllTests = allTests; - -function getRandom() { - if (randomSeq) { - if (!randomSeq.length) { - throw new Error("Ran out of testing random numbers"); - } - const next = randomSeq.shift(); - return next; - } - return Math.random(); -} - -/** Given a test name and test value that were set when a Shot was created (not - set on the user), return the GA field that should be set for someone viewing - the shot (or null if nothing should be set) */ -exports.shotGaFieldForValue = function(testName, testValue) { - if (deprecatedTests.includes(testName)) { - // Silently ignore deprecated tests - return null; - } - const test = allTests[testName]; - if (!test) { - console.error("Test name", testName, "is not known"); - return null; - } - return test.shotField || null; -}; diff --git a/server/src/ad-banner.js b/server/src/ad-banner.js deleted file mode 100644 index 2740bddc2a..0000000000 --- a/server/src/ad-banner.js +++ /dev/null @@ -1,80 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const sendEvent = require("./browser-send-event.js"); -const { PromotionStrategy } = require("./promotion-strategy.js"); - -exports.AdBanner = class AdBanner extends React.Component { - constructor(props) { - super(props); - } - - clickedInstallFirefox() { - sendEvent("click-install-firefox-shot", {useBeacon: true}); - } - - clickedSignIn() { - sendEvent("fxa-signin-ad-banner", {useBeacon: true}); - } - - clickedDeprecation() { - sendEvent("clicked-deprecation-banner", {useBeacon: true}); - } - - render() { - let bannerContent = null; - const promoStrategy = new PromotionStrategy(); - - if (promoStrategy.shouldShowFirefoxBanner(this.props.shouldGetFirefox, this.props.isOwner)) { - const upsellLink = Get Firefox now; - bannerContent = -

- Screenshots made simple. Take, save and share screenshots without leaving Firefox. {upsellLink} -

-
; - } else if (promoStrategy.shouldShowFxaBanner(this.props.hasFxa)) { - const signInLink = ; - bannerContent = -

- Sign in or sign up to sync shots across devices, save your favorite shots forever. -

-
; - } else if (promoStrategy.shouldShowDeprecation()) { - // FIXME: should be updated to the SUMO page later: - const shutdownLink = ; - bannerContent =
-

- } a={shutdownLink}> - - Saved screenshots are expiring soon. - Starting in June, Screenshots will no longer offer online storage. Want to keep shots from your library? Download them to your computer. - - -

-
; - } - - if (bannerContent) { - return ; - } - return null; - } -}; - -exports.AdBanner.propTypes = { - isOwner: PropTypes.bool, - hasFxa: PropTypes.bool, - shouldGetFirefox: PropTypes.bool, -}; - -exports.AdBanner.defaultProps = { - shouldGetFirefox: false, -}; diff --git a/server/src/b64.js b/server/src/b64.js deleted file mode 100644 index 0a620a1511..0000000000 --- a/server/src/b64.js +++ /dev/null @@ -1,10 +0,0 @@ -exports.b64EncodeJson = function(obj) { - obj = JSON.stringify(obj); - const buffer = new Buffer(obj, "binary"); - return buffer.toString("base64"); -}; - -exports.b64DecodeJson = function(b64) { - const string = new Buffer(b64, "base64").toString("binary"); - return JSON.parse(string); -}; diff --git a/server/src/browser-send-event.js b/server/src/browser-send-event.js deleted file mode 100644 index d29eebdea3..0000000000 --- a/server/src/browser-send-event.js +++ /dev/null @@ -1,24 +0,0 @@ -/* This module exists because on some browsers we find that ga-analytics doesn't get loaded */ - -let sentEvent = false; - -if (typeof window !== "undefined" && window.sendEvent) { - module.exports = window.sendEvent; -} else { - module.exports = function() { - if (window.sendEvent) { - window.sendEvent.apply(null, arguments); - } else { - // eslint-disable-next-line no-console - console.log.apply(console, ["missing sendEvent("].concat(Array.from(arguments).concat([")"]))); - if (!sentEvent) { - // Initialization to send events can take a while: - setTimeout(() => { - const event = new CustomEvent("error-no-sendEvent"); - document.dispatchEvent(event); - }, 3000); - sentEvent = true; - } - } - }; -} diff --git a/server/src/caching.js b/server/src/caching.js deleted file mode 100644 index 71224fc1a5..0000000000 --- a/server/src/caching.js +++ /dev/null @@ -1,34 +0,0 @@ -const config = require("./config").getProperties(); - -const tenMinutesInSeconds = 10 * 60; -const aDayInSeconds = 24 * 60 * 60; -exports.cacheTime = 60 * 60 * 24 * 30; // 30 days - -if (!config.setCache) { - exports.cacheTime = 0; -} - -function createCacheSetter(maxAge, flags) { - return function(res, options) { - if (config.setCache && maxAge) { - let vals = []; - options = options || {}; - - const pub = options.private ? "private" : "public"; - vals.push(pub); - vals.push(`max-age=${maxAge}`); - - if (flags) { - vals = vals.concat(flags); - } - - res.set("Cache-Control", vals.join(", ")); - } else { - res.set("Cache-Control", "no-cache"); - } - }; -} - -exports.doNotCache = createCacheSetter(0); -exports.setMonthlyCache = createCacheSetter(exports.cacheTime); -exports.setDailyCache = createCacheSetter(aDayInSeconds, `s-maxage=${tenMinutesInSeconds}`); diff --git a/server/src/config.js b/server/src/config.js deleted file mode 100644 index b129b4512f..0000000000 --- a/server/src/config.js +++ /dev/null @@ -1,434 +0,0 @@ -/* Note: do not use ES6 features here, we need to use this module from the build system before translation */ -const convict = require("convict"); -const envc = require("envc"); - -// Populate `process.env` with overrides from environment-specific `.env` -// files as a side effect. See `https://npmjs.org/envc` for more info. -envc({booleans: true}); - -const conf = convict({ - port: { - doc: "The Screenshots server port", - format: "port", - default: 10080, - env: "PORT", - arg: "port", - }, - siteOrigin: { - doc: "The server public origin (except protocol)", - format: String, - default: "localhost:10080", - env: "SITE_ORIGIN", - arg: "siteOrigin", - }, - contentOrigin: { - doc: "The content server public origin (except protocol)", - format: String, - default: "localhost:10080", - env: "CONTENT_ORIGIN", - arg: "contentOrigin", - }, - expectProtocol: { - doc: "Treat all incoming requests as using this protocol, instead of defaulting to http: or detecting from X-Forwarded-Proto", - format: String, - default: "", - env: "EXPECT_PROTOCOL", - arg: "expectProtocol", - }, - localhostSsl: { - doc: "Turn on SSL on localhost, using ~/.localhost-ssl/*", - format: Boolean, - default: false, - env: "LOCALHOST_SSL", - arg: "localhost-ssl", - }, - pngToJpegCutoff: { - doc: "The limit at which a PNG is converted to a JPEG during an edit save, in bytes. It should match the setting in the addon", - format: "int", - default: 2500000, - env: "PNG_TO_JPEG_CUTOFF", - arg: "pngToJpegCutoff", - }, - requestBodySizeLimit: { - doc: "The maximum allowed body size of a request. It needs to be a format that the 'bytes' node module accepts", - format: String, - default: "25mb", - env: "REQUEST_BODY_SIZE_LIMIT", - arg: "requestBodySizeLimit", - }, - useS3: { - doc: "If true, store files in s3. If false, store them locally", - format: Boolean, - default: false, - env: "USE_S3", - arg: "useS3", - }, - s3BucketName: { - doc: "The name of the bucket to use on s3, if useS3 is true", - format: String, - default: "pageshot-images-bucket", - env: "S3_BUCKET_NAME", - arg: "s3BucketName", - }, - fxa: { - oAuthServer: { - doc: "The FxA OAuth server base URL", - format: String, - default: "https://oauth-stable.dev.lcip.org/v1", - env: "FXA_OAUTH_URI", - arg: "oauth-server", - }, - profileServer: { - doc: "The FxA profile server base URL", - format: String, - default: "https://stable.dev.lcip.org/profile/v1", - env: "FXA_PROFILE_URI", - arg: "profile-server", - }, - clientId: { - doc: "The OAuth client ID", - format: String, - default: "", - env: "FXA_CLIENT_ID", - arg: "fxa-client-id", - }, - clientSecret: { - doc: "The OAuth client secret", - format: String, - default: "", - env: "FXA_CLIENT_SECRET", - arg: "fxa-client-secret", - }, - profileImageServer: { - doc: "Firefox Account user avatar url", - format: String, - default: "https://firefoxusercontent.com", - env: "FXA_PROFILE_IMAGE_URI", - arg: "fxa-profile-image-uri", - }, - }, - db: { - user: { - doc: "The Postgres user", - format: String, - default: process.env.USER, - env: "RDS_USERNAME", - arg: "db-user", - }, - password: { - doc: "The Postgres password", - format: String, - default: "", - env: "RDS_PASSWORD", - arg: "db-pass", - }, - host: { - doc: "The Postgres server host and port", - format: String, - default: "localhost:5432", - env: "RDS_HOSTNAME", - arg: "db-host", - }, - dbname: { - doc: "The Postgres database", - format: String, - default: "", - env: "RDS_NAME", - arg: "db-name", - }, - disableDownPatches: { - doc: "Skip database downgrade patches", - format: Boolean, - default: false, - env: "NO_PG_DOWNGRADES", - arg: "no-pg-downgrades", - }, - forceDbVersion: { - doc: "Force database version (for use in downgrades)", - format: "int", - default: 0, - env: "FORCE_DB_VERSION", - arg: "force-db-version", - }, - logQueryLimit: { - doc: "Log queries that take more than time amount of time (in milliseconds)", - format: "int", - default: 50, - env: "LOG_QUERY_LIMIT", - arg: "log-query-limit", - }, - pool: { - connectionTimeoutMillis: { - doc: "Number of milliseconds to wait before timing out when connecting a new db client", - format: "int", - default: 5000, - env: "PG_POOL_CLIENT_TIMEOUT", - arg: "pg-pool-client-timeout", - }, - idleTimeoutMillis: { - doc: "Number of milliseconds of idle before a db client is disconnected", - format: "int", - default: 10000, - env: "PG_POOL_CLIENT_IDLE", - arg: "pg-pool-client-idle", - }, - max: { - doc: "Maximum number of clients in the connection pool", - format: "int", - default: 10, - env: "PG_POOL_CLIENT_LIMTI", - arg: "pg-pool-client-limit", - }, - }, - }, - gaId: { - doc: "Give the Google Analytics code", - format: String, - default: "", - env: "GA_ID", - arg: "ga-id", - }, - // This is mostly configurable for debugging purposes: - checkDeletedInterval: { - doc: "Frequency in seconds to check for items that should be purged", - format: Number, - default: 60 * 60, // 1 hour - env: "CHECK_DELETED_INTERVAL", - arg: "check-deleted-interval", - }, - expiredRetentionTime: { - doc: "Amount of time to keep an expired shot, in seconds", - format: "int", - default: 60 * 60 * 24 * 14, // 14 days - env: "EXPIRED_RETENTION_TIME", - arg: "expired-retention-time", - }, - defaultExpiration: { - doc: "Default expiration time, in seconds", - format: "int", - default: 60 * 60 * 24 * 14, // 14 days - env: "DEFAULT_EXPIRATION", - arg: "default-expiration", - }, - refreshMetricsTime: { - doc: "Interval when the stats in /metrics are recalculated, in seconds (0 to disable)", - format: "int", - default: 60 * 60, // 1 hour - env: "REFRESH_METRICS_TIME", - arg: "refresh-metrics-time", - }, - disableMetrics: { - doc: "If true, do not mount /metrics or start jobs", - format: Boolean, - default: false, - env: "DISABLE_METRICS", - arg: "disable-metrics", - }, - sentryDSN: { - doc: "The sentry DSN URL to use for recording errors, if any. Sentry is not used on the server unless this parameter is provided.", - format: String, - default: "", - env: "SENTRY_DSN", - arg: "sentry-dsn", - }, - sentryPublicDSN: { - doc: "The public sentry DSN URL to use for recording errors from the site and from the addon. Sentry is not used on the client if this parameter is not provided.", - format: String, - default: "", - env: "SENTRY_PUBLIC_DSN", - arg: "sentry-public-dsn", - }, - upgradeSearchBatchSize: { - doc: "Number of search records to try to upgrade at one time (in minutes)", - format: "int", - default: 100, - env: "UPGRADE_SEARCH_BATCH_SIZE", - arg: "upgrade-search-batch-size", - }, - log: { - lint: { - doc: "Whether to lint usage of log messages", - format: Boolean, - default: false, - env: "LOG_LINT", - arg: "log-lint", - }, - level: { - doc: "Log level to emit", - format: String, - default: "info", - env: "LOG_LEVEL", - arg: "log-level", - }, - }, - showStackTraces: { - doc: "Whether to show stack traces in 500 HTTP responses", - format: Boolean, - default: false, - env: "SHOW_STACK_TRACES", - arg: "show-stack-traces", - }, - testing: { - failSometimes: { - doc: "Fail on PUT /data/... requests sometimes (succeed 1 every N times)", - format: "int", - default: 0, - env: "TEST_FAIL_SOMETIMES", - arg: "test-fail-sometimes", - }, - slowResponse: { - doc: "Add N milliseconds to the response time for PUT /data/...", - format: "int", - default: 0, - env: "TEST_SLOW_RESPONSE", - arg: "test-slow-response", - }, - }, - statsdPrefix: { - doc: "Prefix for statsd messages, also indicates we should use statsd", - format: String, - default: "", - env: "STATSD_PREFIX", - arg: "statsd-prefix", - }, - setCache: { - doc: "Set Cache-Control headers", - format: Boolean, - default: true, - env: "SET_CACHE", - arg: "set-cache", - }, - disableControllerTasks: { - doc: "If true, then do not run migrations and periodic tasks on this server instance", - format: Boolean, - default: false, - env: "DISABLE_CONTROLLER_TASKS", - arg: "disable-controller-tasks", - }, - forceAbTests: { - doc: "Force AB tests, looks like 'testName=value testName2=value'", - format: String, - default: "", - env: "FORCE_AB_TESTS", - arg: "force-ab-tests", - }, - disableSearch: { - doc: "If true, then hide the search bar", - format: Boolean, - default: true, - env: "DISABLE_SEARCH", - arg: "disable-search", - }, - siteCdn: { - doc: "CDN URL prefix for site assets, e.g. 'https://somecdn.com/mysite'; links will be rewritten as 'https://somecdn.com/mysite/static/style.css'", - format: String, - default: "", - env: "SITE_CDN", - arg: "siteCdn", - }, - contentCdn: { - doc: "CDN URL prefix for content, e.g. 'https://contentz.fast.io'; links will be rewritten as 'https://contentz.fast.io/allthebytes.png", - format: String, - default: "", - env: "CONTENT_CDN", - arg: "contentCdn", - }, - enableUserSettings: { - doc: "If true, the user can see the settings page and connect their device to their firefox account", - format: Boolean, - default: true, - env: "USER_SETTINGS", - arg: "user-settings", - }, - enableAnnotations: { - doc: "If true, then disable shot annotations", - format: Boolean, - default: false, - env: "ENABLE_ANNOTATIONS", - arg: "enable-annotations", - }, - enableCoverage: { - doc: "If true, then enable istanbul coverage middleware.", - format: Boolean, - default: false, - env: "ENABLE_COVERAGE", - arg: "enable-coverage", - }, - watchdog: { - enable: { - doc: "If true, submit shots to Watchdog.", - format: Boolean, - default: true, - env: "ENABLE_WATCHDOG", - arg: "enable-watchdog", - }, - id: { - doc: "Screenshots' user id at Watchdog", - format: String, - default: "", - env: "WATCHDOG_ID", - arg: "watchdog-id", - }, - key: { - doc: "Screenshots' key from Watchdog.", - format: String, - default: "", - env: "WATCHDOG_KEY", - arg: "watchdog-key", - }, - algorithm: { - doc: "The hash algorithm used in authenticating requests.", - format: String, - default: "sha256", - env: "WATCHDOG_AUTH_HASH_ALGORITHM", - arg: "watchdog-auth-hash-algorithm", - }, - submissionUrl: { - doc: "The URL where Watchdog is accepting submissions.", - format: String, - default: "", - env: "WATCHDOG_SUBMISSION_URL", - arg: "watchdog-submission-url", - }, - positiveEmail: { - doc: "An optional, semicolon delimited, list of email addresses to receive notifications on positive matches.", - format: String, - default: "", - env: "WATCHDOG_POSITIVE_EMAIL", - arg: "watchdog-positive-email", - }, - submissionInterval: { - doc: "Temporary(?) config to throttle the rate of submission to Watchdog. A positive integer. One out of this many shots will be submitted to Watchdog. One or less will result in all shots being submitted.", - format: "int", - default: 1, - env: "WATCHDOG_SUBMISSION_INTERVAL", - arg: "watchdog-submission-interval", - }, - excludeReleaseChannel: { - doc: "If true, shots from Firefox versions <= the current major version in the release channel will not be submitted to Watchdog.", - format: Boolean, - default: true, - env: "WATCHDOG_EXCLUDE_RELEASE_CHANNEL", - arg: "watchdog-exclude-release-channel", - }, - devOnlyMatchHostname: { - doc: "DO NOT SET THIS IN PROD. When set, this is the _only_ hostname for which shots are submitted to Watchdog.", - format: String, - default: "", - env: "WATCHDOG_DEV_MATCH_HOSTNAME", - arg: "watchdog-dev-match-hostname", - }, - // The logs only mode is to be removed in #4936. - logsOnly: { - doc: "This should be temporary. When true, Screenshots will only log Watchdog results.", - format: Boolean, - default: true, - env: "WATCHDOG_LOGS_ONLY", - arg: "watchdog-logs-only", - }, - }, -}); - -conf.validate({ allowed: "strict" }); - -module.exports = conf; diff --git a/server/src/db.js b/server/src/db.js deleted file mode 100644 index 400a503b88..0000000000 --- a/server/src/db.js +++ /dev/null @@ -1,194 +0,0 @@ -const config = require("./config").getProperties(); - -const pg = require("pg"); -const mozlog = require("./logging").mozlog("db"); -const logQueryLimit = config.db.logQueryLimit; - -const user = encodeURIComponent(config.db.user); -const dbname = encodeURIComponent(config.db.dbname || config.db.user); -const credentials = config.db.password ? `${user}:${encodeURIComponent(config.db.password)}` : user; -const constr = `postgres://${credentials}@${config.db.host}/${dbname}`; - -const pool = new pg.Pool(Object.assign({connectionString: constr}, config.db.pool)); - -pool.on("error", function(error) { - mozlog.error("db-error", { - msg: "Error in database:", - err: error, - }); -}); - -function getConnection() { - return new Promise(function(resolve, reject) { - pool.connect(function(err, client, done) { - if (err) { - reject(err); - } else { - resolve([client, done]); - } - }); - }); -} - -exports.queryWithClient = function(client, ...params) { - const timer = initTiming(); - return new Promise((resolve, reject) => { - // Babel only supports spreads as the final element of a list; i.e., - // `[...params, value]` is invalid. - params.push(function afterQuery(err, result) { - timer(); - if (err) { - reject(err); - } else { - resolve(result); - } - }); - client.query(...params); - }); -}; - -// FIXME: make these so they don't need to be exported -exports.getConnection = getConnection; -exports.constr = constr; - -exports.select = function(sql, args) { - const timer = initTiming(); - return getConnection().then(function([client, done]) { - return exports.queryWithClient(client, sql, args).then(({rows}) => { - done(); - timer(); - return rows; - }, (error) => { - done(); - throw error; - }); - }); -}; - -exports.insert = function(sql, args) { - const timer = initTiming(); - return getConnection().then(function([client, done]) { - return exports.queryWithClient(client, sql, args).then(() => { - done(); - timer(); - return true; - }).catch(err => { - done(); - if (err.code === "23505") { - // constraint error, duplicate key - return false; - } - throw err; - }); - }); -}; - -exports.update = function(sql, args) { - const timer = initTiming(); - return exports.exec(sql, args).then((result) => { - timer(); - return result.rowCount; - }); -}; - -exports.upsertWithClient = function(client, insertSql, updateSql, params) { - return exports.queryWithClient( - client, - `WITH upsert AS (${updateSql} RETURNING *) - ${insertSql} - WHERE NOT EXISTS (SELECT * FROM upsert)`, - params - ); -}; - -exports.transaction = function(func) { - return getConnection().then(function([client, done]) { - return exports.queryWithClient(client, `BEGIN`).then(() => func(client)).then(result => { - // Commit and return the original transaction result. - return exports.queryWithClient(client, `COMMIT`).then(() => { - done(); - return result; - }); - }).catch(txnErr => { - // Roll back the transaction and re-throw the original error. - return exports.queryWithClient(client, `ROLLBACK`).then(() => { - done(); - throw txnErr; - }, err => { - done(err); - throw err; - }); - }); - }); -}; - -// These happen to have the same logic: -exports.del = exports.update; - -exports.exec = function(sql, args) { - const timer = initTiming(); - return getConnection().then(function([client, done]) { - return exports.queryWithClient(client, sql, args).then(result => { - done(); - timer(); - return result; - }, err => { - done(); - throw err; - }); - }); -}; - -exports.markersForArgs = function(starting, numberOfArgs) { - const result = []; - for (let i = starting; i < starting + numberOfArgs; i++) { - result.push("$" + i); - } - return result.join(", "); -}; - -function doNothing() { -} - -function initTiming() { - if (!logQueryLimit) { - return doNothing; - } - const caller = getCallerPosition(2); - if (caller === "skip") { - // This happens when getCallerPosition detects we shouldn't time this function call - return doNothing; - } - const start = Date.now(); - return function() { - const time = Date.now() - start; - if (time >= logQueryLimit) { - mozlog.info("db-timing", {caller, time}); - } - }; -} - -const skipCaller = /\/server\/db.js:/; -const abortTiming = /\/server\/db.js:/; - -function getCallerPosition(stacklevel) { - // Obviously the caller knows its position, so we really - // want the caller of the caller of this function - const exc = new Error(); - const lines = exc.stack.split("\n"); - let index = stacklevel + 2; - while (lines[index] && skipCaller.test(lines[index])) { - if (abortTiming.test(lines[index])) { - // This is a case where this function is being called by another function - // inside this module; when that happens we know this call is already - // being logged, and don't need to log it - return "skip"; - } - index++; - } - const caller = lines[index]; - if (!caller) { - return "unknown"; - } - return caller.replace(/^ */, ""); -} diff --git a/server/src/dbschema.js b/server/src/dbschema.js deleted file mode 100644 index ae6c086163..0000000000 --- a/server/src/dbschema.js +++ /dev/null @@ -1,205 +0,0 @@ -const config = require("./config").getProperties(); -const db = require("./db"); -const Keygrip = require("keygrip"); -const pgpatcher = require("pg-patcher"); -const path = require("path"); -const mozlog = require("./logging").mozlog("dbschema"); - -// When updating the database, please also run ./bin/dumpschema --record -// This updates schema.sql with the latest full database schema -const MAX_DB_LEVEL = exports.MAX_DB_LEVEL = 28; -// This is a list of all the Keygrip scopes we allow (and we make sure these exist): -const KEYGRIP_SCOPES = ["auth", "proxy-url", "download-url", "ga-user-nonce", "fxa-oauth"]; - -exports.forceDbVersion = function(version) { - mozlog.info("forcing-db-version", {db: db.constr, version}); - return db.getConnection().then(([conn, done]) => { - const dirname = path.join(__dirname, "db-patches"); - mozlog.info("loading-patches-from", {dirname}); - return new Promise((resolve, reject) => { - pgpatcher(conn, version, {dir: dirname}, function(err) { - if (err) { - mozlog.error("error-patching", { - msg: `Error patching database to level ${version}!`, - err, - }); - done(); - reject(err); - } else { - mozlog.info("db-level", {msg: `Database is now at level ${version}`}); - resolve(); - } - }); - }); - }); -}; - -/** Create all the tables */ -exports.createTables = function() { - mozlog.info("setting-up-tables-on", {db: db.constr}); - return db.getConnection().then(([conn, done]) => { - return getCurrentDbPatchLevel().then(currentDbPatchLevel => { - if (currentDbPatchLevel >= MAX_DB_LEVEL - && (process.env.NODE_ENV === "production" || config.db.disableDownPatches)) { - mozlog.info("skip-db-down-patches", - { msg: `Database patch level of ${currentDbPatchLevel} is greater than or equal to the hard coded level of ${MAX_DB_LEVEL}.` }); - return Promise.resolve(); - } - - const dirname = path.join(__dirname, "db-patches"); - mozlog.info("loading-patches-from", {dirname}); - return new Promise((resolve, reject) => { - pgpatcher(conn, MAX_DB_LEVEL, {dir: dirname}, function(err) { - if (err) { - mozlog.error("error-patching", { - msg: `Error patching database to level ${MAX_DB_LEVEL}!`, - err, - }); - done(); - reject(err); - } else { - mozlog.info("db-level", {msg: `Database is now at level ${MAX_DB_LEVEL}`}); - resolve(); - } - }); - }); - }); - }).then(() => { - const newId = "tmp" + Date.now(); - return db.insert( - `INSERT INTO data (id, deviceid, value, url) - VALUES ($1, NULL, $2, $3)`, - [newId, "test value", ""] - ).then((inserted) => { - if (!inserted) { - throw new Error("Could not insert"); - } - return db.del( - `DELETE FROM data - WHERE id = $1`, - [newId] - ).then((count) => { - if (count !== 1) { - throw new Error("Should have deleted one row"); - } - }); - }); - }).catch((err) => { - if (err.code === "ECONNREFUSED") { - mozlog.warn("connection-refused", {msg: `Could not connect to database on ${db.constr}`}); - } - mozlog.warn("error-creating-tables", { - msg: "Got error creating and testing tables:", - err, - }); - }); -}; - -let keysByScope; -let textKeysByScope; - -exports.getKeygrip = function(scope) { - if (!scope || !KEYGRIP_SCOPES.includes(scope)) { - throw new Error("You must give a valid scope"); - } - return keysByScope[scope]; -}; - -exports.getTextKeys = function(scope) { - if (!scope || !KEYGRIP_SCOPES.includes(scope)) { - throw new Error("You must give a valid scope"); - } - return textKeysByScope[scope]; -}; - -/** Loads the random signing key from the database, or generates a new key - if none are found */ -async function loadKeys() { - const rows = await db.select( - `SELECT key, scope FROM signing_keys ORDER BY CREATED`, - [] - ); - const textKeysByScope = {}; - for (let i = 0; i < rows.length; i++) { - const scope = rows[i].scope; - if (scope === "legacy") { - continue; - } - let textKeys = textKeysByScope[scope]; - if (!textKeys) { - textKeys = textKeysByScope[scope] = []; - } - textKeys.push(rows[i].key); - } - for (const scope of KEYGRIP_SCOPES) { - if (!textKeysByScope[scope]) { - const key = await makeKey(); - const ok = await db.insert( - `INSERT INTO signing_keys (created, key, scope) - VALUES (NOW(), $1, $2)`, - [key, scope] - ); - if (!ok) { - throw new Error("Could not insert key"); - } - textKeysByScope[scope] = [key]; - } - } - for (let i = 0; i < rows.length; i++) { - const scope = rows[i].scope; - if (scope === "legacy") { - for (const otherScope in textKeysByScope) { - textKeysByScope[otherScope].push(rows[i].key); - } - } - } - return textKeysByScope; -} - -exports.createKeygrip = async function() { - try { - const fetchedTextKeysByScope = await loadKeys(); - textKeysByScope = fetchedTextKeysByScope; - keysByScope = {}; - for (const scope in textKeysByScope) { - keysByScope[scope] = new Keygrip(textKeysByScope[scope]); - } - } catch (err) { - mozlog.warn("error-creating-signing-keys", { - msg: "Could not create signing keys:", - err, - }); - throw err; - } -}; - -/** Returns a promise that generates a new largish ASCII random key */ -function makeKey() { - return new Promise(function(resolve, reject) { - require("crypto").randomBytes(48, function(err, buf) { - if (err) { - reject(err); - return; - } - resolve(buf.toString("base64")); - }); - }); -} - -function getCurrentDbPatchLevel() { - return db.select(`SELECT value FROM property WHERE key = 'patch'`).then(rows => { - return parseInt(rows[0].value, 10); - }).catch(e => { - return 0; - }); -} -exports.getCurrentDbPatchLevel = getCurrentDbPatchLevel; - -exports.connectionOK = function() { - if (!keysByScope) { - return Promise.resolve(false); - } - return getCurrentDbPatchLevel().then(currentLevel => { - return currentLevel >= MAX_DB_LEVEL; - }); -}; diff --git a/server/src/delete-shot-button.js b/server/src/delete-shot-button.js deleted file mode 100644 index 4e24076289..0000000000 --- a/server/src/delete-shot-button.js +++ /dev/null @@ -1,111 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); - -exports.DeleteShotButton = class DeleteShotButton extends React.Component { - constructor(props) { - super(props); - this.elRef = React.createRef(); - this.trashButtonRef = React.createRef(); - this.state = {confirmationPanelOpen: false}; - this.maybeCloseDeleteConfirmation = this.maybeCloseDeleteConfirmation.bind(this); - } - - componentDidUpdate() { - if (this.state.confirmationPanelOpen) { - document.addEventListener("mousedown", this.maybeCloseDeleteConfirmation); - } else { - document.removeEventListener("mousedown", this.maybeCloseDeleteConfirmation); - } - } - - componentWillUnmount() { - document.removeEventListener("mousedown", this.maybeCloseDeleteConfirmation); - } - - onClickDelete(e) { - e.stopPropagation(); - e.preventDefault(); - this.props.clickDeleteHandler && this.props.clickDeleteHandler(); - this.setState({confirmationPanelOpen: true}); - } - - onConfirmDelete(e) { - e.stopPropagation(); - this.props.confirmDeleteHandler && this.props.confirmDeleteHandler(); - this.setState({confirmationPanelOpen: false}); - } - - onCancelDelete(e) { - e.stopPropagation(); - this.props.cancelDeleteHandler && this.props.cancelDeleteHandler(); - this.setState({confirmationPanelOpen: false}); - } - - maybeCloseDeleteConfirmation(e) { - if (this.elRef.current === e.target || this.elRef.current.contains(e.target)) { - return; - } - - this.onCancelDelete(e); - } - - render() { - let rightAlign = ""; - if (this.trashButtonRef.current) { - const boundingRect = this.trashButtonRef.current.getBoundingClientRect(); - if (document.dir === "rtl" && boundingRect.right < 320 || - document.dir === "ltr" && boundingRect.left + 320 > document.body.scrollWidth) { - rightAlign = "right-align"; - } - } - - let confirmationPanel = null, deletePanelOpenClass = null; - if (this.state.confirmationPanelOpen) { - confirmationPanel =
-
- -
Are you sure you want to delete this shot?
-
-
- - - - - - -
-
; - deletePanelOpenClass = "active"; - } - - let deleteButtonStyle = null; - if (this.props.isIcon) { - deleteButtonStyle = `button transparent icon-trash ${deletePanelOpenClass}`; - } else { - deleteButtonStyle = `button nav-button transparent ${deletePanelOpenClass}`; - } - - return ( -
- - - - { confirmationPanel } -
- ); - } -}; - -exports.DeleteShotButton.propTypes = { - clickDeleteHandler: PropTypes.func, - confirmDeleteHandler: PropTypes.func, - cancelDeleteHandler: PropTypes.func, - isIcon: PropTypes.bool, - staticLink: PropTypes.func, -}; diff --git a/server/src/errors.js b/server/src/errors.js deleted file mode 100644 index a4f1f452f8..0000000000 --- a/server/src/errors.js +++ /dev/null @@ -1,78 +0,0 @@ -exports.create = function create(status, errno, message, data) { - const err = message ? new Error(message) : new Error(); - const statusCode = +status; - if (!isFinite(statusCode)) { - throw new Error("Invalid error status code"); - } - err.isAppError = true; - err.output = { - statusCode, - payload: { - statusCode, - errno, - message: statusCode === 500 ? "Internal server error" : err.message, - }, - headers: {}, - }; - return err; -}; - -exports.missingParams = function missingParams() { - return exports.create(400, 201, "Missing request parameters"); -}; - -exports.badParams = function badParams() { - return exports.create(400, 202, "Invalid request parameters"); -}; - -exports.dupeLogin = function dupeLogin() { - return exports.create(409, 301, "Login in progress"); -}; - -exports.missingSession = function missingSession() { - return exports.create(403, 302, "Session required"); -}; - -exports.badToken = function badToken() { - return exports.create(403, 304, "Error fetching access token"); -}; - -exports.badProfile = function badProfile() { - return exports.create(500, 305, "Error fetching profile"); -}; - -exports.badState = function badState() { - return exports.create(403, 306, "Bad OAuth state"); -}; - -exports.badSession = function badSession() { - return exports.create(403, 307, "Invalid session"); -}; - -exports.unsupported = function unsupported() { - return exports.create(501, 401, "Operation not supported"); -}; - -exports.extTimeout = function extTimeout(cause) { - const err = exports.create(503, 1101, "Timed out waiting for extension"); - if (cause) { - err.output.payload.cause = cause; - } - return err; -}; - -exports.extAlreadySignedIn = function extAlreadySignedIn() { - return exports.create(409, 1102, "User already signed in"); -}; - -exports.extBadUpdate = function extBadUpdate(response) { - const err = exports.create(500, 1103, "Error updating device info"); - if (response) { - err.output.payload.response = response; - } - return err; -}; - -exports.extInternalError = function extInternalError() { - return exports.create(500, 1999, "Internal extension error"); -}; diff --git a/server/src/events.js b/server/src/events.js deleted file mode 100644 index 4f74ceca39..0000000000 --- a/server/src/events.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = { - signUp() { - const event = new CustomEvent("request-sign-up"); - document.dispatchEvent(event); - }, - - signIn() { - const event = new CustomEvent("request-sign-in"); - document.dispatchEvent(event); - }, - - requestProfile() { - const event = new CustomEvent("request-profile"); - document.dispatchEvent(event); - }, - - setProfileState(profile) { - const event = new CustomEvent("set-profile-state", { - detail: profile, - }); - document.dispatchEvent(event); - }, - - deleteEverything() { - const event = new CustomEvent("delete-everything"); - document.dispatchEvent(event); - }, -}; diff --git a/server/src/footer-view.js b/server/src/footer-view.js deleted file mode 100644 index 2be7789174..0000000000 --- a/server/src/footer-view.js +++ /dev/null @@ -1,44 +0,0 @@ -const React = require("react"); -const { Localized } = require("fluent-react/compat"); -const PropTypes = require("prop-types"); - -exports.Footer = class Footer extends React.Component { - constructor(props) { - super(props); - this.links = [ -
  • - Terms -
  • , -
  • - Privacy Notice -
  • , -
  • - FAQs -
  • , -
  • - Report IP Infringement -
  • , -
  • - Give Feedback -
  • , -
  • GitHub
  • , - ]; - this.updateLinks && this.updateLinks(); - } - - render() { - return ( - - ); - } -}; - -exports.Footer.propTypes = { - id: PropTypes.string, - isOwner: PropTypes.bool, -}; diff --git a/server/src/fxa-onboarding-dialog.js b/server/src/fxa-onboarding-dialog.js deleted file mode 100644 index 7ce3e271c2..0000000000 --- a/server/src/fxa-onboarding-dialog.js +++ /dev/null @@ -1,62 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const sendEvent = require("./browser-send-event.js"); - -exports.FxaOnboardingDialog = class FxaOnboardingDialog extends React.Component { - constructor(props) { - super(props); - } - - render() { - return
    -
    -
    - - - What’s new with Firefox Screenshots? - -
    -
    - -

    - Now, sign in to Screenshots with a Firefox Account and - do more: -

    -
    -
      - -
    • Access your library on all of your devices
    • -
      - -
    • Store your favorite shots forever
    • -
      -
    -
    -
    - - Dismiss - - - - -
    -
    ; - } - - onCloseDialog(event) { - this.props.hideDialog(); - sendEvent("onboarding-promo-closed"); - } - - onConfirm(event) { - this.props.hideDialog(); - sendEvent("fxa-signin-onboarding-promo"); - location.href = this.props.logInURI; - } -}; - -exports.FxaOnboardingDialog.propTypes = { - logInURI: PropTypes.string, - hideDialog: PropTypes.func, -}; diff --git a/server/src/ga-activation.js b/server/src/ga-activation.js deleted file mode 100644 index bd0740cdca..0000000000 --- a/server/src/ga-activation.js +++ /dev/null @@ -1,178 +0,0 @@ -/* Code to create the Google Analytics code for a Firefox Screenshots page. - Stubs out ga() if no gaId is configured - Disables analytics if Do-Not-Track is set - Hashes page names - */ - -const React = require("react"); // eslint-disable-line no-unused-vars - -const dntJs = ` -// Copied from https://github.com/mozilla/bedrock/blob/22079855caeb660724319f735de51e3a7472a50f/media/js/base/dnt-helper.js -function _dntEnabled(dnt, ua) { - - 'use strict'; - - // for old version of IE we need to use the msDoNotTrack property of navigator - // on newer versions, and newer platforms, this is doNotTrack but, on the window object - // Safari also exposes the property on the window object. - var dntStatus = dnt || navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack; - var ua = ua || navigator.userAgent; - - // List of Windows versions known to not implement DNT according to the standard. - var anomalousWinVersions = ['Windows NT 6.1', 'Windows NT 6.2', 'Windows NT 6.3']; - - var fxMatch = ua.match(/Firefox\\/(\\d{1,10})/); - var ieRegEx = /MSIE|Trident/i; - var isIE = ieRegEx.test(ua); - // Matches from Windows up to the first occurance of ; un-greedily - // http://www.regexr.com/3c2el - var platform = ua.match(/Windows.+?(?=;)/g); - - // With old versions of IE, DNT did not exist so we simply return false; - if (isIE && typeof Array.prototype.indexOf !== 'function') { - return false; - } else if (fxMatch && parseInt(fxMatch[1], 10) < 32) { - // Can't say for sure if it is 1 or 0, due to Fx bug 887703 - dntStatus = 'Unspecified'; - } else if (isIE && platform && anomalousWinVersions.indexOf(platform.toString()) !== -1) { - // default is on, which does not honor the specification - dntStatus = 'Unspecified'; - } else { - // sets dntStatus to Disabled or Enabled based on the value returned by the browser. - // If dntStatus is undefined, it will be set to Unspecified - dntStatus = { '0': 'Disabled', '1': 'Enabled' }[dntStatus] || 'Unspecified'; - } - - return dntStatus === 'Enabled' ? true : false; -} -`; - -const stubGaJs = ` -window.ga = function () { - console.info.apply(console, ["stubbed ga("].concat(Array.from(arguments)).concat([")"])); -}; - -window.sendEvent = function () { - console.info.apply(console, ["stubbed sendEvent("].concat(Array.from(arguments)).concat([")"])); -}; - -window.abTests = __ABTESTS__; -`; - -const gaJs = ` -(function () { - - ${dntJs} - - if (_dntEnabled()) { - ${stubGaJs} - return; - } - - var gaScript = document.createElement('script'); - gaScript.src = "//www.google-analytics.com/analytics.js"; - document.head.appendChild(gaScript); - - window.abTests = __ABTESTS__; - window.GoogleAnalyticsObject = "ga"; - window.ga = window.ga || function () { - (window.ga.q = window.ga.q || []).push(arguments); - }; - window.ga.l = 1 * new Date(); - var clientId = "__USER_ID__"; - var gaOptions = "auto"; - var gaLocation; - if (clientId) { - gaOptions = {clientId: clientId}; - } - if (location.hostname === "localhost") { - if (typeof gaOptions === "string") { - gaOptions = {}; - } - gaOptions.cookieDomain = "none"; - } - if (__HASH_LOCATION__) { - if (window.crypto) { - var bytes = []; - for (var i=0; i - - : null; - - const banner = !props.hasFxaOnboardingDialog ? - : null; - - return [ - banner, -
    - {logo} - {props.children} -
    , - ]; -}; - -exports.Header.propTypes = { - hasLogo: PropTypes.bool, - children: PropTypes.node, - isOwner: PropTypes.bool, - hasFxa: PropTypes.bool, - shouldGetFirefox: PropTypes.bool, - hasFxaOnboardingDialog: PropTypes.bool, -}; diff --git a/server/src/helpers.js b/server/src/helpers.js deleted file mode 100644 index 749c1d815e..0000000000 --- a/server/src/helpers.js +++ /dev/null @@ -1,13 +0,0 @@ -const crypto = require("crypto"); - -exports.randomBytes = function randomBytes(size) { - return new Promise((resolve, reject) => { - crypto.randomBytes(size, function afterRand(err, bytes) { - if (err) { - reject(err); - return; - } - resolve(bytes); - }); - }); -}; diff --git a/server/src/jobs.js b/server/src/jobs.js deleted file mode 100644 index 15b86ef127..0000000000 --- a/server/src/jobs.js +++ /dev/null @@ -1,40 +0,0 @@ -/** Any reoccuring jobs we have to do */ - -const config = require("./config").getProperties(); -const mozlog = require("./logging").mozlog("jobs"); -const ua = require("universal-analytics"); - -// Convert to milliseconds: -const checkDeletedInterval = config.checkDeletedInterval * 1000; - -exports.start = function() { - if (config.disableControllerTasks) { - mozlog.info("no-periodic-tasks", {msg: "Note: not performing periodic tasks in this server"}); - return; - } - - setInterval(function() { - require("./servershot").Shot.cleanDeletedShots() - .then((status) => { - if (status.shotsDeleted || status.imagesDeleted || status.imagesFailed) { - mozlog.info("cleaning-expired-shots", status); - if (status.shotsDeleted && config.gaId) { - const analytics = ua(config.gaId); - analytics.event({ - ec: "server", - ea: "clean-deleted-shot", - ev: status.shotsDeleted, - ni: true, - }).send(); - } - } - }) - .catch((e) => { - mozlog.error("error-cleaning-shots", { - msg: "" + e, - err: e, - }); - }); - }, checkDeletedInterval); - -}; diff --git a/server/src/l10n.js b/server/src/l10n.js deleted file mode 100644 index f6312e89dd..0000000000 --- a/server/src/l10n.js +++ /dev/null @@ -1,111 +0,0 @@ -const path = require("path"); -const globby = require("globby"); -require("fluent-intl-polyfill/compat"); -const { negotiateLanguages } = require("fluent-langneg/compat"); -const { FluentBundle } = require("fluent/compat"); -const mozlog = require("./logging").mozlog("l10n"); - -const rawStrings = {}; -const fluentBundles = {}; - -let initPromise; -exports.init = function(localeStringMap) { - if (initPromise) { - return initPromise; - } - - // this is mainly for passing in test data - if (localeStringMap) { - return useLocaleData(localeStringMap); - } - - const localesGlob = path.join(__dirname, "static", "locales", "*.js"); - - initPromise = globby(localesGlob).then(paths => { - if (!paths.length) { - const err = `No locales found at path glob ${localesGlob}`; - mozlog.error("l10n-locale-globbing-error", {err}); - return Promise.reject(err); - } - return Promise.all(paths.map(path => { - return new Promise((resolve, reject) => { - // path is of the form "static/locales/en-US.js". - // To get the locale, get the filename without the extension. - const locale = path.split("/").slice(-1).toString().split(".")[0]; - if (!locale) { - const err = `Unable to parse locale from path ${path}`; - mozlog.error("l10n-locale-parsing-error", {err}); - reject(err); - return; - } - rawStrings[locale] = require(`./static/locales/${locale}`).messages; - resolve(); - }); - })); - }); - return initPromise; -}; - -exports.getText = function(locales) { - const bundles = {}; - const availableLocales = exports.getUserLocales(locales); - - availableLocales.forEach((locale) => { - bundles[locale] = getFluentBundle(locale); - }); - - return function(l10nID, args) { - for (const locale of availableLocales) { - if (bundles[locale].hasMessage(l10nID)) { - const msg = bundles[locale].getMessage(l10nID); - return bundles[locale].format(msg, args); - } - } - return ""; - }; -}; - -exports.getUserLocales = function(requestedLocales) { - return negotiateLanguages( - requestedLocales, - Object.keys(rawStrings), - { defaultLocale: "en-US" } - ); -}; - -exports.getStrings = function(locales) { - const availableLocales = exports.getUserLocales(locales); - const strings = {}; - availableLocales.forEach((locale) => { - if (locale in rawStrings) { - strings[locale] = rawStrings[locale]; - } - }); - return strings; -}; - -exports.getIsRtl = function(locales) { - const availableLocales = exports.getUserLocales(locales); - if (availableLocales && availableLocales.length > 0) { - return /^(he|ar|fa|ur)$/.test(availableLocales[0]); - } - return false; -}; - -function useLocaleData(localeStringMap) { - Object.keys(localeStringMap).forEach(x => { - rawStrings[x] = localeStringMap[x]; - }); - initPromise = Promise.resolve(); - return initPromise; -} - -function getFluentBundle(locale) { - if (!fluentBundles[locale]) { - const bundle = new FluentBundle(locale); - bundle.addMessages(rawStrings[locale]); - fluentBundles[locale] = bundle; - } - - return fluentBundles[locale]; -} diff --git a/server/src/lib/shot-utils.js b/server/src/lib/shot-utils.js deleted file mode 100644 index 0fbcd38aa5..0000000000 --- a/server/src/lib/shot-utils.js +++ /dev/null @@ -1,42 +0,0 @@ -/** Shot specific utility methods shared across pages */ - -class ShotUtils { - recordError(err) { - console.warn("Error in shot utils:", err); - window.Raven.captureException(err); - throw err; - } - - /* Change shot favorite status by updating shot expire time */ - async changeShotExpiration(shot, backend, csrfToken, defaultExpirationMs, newExpiration) { - const url = backend + "/api/set-expiration"; - newExpiration = newExpiration || (shot.isFavorite ? defaultExpirationMs : 0); - - const data = { - "id": shot.id, - "expiration": newExpiration, - "_csrf": csrfToken, - }; - try { - const resp = await fetch(url, { - method: "POST", - credentials: "include", - body: JSON.stringify(data), - headers: { - "Content-Type": "application/json", - }, - }); - if (!resp.ok) { - throw new Error(`Error calling /api/set-expiration: ${resp.status} ${resp.statusText}`); - } - shot.expireTime = newExpiration ? Date.now() + newExpiration : null; - shot.isFavorite = !newExpiration; - } catch (err) { - this.recordError(err); - } - } -} - -if (typeof exports !== "undefined") { - exports.ShotUtils = ShotUtils; -} diff --git a/server/src/linker.js b/server/src/linker.js deleted file mode 100644 index bf80acdc61..0000000000 --- a/server/src/linker.js +++ /dev/null @@ -1,42 +0,0 @@ - -let gitRevision; - -exports.init = function() { - gitRevision = require("./build-time").gitrevision; - return Promise.resolve(gitRevision); -}; - -exports.setGitRevision = function(rev) { - gitRevision = rev; -}; - -exports.getGitRevision = function() { - return gitRevision; -}; - -exports.staticLink = function(req, resource) { - if (!resource.startsWith("/")) { - resource = "/" + resource; - } - if (resource.endsWith(".css")) { - resource = resource.replace(/\.css$/, `${req.isRtl ? ".rtl" : ".ltr"}.css`); - } - return `${req.cdn}${resource}?rev=${gitRevision}`; -}; - -exports.staticLink.simple = function(resource) { - if (!resource.startsWith("/")) { - resource = "/" + resource; - } - return resource; -}; - -exports.imageLink = function(urlBase, resource) { - if (!resource.startsWith("/")) { - resource = "/" + resource; - } - if (resource.startsWith("/images")) { - throw new Error("imageLink URL should not start with /images: " + resource); - } - return urlBase + "/images" + resource; -}; diff --git a/server/src/locale-messages.js b/server/src/locale-messages.js deleted file mode 100644 index 196af604ce..0000000000 --- a/server/src/locale-messages.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * This is written to work with the locale js files generated by - * bin/build-scripts/ftl-to-js.js. Those files place the content strings of ftl - * files into window.l10nMessages. - * - * It waits a _max_ of about five seconds for the js files to be retrieved. - */ - -const localePromises = {}; - -function getPromise(locale) { - if (!localePromises[locale]) { - localePromises[locale] = getPollingPromise(locale); - } - return localePromises[locale]; -} - -function getPollingPromise(locale) { - return new Promise((resolve, reject) => { - let wait = 5000; // maybe make configurable? - const checkForMessages = () => { - if (window && window.l10nMessages && window.l10nMessages[locale]) { - const messages = {}; - messages[locale] = window.l10nMessages[locale]; - resolve(messages); - return; - } - if (wait > 0) { - wait -= 100; - setTimeout(checkForMessages, 100); - return; - } - reject(locale); - }; - checkForMessages(); - }); -} - -function setLocaleMessages(locale, messages) { - if (!localePromises[locale]) { - const x = {}; - x[locale] = messages; - localePromises[locale] = Promise.resolve(x); - } -} - -if (typeof window !== "undefined" && !window.notifyL10nLoaded) { - window.notifyL10nLoaded = setLocaleMessages; -} - -exports.getLocaleMessages = function(locales) { - return Promise.all(locales.map(getPromise)); -}; diff --git a/server/src/logging.js b/server/src/logging.js deleted file mode 100644 index 2335c31846..0000000000 --- a/server/src/logging.js +++ /dev/null @@ -1,45 +0,0 @@ -const config = require("./config").getProperties(); - -exports.mozlog = require("mozlog")({ - app: "screenshots-server", - fmt: "pretty", - level: config.log.level, - debug: config.log.lint, -}); - -exports.installConsoleHandler = function() { - const console_mozlog = exports.mozlog("console"); - // We can't prevent any third party libraries from writing to the console, - // so monkey patch it so they play nice with mozlog. - function logFactory(level) { - const logger = console_mozlog[level].bind(console_mozlog); - return function() { - let msg = ""; - let stack = undefined; - for (let i = 0; i < arguments.length; i++) { - const arg = arguments[i]; - if (msg) { - msg += " "; - } - if (typeof arg === "string") { - msg += arg; - } else { - if (arg && arg.stack) { - if (stack) { - stack = stack + "\n\n" + arg.stack; - } else { - stack = arg.stack; - } - } - msg += JSON.stringify(arg); - } - } - logger(level, {msg, stack}); - }; - } - - console.debug = logFactory("debug"); - console.info = logFactory("info"); - console.warn = logFactory("warn"); - console.error = logFactory("error"); -}; diff --git a/server/src/middleware/csrf.js b/server/src/middleware/csrf.js deleted file mode 100644 index 1b836dbb6f..0000000000 --- a/server/src/middleware/csrf.js +++ /dev/null @@ -1,96 +0,0 @@ -const assert = require("assert"); -const csrf = require("csurf"); -const mozlog = require("../logging").mozlog("csrf-middleware"); -const { captureRavenException } = require("../ravenclient"); -const { simpleResponse } = require("../responses"); - -const config = require("../config").getProperties(); - -const useSecureCsrfCookie = (config.expectProtocol && /^https$/.test(config.expectProtocol)); - -const csrfMiddleware = csrf({ - cookie: {httpOnly: true, secure: useSecureCsrfCookie}, -}); - -const csrfExemptMiddleware = csrf({ - ignoreMethods: ["PATCH", "POST", "PUT"], - cookie: {httpOnly: true, secure: useSecureCsrfCookie}, -}); - - -function isAuthPath(path) { - return path === "/api/register" || path === "/api/login"; -} - -function isCsrfExemptPath(path) { - return isAuthPath(path) - || path.startsWith("/data") - || path.startsWith("/watchdog") - || path === "/event" - || path === "/timing" - || path === "/error" - || path === "/api/set-login-cookie"; -} - -function csrfHeadersValid(req) { - const origin = req.headers.origin; - const referer = req.headers.referer; - - if (isAuthPath(req.path)) { - // web ext background scripts don't send headers, or send a moz-extension origin - return (origin === undefined || origin.startsWith("moz-extension:")) && referer === undefined; - } - - return true; -} - -function csrfInvalidHeaderResponse(req, res) { - mozlog.warn("bad-csrf-headers", {ip: req.ip, url: req.url, origin: req.headers.origin, referer: req.headers.referer}); - res.status(403); - res.type("text"); - res.send("Invalid CSRF Headers"); -} - -const ignoreMethods = { - "GET": true, - "HEAD": true, - "OPTIONS": true, -}; - -exports.csrfProtection = function(req, res, next) { - // The cookies library doesn't detect duplicates; check manually - const rawCookies = req.get("cookie") || ""; - const pairs = rawCookies.split(";"); - const csrfTokens = pairs.filter(item => item.match(/_csrf=/)); - if (csrfTokens.length > 1) { - const exc = new Error("Duplicate CSRF cookies"); - exc.headerValue = rawCookies; - captureRavenException(exc, req); - simpleResponse(res, "Bad request", 400); - return; - } - req.cookies._csrf = req.cookies.get("_csrf"); // csurf expects a property - - - // check origin and referer headers - if (!(ignoreMethods[req.method.toUpperCase()] || csrfHeadersValid(req))) { - csrfInvalidHeaderResponse(req, res); - return; - } - - if (isCsrfExemptPath(req.path)) { - // just set csrf cookie and attach req.csrfToken - csrfExemptMiddleware(req, res, next); - return; - } - // also validate csrf token for unignored http methods - csrfMiddleware(req, res, next); -}; - -exports.csrfErrorResponse = function(err, req, res) { - assert(err.code === "EBADCSRFTOKEN", "Returning csrf response for non-csrf error code."); - mozlog.info("bad-csrf", {ip: req.ip, url: req.url}); - res.status(403); - res.type("text"); - res.send("Bad CSRF Token"); -}; diff --git a/server/src/middleware/l10n.js b/server/src/middleware/l10n.js deleted file mode 100644 index 31d70727ad..0000000000 --- a/server/src/middleware/l10n.js +++ /dev/null @@ -1,29 +0,0 @@ -require("../logging").installConsoleHandler(); -const mozlog = require("../logging").mozlog("l10n-middleware"); -const accepts = require("accepts"); -const l10n = require("../l10n"); - -// Get an ordered list of user-preferred locales from the Accept-Language header -exports.getLanguages = function(req) { - let languages = accepts(req).languages(); - // 'accepts' returns '*' if no Accept-Language header was passed. Use English - // as a default instead. #3231 - if (languages[0] === "*") { - languages = ["en-US"]; - } - return languages; -}; - -exports.l10n = function(req, res, next) { - l10n.init().then(() => { - const languages = exports.getLanguages(req); - req.getText = l10n.getText(languages); - req.userLocales = l10n.getUserLocales(languages); - req.messages = l10n.getStrings(languages); - req.isRtl = l10n.getIsRtl(languages); - next(); - }).catch(err => { - mozlog.error("l10n-middleware-error", {msg: "Error initializing l10n", description: err}); - process.exit(2); - }); -}; diff --git a/server/src/oembed-view.js b/server/src/oembed-view.js deleted file mode 100644 index bccc075d47..0000000000 --- a/server/src/oembed-view.js +++ /dev/null @@ -1,24 +0,0 @@ -const React = require("react"); -const ReactDOMServer = require("react-dom/server"); -const PropTypes = require("prop-types"); - -class OEmbed extends React.Component { - render() { - return ( -
    -

    {this.props.shot.title}

    -
    - ); - } -} - -const OEmbedFactory = React.createFactory(OEmbed); - -exports.renderString = function(args) { - const oembed = OEmbedFactory(args); - return ReactDOMServer.renderToStaticMarkup(oembed); -}; - -OEmbed.propTypes = { - shot: PropTypes.object, -}; diff --git a/server/src/pages/creating/controller.js b/server/src/pages/creating/controller.js deleted file mode 100644 index 51cba9894b..0000000000 --- a/server/src/pages/creating/controller.js +++ /dev/null @@ -1,16 +0,0 @@ -/* browser: true */ - -const page = require("./page").page; - -let model; - -exports.launch = function(m) { - model = m; - render(); -}; - -function render() { - page.render(model); -} - -window.controller = exports; diff --git a/server/src/pages/creating/model.js b/server/src/pages/creating/model.js deleted file mode 100644 index 2addef9c6e..0000000000 --- a/server/src/pages/creating/model.js +++ /dev/null @@ -1,11 +0,0 @@ -exports.createModel = function(req) { - const title = req.query.title ? req.getText("creatingPageTitle", {title: req.query.title}) : req.getText("creatingPageTitleDefault"); - const model = { - noAnalytics: true, - title, - docTitle: title, - docUrl: req.query.url, - getText: req.getText, - }; - return model; -}; diff --git a/server/src/pages/creating/page.js b/server/src/pages/creating/page.js deleted file mode 100644 index 7b3afe0756..0000000000 --- a/server/src/pages/creating/page.js +++ /dev/null @@ -1,6 +0,0 @@ -const { Page } = require("../../reactruntime"); - -exports.page = new Page({ - dir: __dirname, - viewModule: require("./view.js"), -}); diff --git a/server/src/pages/creating/server.js b/server/src/pages/creating/server.js deleted file mode 100644 index c163bd5b7e..0000000000 --- a/server/src/pages/creating/server.js +++ /dev/null @@ -1,11 +0,0 @@ -const express = require("express"); -const reactrender = require("../../reactrender"); - -const app = express(); - -exports.app = app; - -app.get("/:id/:domain", function(req, res) { - const page = require("./page").page; - reactrender.render(req, res, page); -}); diff --git a/server/src/pages/creating/view.js b/server/src/pages/creating/view.js deleted file mode 100644 index 2a2fc3c98f..0000000000 --- a/server/src/pages/creating/view.js +++ /dev/null @@ -1,42 +0,0 @@ -const reactruntime = require("../../reactruntime"); -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); - -class Head extends React.Component { - - render() { - return ( - - - - - ); - } - -} - -Head.propTypes = { - staticLink: PropTypes.func, -}; - -class Body extends React.Component { - render() { - return ( - -
    -
    -
    -
    - -

    Saving your shot…

    -
    -
    - - ); - } - -} - -exports.HeadFactory = React.createFactory(Head); -exports.BodyFactory = React.createFactory(Body); diff --git a/server/src/pages/export/footer.js b/server/src/pages/export/footer.js deleted file mode 100644 index afa70eaf29..0000000000 --- a/server/src/pages/export/footer.js +++ /dev/null @@ -1,11 +0,0 @@ -const React = require("react"); -const { Localized } = require("fluent-react/compat"); -const { Footer } = require("../../footer-view.js"); - -exports.MyShotsFooter = class MyShotsFooter extends Footer { - updateLinks() { - this.links.push(
  • - Remove All Data -
  • ); - } -}; diff --git a/server/src/pages/export/model.js b/server/src/pages/export/model.js deleted file mode 100644 index 4fb855b6ce..0000000000 --- a/server/src/pages/export/model.js +++ /dev/null @@ -1,32 +0,0 @@ -exports.createModel = function(req) { - // We don't localize this title to make the instructions more consistent, - // since the page title will be part of the saved filename/folder: - const title = "Export"; - const serverModel = { - title, - }; - serverModel.shotsPerPage = req.shotsPerPage; - serverModel.pageNumber = req.pageNumber; - serverModel.totalShots = req.totalShots; - serverModel.shots = req.shots; - serverModel.isRtl = req.isRtl; - let shots = req.shots; - if (shots && shots.length) { - shots = shots.map( - shot => ({ - id: shot.id, - json: shot.asRecallJson(), - expireTime: shot.expireTime, - isSynced: shot.isSynced, - })); - } - const jsonModel = Object.assign( - {}, - serverModel, - { - shots, - downloadUrls: serverModel.downloadUrls, - } - ); - return Promise.resolve({serverModel, jsonModel}); -}; diff --git a/server/src/pages/export/page.js b/server/src/pages/export/page.js deleted file mode 100644 index 780d92d0e3..0000000000 --- a/server/src/pages/export/page.js +++ /dev/null @@ -1,7 +0,0 @@ -const { Page } = require("../../reactruntime"); - -exports.page = new Page({ - dir: __dirname, - viewModule: require("./view.js"), - noBrowserJavascript: true, -}); diff --git a/server/src/pages/export/server.js b/server/src/pages/export/server.js deleted file mode 100644 index b66eb6d8a4..0000000000 --- a/server/src/pages/export/server.js +++ /dev/null @@ -1,36 +0,0 @@ -const express = require("express"); -const reactrender = require("../../reactrender"); -const { Shot } = require("../../servershot"); -const mozlog = require("../../logging").mozlog("shotindex"); - -const SHOTS_PER_PAGE = 100; - -const app = express(); - -exports.app = app; - -app.get("/", function(req, res) { - if (!(req.deviceId || req.accountId)) { - res.redirect("/"); - return; - } - const pageNumber = req.query.p || 1; - const getShotsPage = Shot.getShotsForDevice(req.backend, req.deviceId, req.accountId, null, pageNumber, SHOTS_PER_PAGE); - getShotsPage.then(_render) - .catch((err) => { - res.type("txt").status(500).send(req.getText("shotIndexPageErrorRendering", {error: err})); - mozlog.error("error-rendering", {msg: "Error rendering page", error: err, stack: err.stack}); - }); - - function _render(shotsPage) { - if (shotsPage) { - ["shots", "totalShots", "pageNumber", "shotsPerPage"].forEach(x => { - if (shotsPage[x] !== undefined) { - req[x] = shotsPage[x]; - } - }); - } - const page = require("./page").page; - reactrender.render(req, res, page); - } -}); diff --git a/server/src/pages/export/view.js b/server/src/pages/export/view.js deleted file mode 100644 index ce874e1a92..0000000000 --- a/server/src/pages/export/view.js +++ /dev/null @@ -1,262 +0,0 @@ -/* globals controller */ -const reactruntime = require("../../reactruntime"); -const { MyShotsFooter } = require("./footer"); -const React = require("react"); -const PropTypes = require("prop-types"); -const Masonry = require("react-masonry-component"); -const { Localized } = require("fluent-react/compat"); -const { isValidClipImageUrl } = require("../../../shared/shot"); -const { getThumbnailDimensions } = require("../../../shared/thumbnailGenerator"); -const { Header } = require("../../header.js"); - -class Head extends React.Component { - - render() { - return ( - - - - ); - } - -} - -Head.propTypes = { - staticLink: PropTypes.func, -}; - -function urlWithPage(page) { - return `/export?p=${encodeURIComponent(page)}`; -} - -class Body extends React.Component { - - render() { - return ( - -
    -
    -
    - -

    - To export: use File > Save Page As... and you will find your screenshots in the folder Export_files -

    -
    - { this.renderShots() } -
    - { this.renderPageNavigation() } - { this.renderErrorMessages() } - -
    -
    - ); - } - - renderShots() { - const children = []; - if (this.props.shots && this.props.shots.length) { - for (const shot of this.props.shots) { - children.push(); - } - } - - if (children.length === 0) { - children.push(this.renderNoShots()); - } else { - const masonryOptions = { - originLeft: !this.props.isRtl, - }; - return ( -
    - - {children} - -
    - ); - } - return children; - } - - renderPageNavigation() { - if (!this.props.totalShots || parseInt(this.props.totalShots, 10) === 0) { - return null; - } - - const totalPages = Math.ceil(this.props.totalShots / this.props.shotsPerPage) || 1; - const hasPrev = this.props.pageNumber > 1; - const prevPageNumber = this.props.pageNumber - 1; - const prevClasses = ["shots-page-nav"].concat(!hasPrev && "disabled").join(" "); - const hasNext = this.props.pageNumber < totalPages; - const nextPageNumber = this.props.pageNumber - 0 + 1; - const nextClasses = ["shots-page-nav"].concat(!hasNext && "disabled").join(" "); - const hidden = totalPages < 2; - let arrowheadPrev = "←"; - let arrowheadNext = "→"; - if (this.props.isRtl) { - [arrowheadNext, arrowheadPrev] = [arrowheadPrev, arrowheadNext]; - } - - return ( - - ); - } - - renderErrorMessages() { - return ( -
    - - - - - - - - - -
    - ); - } - - renderNoShots() { - return ( -
    - - no Shots found - - -

    No saved shots.

    -
    - -

    Go on, create some.

    -
    -
    - ); - } - -} - -Body.propTypes = { - abTests: PropTypes.object, - pageNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - shots: PropTypes.array, - shotsPerPage: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - staticLink: PropTypes.func, - totalShots: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - isRtl: PropTypes.bool, -}; - -class Card extends React.Component { - - render() { - const defaultImageUrl = this.props.staticLink("img/question-mark.svg"); - const shot = this.props.shot; - const clip = shot.clipNames().length ? shot.getClip(shot.clipNames()[0]) : null; - if (!clip || !clip.image || !clip.image.url) { - // Some corrupted shot, we'll have to ignore it - return null; - } - let imageUrl = clip.image.url; - - // fallback to the question mark if the imageUrl is invalid - if (!isValidClipImageUrl(imageUrl)) { - imageUrl = defaultImageUrl; - } - const filename = shot.filename.replace(/\s+/g, "_"); - const fullImgUrl = `${imageUrl}/${encodeURIComponent(filename)}`; - - return ( - - ); - } - - getClipType(dimensions) { - // "portrait": 210 x 280, image scaled on X - // "landscape": 210 x 140, image scaled on Y - // "square": 210 x 210, image scaled on X or Y - - const containerWidth = 210; - const landscapeHeight = 140; - const portraitHeight = 280; - const landscapeAspectRatio = containerWidth / landscapeHeight; - const portraitAspectRatio = containerWidth / portraitHeight; - - const thumbnailDimensions = getThumbnailDimensions(dimensions.x, dimensions.y); - const thumbnailWidth = thumbnailDimensions.width; - const thumbnailHeight = thumbnailDimensions.height; - - const thumbnailAspectRatio = thumbnailWidth / thumbnailHeight; - - if (thumbnailAspectRatio <= portraitAspectRatio) { - return "portrait"; - } - if (thumbnailAspectRatio >= landscapeAspectRatio) { - return "landscape"; - } - if (thumbnailHeight > thumbnailWidth) { - return "square-x"; - } - return "square-y"; - } - - displayTitle(title) { - // FIXME: this won't work for rtl languages. use CSS ellipsis instead? (#3116) - if (title.length > 140) { - return (title.substring(0, 140) + "..."); - } - return title; - } - -} - -Card.propTypes = { - abTests: PropTypes.object, - hasFxa: PropTypes.bool, - isExtInstalled: PropTypes.bool, - isOwner: PropTypes.bool, - shot: PropTypes.object, - staticLink: PropTypes.func, -}; - -exports.HeadFactory = React.createFactory(Head); -exports.BodyFactory = React.createFactory(Body); diff --git a/server/src/pages/homepage/controller.js b/server/src/pages/homepage/controller.js deleted file mode 100644 index 2193dd939e..0000000000 --- a/server/src/pages/homepage/controller.js +++ /dev/null @@ -1,64 +0,0 @@ -/* globals Mozilla */ -const page = require("./page").page; -const { PromotionStrategy } = require("../../promotion-strategy.js"); - -let model; - -exports.launch = function(m) { - model = m; - if (window.wantsauth) { - if (window.wantsauth.getAuthData()) { - updateModel(window.wantsauth.getAuthData()); - } else { - window.wantsauth.addAuthDataListener((data) => { - updateModel(data); - render(); - }); - } - } - model.hasFxaOnboardingDialog = new PromotionStrategy().shouldShowOnboardingDialog(); - render(); -}; - -function updateModel(authData) { - Object.assign(model, authData); - model.hasFxa = !!model.accountId; -} - -function render() { - page.render(model); -} - -document.addEventListener("addon-present", () => { - if (location.hash === "#hello") { - document.dispatchEvent(new CustomEvent("request-onboarding")); - } else if (location.hash === "#tour") { - try { - if (typeof Mozilla === "undefined") { - // The UITour-lib.js library hasn't loaded yet - let count = 10; - const interval = setInterval(() => { - if (typeof Mozilla === "undefined") { - count--; - if (count <= 0) { - clearTimeout(interval); - throw new Error("UITour-lib.js didn't load up after 1 second"); - } - return; - } - clearTimeout(interval); - Mozilla.UITour.showHighlight("screenshots"); - }, 100); - } else { - Mozilla.UITour.showHighlight("screenshots"); - } - } catch (e) { - console.warn("Attempted to start #tour on non-Firefox version or unsupported version"); - throw e; - } - } -}); - -document.dispatchEvent(new CustomEvent("request-addon-present")); - -window.controller = exports; diff --git a/server/src/pages/homepage/homepage-header.js b/server/src/pages/homepage/homepage-header.js deleted file mode 100644 index a2b81d939f..0000000000 --- a/server/src/pages/homepage/homepage-header.js +++ /dev/null @@ -1,54 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const { SignInButton } = require("../../signin-button.js"); -const sendEvent = require("../../browser-send-event.js"); -const { Header } = require("../../header.js"); - -exports.HomePageHeader = class HomePageHeader extends React.Component { - constructor(props) { - super(props); - } - - onClickMyShots() { - sendEvent("goto-myshots", "homepage", {useBeacon: true}); - } - - renderFxASignIn() { - return ( - - ); - } - - render() { - let myShots; - if (this.props.isOwner) { - myShots = - - - - ; - } - - const signin = this.renderFxASignIn(); - return ( -
    -
    - { myShots } - { signin } -
    -
    - ); - } -}; - -exports.HomePageHeader.propTypes = { - hasFxa: PropTypes.bool, - isOwner: PropTypes.bool, - staticLink: PropTypes.func, - hasFxaOnboardingDialog: PropTypes.bool, -}; diff --git a/server/src/pages/homepage/model.js b/server/src/pages/homepage/model.js deleted file mode 100644 index 292ec248d9..0000000000 --- a/server/src/pages/homepage/model.js +++ /dev/null @@ -1,23 +0,0 @@ -exports.createModel = function(req) { - const isMobile = exports.isMobile(req.headers["user-agent"]); - const firefoxVersion = exports.getFirefoxVersion(req.headers["user-agent"]); - const model = { - title: "Firefox Screenshots", - isFirefox: !!firefoxVersion && !isMobile, - }; - return model; -}; - -// Helper functions exported for unit testing - -exports.getFirefoxVersion = (userAgent) => { - // https://mdn.io/UserAgent/Firefox suggests filtering on "rv:" and "Gecko". - // Return null or the major part of the Firefox version (for 57+ check, #3444). - const results = /rv:.*Gecko.*Firefox\/([0-9]+)/.exec(userAgent); - return results && results[1]; -}; - -exports.isMobile = (userAgent) => { - // https://mdn.io/UserAgent/Firefox suggests filtering on "Mobi" and "Tablet". - return /Mobi|Tablet/.test(userAgent); -}; diff --git a/server/src/pages/homepage/page.js b/server/src/pages/homepage/page.js deleted file mode 100644 index 7b3afe0756..0000000000 --- a/server/src/pages/homepage/page.js +++ /dev/null @@ -1,6 +0,0 @@ -const { Page } = require("../../reactruntime"); - -exports.page = new Page({ - dir: __dirname, - viewModule: require("./view.js"), -}); diff --git a/server/src/pages/homepage/server.js b/server/src/pages/homepage/server.js deleted file mode 100644 index 50f8d8b8ac..0000000000 --- a/server/src/pages/homepage/server.js +++ /dev/null @@ -1,15 +0,0 @@ -const express = require("express"); -const reactrender = require("../../reactrender"); - -const app = express(); - -exports.app = app; - -app.get("/robots.txt", function(req, res) { - res.send(""); -}); - -app.get("/", function(req, res) { - const page = require("./page").page; - reactrender.render(req, res, page); -}); diff --git a/server/src/pages/homepage/view.js b/server/src/pages/homepage/view.js deleted file mode 100644 index fd907d91d6..0000000000 --- a/server/src/pages/homepage/view.js +++ /dev/null @@ -1,210 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const reactruntime = require("../../reactruntime"); -const sendEvent = require("../../browser-send-event.js"); -const { Footer } = require("../../footer-view.js"); -const { Localized } = require("fluent-react/compat"); -const { HomePageHeader } = require("./homepage-header"); - -class Head extends React.Component { - generateFullLink(link) { - return this.props.backend + link; - } - - render() { - return ( - - - - - - ); - } - -} - -Head.propTypes = { - staticLink: PropTypes.func, -}; - -class Body extends React.Component { - - render() { - if (this.props.complete) { - return this.renderComplete(); - } - return ( - -
    - - no Shots found - -
    - -

    This will permanently erase all of your screenshots.

    -
    -
    - - - - - - Cancel - -
    -
    -
    -
    - ); - } - - renderComplete() { - return ( - -
    - - no Shots found - -
    - -

    All of your screenshots have been erased!

    -
    - - Home - -
    -
    -
    - ); - } - - onClickDelete() { - sendEvent("leave-service", "leave-button", {useBeacon: true}); - } - - onClickCancel() { - sendEvent("cancel-leave", "cancel-link", {useBeacon: true}); - } - - onClickHome() { - sendEvent("home-after-leave", "home-link", {useBeacon: true}); - } - -} - -Body.propTypes = { - complete: PropTypes.bool, - csrfToken: PropTypes.string, - staticLink: PropTypes.func, -}; - - -exports.HeadFactory = React.createFactory(Head); -exports.BodyFactory = React.createFactory(Body); diff --git a/server/src/pages/metrics/model.js b/server/src/pages/metrics/model.js deleted file mode 100644 index 1addd60ff4..0000000000 --- a/server/src/pages/metrics/model.js +++ /dev/null @@ -1,147 +0,0 @@ -const db = require("../../db"); - -const queries = { - totals: { - title: "Totals", - description: "Various totals from the database", - sql: ` - SELECT - (SELECT COUNT(devices.id) FROM devices) AS total_devices, - (SELECT COUNT(data.id) FROM data WHERE NOT deleted AND expire_time < CURRENT_TIMESTAMP) AS active_shots, - (SELECT COUNT(data.id) FROM data WHERE NOT deleted AND expire_time IS NULL) AS forever_shots, - (SELECT COUNT(data.id) FROM data WHERE NOT deleted AND expire_time >= CURRENT_TIMESTAMP) AS expired_recoverable_shots, - (SELECT COUNT(data.id) FROM data WHERE deleted) AS expired_deleted_shots; - `, - columns: [ - {title: "Total devices registered", name: "total_devices"}, - {title: "Active shots", name: "active_shots"}, - {title: "Never expiring shots", name: "forever_shots"}, - {title: "Expired (recoverable)", name: "expired_recoverable_shots"}, - {title: "... (deleted)", name: "expired_deleted_shots"}, - ], - }, - - shotsCreatedByDay: { - title: "Shots By Day", - description: "Number of shots created each day (for the last 30 days)", - sql: ` - SELECT COUNT(data.id)::INTEGER AS number_of_shots, date_trunc('day', data.created) AS day - FROM data - WHERE data.created + INTERVAL '30 days' >= CURRENT_TIMESTAMP - GROUP BY day - ORDER BY day DESC; - `, - columns: [ - {title: "Number of shots", name: "number_of_shots"}, - {title: "Day", type: "date", name: "day"}, - ], - }, - - usersByDay: { - title: "Users By Day", - description: "Number of users who created at least one shot, by day (last 30 days)", - sql: ` - SELECT COUNT(DISTINCT data.deviceid)::INTEGER AS number_of_users, date_trunc('day', data.created) AS day - FROM data - WHERE data.created + INTERVAL '30 days' >= CURRENT_TIMESTAMP - GROUP BY day - ORDER BY day DESC; - `, - columns: [ - {title: "Number of users", name: "number_of_users"}, - {title: "Day", type: "date", name: "day"}, - ], - }, - - shotsByUserHistogram: { - title: "Number of Shots per User", - description: "The number of users who have about N total shots", - sql: ` - SELECT COUNT(counters.number_of_shots) AS count, counters.number_of_shots AS number_of_shots - FROM - (SELECT FLOOR(POWER(2, FLOOR(LOG(2, COUNT(data.id))))) AS number_of_shots - FROM data - WHERE NOT data.deleted AND data.expire_time < CURRENT_TIMESTAMP - GROUP BY data.deviceid) AS counters - GROUP BY counters.number_of_shots - ORDER BY counters.number_of_shots; - `, - columns: [ - {title: "Number of users", name: "count"}, - {title: "~Number of shots", name: "number_of_shots"}, - ], - }, - -}; - -function executeQuery(query) { - const start = Date.now(); - return db.select(query.sql).then((rows) => { - const result = Object.assign({rows: [], created: Date.now()}, query); - for (const row of rows) { - const l = []; - for (const meta of query.columns) { - let value = row[meta.name]; - if (value instanceof Date) { - value = value.getTime(); - } - l.push(value); - } - result.rows.push(l); - } - result.timeToExecute = Date.now() - start; - return result; - }); -} - -exports.storeQueries = function() { - const allQueries = {}; - const promises = []; - for (const name in queries) { - promises.push(executeQuery(queries[name]).then((result) => { - allQueries[name] = result; - })); - } - return Promise.all(promises).then(() => { - const body = JSON.stringify(allQueries); - return db.transaction((client) => { - return db.queryWithClient(client, ` - DELETE FROM metrics_cache - `).then(() => { - return db.queryWithClient(client, ` - INSERT INTO metrics_cache (data) VALUES ($1) - `, [body]); - }); - }); - }); -}; - -exports.checkLastStoreQueriesTime = function() { - return db.select( - `SELECT created FROM metrics_cache` - ).then((rows) => { - if (!rows.length) { - return null; - } - return rows[0].created; - }); -}; - -function getQueries() { - return db.select(` - SELECT data FROM metrics_cache ORDER BY created DESC LIMIT 1 - `).then((rows) => { - return rows[0].data; - }); -} - -exports.createModel = function(req) { - return getQueries().then((data) => { - data = JSON.parse(data); - const model = { - title: "Firefox Screenshots Metrics", - data, - }; - return {serverModel: model, jsonModel: model}; - }); -}; diff --git a/server/src/pages/metrics/page.js b/server/src/pages/metrics/page.js deleted file mode 100644 index 780d92d0e3..0000000000 --- a/server/src/pages/metrics/page.js +++ /dev/null @@ -1,7 +0,0 @@ -const { Page } = require("../../reactruntime"); - -exports.page = new Page({ - dir: __dirname, - viewModule: require("./view.js"), - noBrowserJavascript: true, -}); diff --git a/server/src/pages/metrics/server.js b/server/src/pages/metrics/server.js deleted file mode 100644 index 91234b73f8..0000000000 --- a/server/src/pages/metrics/server.js +++ /dev/null @@ -1,48 +0,0 @@ -const express = require("express"); -const reactrender = require("../../reactrender"); -const { checkLastStoreQueriesTime, storeQueries } = require("./model"); -const config = require("../../config").getProperties(); -const { captureRavenException } = require("../../ravenclient"); -const mozlog = require("../../logging").mozlog("metrics"); - -const app = exports.app = express(); - -app.get("/", function(req, res) { - if (req.originalUrl === "/metrics") { - // We want a trailing slash - res.redirect("/metrics/"); - return; - } - const page = require("./page").page; - reactrender.render(req, res, page); -}); - -function safeStoreQueries() { - checkLastStoreQueriesTime().then((time) => { - if ((!time) || Date.now() - time.getTime() > config.refreshMetricsTime * 1000) { - return storeQueries().then(() => { - mozlog.info("updated-metrics", {msg: "Updated metrics"}); - }); - } - return null; - }).catch((error) => { - mozlog.error("metrics-update-error", {msg: "Error running metrics queries", error}); - captureRavenException(error); - }); -} - -if (config.refreshMetricsTime && !config.disableControllerTasks) { - // Randomize each worker +-30 seconds interval - let interval = config.refreshMetricsTime * 1000 + Math.floor(Math.random() * 60000 - 30000); - if (interval < 10000) { - interval = 60000; - } - setInterval(safeStoreQueries, interval); -} else { - mozlog.info("no-periodic-metrics", {msg: "Not running periodic metrics updating"}); -} - -if (!config.disableControllerTasks) { - // Also run immediately on startup: - setTimeout(safeStoreQueries, 1000); -} diff --git a/server/src/pages/metrics/view.js b/server/src/pages/metrics/view.js deleted file mode 100644 index 7977ebf13a..0000000000 --- a/server/src/pages/metrics/view.js +++ /dev/null @@ -1,114 +0,0 @@ -const reactruntime = require("../../reactruntime"); -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); - -class Head extends React.Component { - - render() { - return ( - - - - ); - } - -} - -Head.propTypes = { - staticLink: PropTypes.func, -}; - -class Body extends React.Component { - render() { - let created = new Date(this.props.data.shotsCreatedByDay.created); - created = created.toLocaleString(); - return ( - - -

    Metrics

    -
    - -

    Generated at: {created}

    -
    - - - - - - - -
    - ); - } - -} - -Body.propTypes = { - data: PropTypes.object, -}; - -class GenericTable extends React.Component { - render() { - const time = this.props.data.timeToExecute; - return
    -

    {this.props.data.title}

    -

    {this.props.data.description} - - (database time: {time}ms) - -

    - - - {this.renderTableHeader()} - - - {this.renderTableRows()} - -
    -
    ; - } - - renderTableHeader() { - const headers = []; - for (const column of this.props.data.columns) { - headers.push({column.title}); - } - return - {headers} - ; - } - - renderTableRows() { - const rows = []; - let n = 0; - for (const row of this.props.data.rows) { - n++; - const columns = []; - for (let i = 0; i < row.length; i++) { - let value = row[i]; - const meta = this.props.data.columns[i]; - if (meta.type) { - if (meta.type === "date") { - value = (new Date(value)); - value = value.toLocaleString( - "en-US", {year: "numeric", month: "short", day: "numeric"}); - } else { - console.warn("Unknown type:", meta.type); - } - } - columns.push({value}); - } - rows.push({columns}); - } - return rows; - } - -} - -GenericTable.propTypes = { - data: PropTypes.object, -}; - -exports.HeadFactory = React.createFactory(Head); -exports.BodyFactory = React.createFactory(Body); diff --git a/server/src/pages/not-found/model.js b/server/src/pages/not-found/model.js deleted file mode 100644 index 9ececd7107..0000000000 --- a/server/src/pages/not-found/model.js +++ /dev/null @@ -1,5 +0,0 @@ -exports.createModel = function(req) { - return { - title: req.getText("notFoundPageTitle"), - }; -}; diff --git a/server/src/pages/not-found/page.js b/server/src/pages/not-found/page.js deleted file mode 100644 index be08193ec1..0000000000 --- a/server/src/pages/not-found/page.js +++ /dev/null @@ -1,8 +0,0 @@ -const { Page } = require("../../reactruntime"); -const viewModule = require("./view"); - -exports.page = new Page({ - dir: __dirname, - viewModule, - noBrowserJavascript: true, -}); diff --git a/server/src/pages/not-found/server.js b/server/src/pages/not-found/server.js deleted file mode 100644 index 4f2291d711..0000000000 --- a/server/src/pages/not-found/server.js +++ /dev/null @@ -1,7 +0,0 @@ -const reactrender = require("../../reactrender"); - -exports.notFound = function(req, res) { - const page = require("./page").page; - res.status(404); - reactrender.render(req, res, page); -}; diff --git a/server/src/pages/not-found/view.js b/server/src/pages/not-found/view.js deleted file mode 100644 index a2df4cea33..0000000000 --- a/server/src/pages/not-found/view.js +++ /dev/null @@ -1,59 +0,0 @@ -const reactruntime = require("../../reactruntime"); -const { Footer } = require("../../footer-view.js"); -const { Localized } = require("fluent-react/compat"); -const React = require("react"); -const PropTypes = require("prop-types"); -const { Header } = require("../../header.js"); - -class Head extends React.Component { - render() { - return ( - - - - ); - } -} - -Head.propTypes = { - staticLink: PropTypes.func, -}; - -class Body extends React.Component { - constructor(props) { - super(props); - this.state = {defaultSearch: props.defaultSearch}; - } - - render() { - return ( - -
    -
    -
    -
    - - no Shots found - - -

    Oops.

    -
    - -

    Page not found.

    -
    -
    -
    -
    -
    -
    - ); - } -} - -Body.propTypes = { - defaultSearch: PropTypes.string, - staticLink: PropTypes.func, -}; - -exports.HeadFactory = React.createFactory(Head); -exports.BodyFactory = React.createFactory(Body); diff --git a/server/src/pages/settings/controller.js b/server/src/pages/settings/controller.js deleted file mode 100644 index 8272f18453..0000000000 --- a/server/src/pages/settings/controller.js +++ /dev/null @@ -1,34 +0,0 @@ -/* browser: true */ - -const page = require("./page").page; - -let model; - -exports.launch = function(m) { - model = m; - render(); -}; - -exports.disconnectDevice = function() { - const url = model.backend + "/api/disconnect-device"; - const req = new XMLHttpRequest(); - req.open("POST", url); - req.setRequestHeader("content-type", "application/x-www-form-urlencoded"); - req.onload = function() { - if (req.status >= 300) { - // FIXME: a lame way to do an error message - window.alert("Error disconnecting: " + req.status + " " + req.statusText); - window.Raven.captureException(new Error(`Error disconnecting: ${req.status} ${req.statusText}`)); - } else { - // Redirect to my shots on disconnect - window.location = "/shots"; - } - }; - req.send(`_csrf=${encodeURIComponent(model.csrfToken)}`); -}; - -function render() { - page.render(model); -} - -window.controller = exports; diff --git a/server/src/pages/settings/model.js b/server/src/pages/settings/model.js deleted file mode 100644 index 858556cb95..0000000000 --- a/server/src/pages/settings/model.js +++ /dev/null @@ -1,25 +0,0 @@ -const db = require("../../db"); - -exports.createModel = function(req) { - const title = "Settings"; - const model = { - title, - docTitle: title, - }; - - return db.select(` - SELECT accounts.avatarurl, accounts.nickname, accounts.email FROM accounts - WHERE accounts.id = $1 - `, - [req.accountId] - ).then((rows) => { - if (rows.length) { - model.accountInfo = { - avatarUrl: rows[0].avatarurl, - nickname: rows[0].nickname, - email: rows[0].email, - }; - } - return model; - }); -}; diff --git a/server/src/pages/settings/page.js b/server/src/pages/settings/page.js deleted file mode 100644 index 7b3afe0756..0000000000 --- a/server/src/pages/settings/page.js +++ /dev/null @@ -1,6 +0,0 @@ -const { Page } = require("../../reactruntime"); - -exports.page = new Page({ - dir: __dirname, - viewModule: require("./view.js"), -}); diff --git a/server/src/pages/settings/server.js b/server/src/pages/settings/server.js deleted file mode 100644 index e2597c231c..0000000000 --- a/server/src/pages/settings/server.js +++ /dev/null @@ -1,20 +0,0 @@ -const express = require("express"); -const reactrender = require("../../reactrender"); - -const app = express(); - -exports.app = app; - -app.get("/", function(req, res) { - if (!req.accountId) { - res.redirect("/"); - return; - } - if (req.originalUrl === "/settings/") { - // We don't want a trailing / - res.redirect("/settings"); - return; - } - const page = require("./page").page; - reactrender.render(req, res, page); -}); diff --git a/server/src/pages/settings/view.js b/server/src/pages/settings/view.js deleted file mode 100644 index 9f49420259..0000000000 --- a/server/src/pages/settings/view.js +++ /dev/null @@ -1,131 +0,0 @@ -/* globals controller */ -const reactruntime = require("../../reactruntime"); -const sendEvent = require("../../browser-send-event.js"); -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); - -class Head extends React.Component { - - render() { - return ( - - - - - ); - } - -} - -Head.propTypes = { - staticLink: PropTypes.func, -}; - -class Body extends React.Component { - render() { - return ( - -
    -
    - - - -
    -
    - { this.renderAccountInfo() } -
    -
    -
    - ); - } - - renderAccountInfo() { - const defaultAvatar = this.props.staticLink("/static/img/default-profile.svg"); - const disconnectAlertMessage = - - ; - let info; - let subInfo; - if (this.props.accountInfo) { - info = ( -
    - -
    -

    {this.props.accountInfo.nickname || this.props.accountInfo.email}

    - { this.props.accountInfo.nickname ?

    {this.props.accountInfo.email}

    : null } - - - -
    -
    - ); - subInfo = ( - -

    If you sign out, you will need to sign in again to regain access to your screenshots.

    -
    - ); - } else { - info = ( -
    - -
    - -

    Guest Account

    -
    - - Sign In - -
    -
    - ); - subInfo = ( - -

    You can sign in to access your screenshots across devices.

    -
    - ); - } - return
    - -

    Firefox Screenshots Settings

    -
    -
    -
    -
    - -

    Firefox Account

    -
    - { info } - { subInfo} - { disconnectAlertMessage } -
    -
    -
    -
    ; - } - - onClickDisconnect() { - sendEvent("start-disconnect", "settings", { useBeacon: true }); - const message = document.getElementById("disconnectAlertMessage").textContent; - if (window.confirm(message)) { - sendEvent("confirm-disconnect", "settings-popup-confirm", { useBeacon: true }); - controller.disconnectDevice(); - } else { - sendEvent("cancel-disconnect", "settings-popup-confirm", { useBeacon: true }); - } - } - - onClickConnect() { - sendEvent("start-connect", "settings", { useBeacon: true }); - } -} - -Body.propTypes = { - accountInfo: PropTypes.object, - staticLink: PropTypes.func, -}; - -exports.HeadFactory = React.createFactory(Head); -exports.BodyFactory = React.createFactory(Body); diff --git a/server/src/pages/shot/color-picker.js b/server/src/pages/shot/color-picker.js deleted file mode 100644 index 53f8a2f9e6..0000000000 --- a/server/src/pages/shot/color-picker.js +++ /dev/null @@ -1,130 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const sendEvent = require("../../browser-send-event.js"); - -exports.ColorPicker = class ColorPicker extends React.Component { - constructor(props) { - super(props); - this.clickMaybeClose = this.clickMaybeClose.bind(this); - this.keyMaybeClose = this.keyMaybeClose.bind(this); - this.state = { - pickerActive: false, - color: props.color || "#000", - colorName: props.colorName || "black", - }; - this.elRef = React.createRef(); - } - - render() { - return
    - -
    - {this.state.pickerActive ? this.renderColorBoard() : null} -
    ; - } - - componentDidUpdate() { - if (this.state.pickerActive) { - document.addEventListener("mousedown", this.clickMaybeClose); - document.addEventListener("keyup", this.keyMaybeClose); - } else { - document.removeEventListener("mousedown", this.clickMaybeClose); - document.removeEventListener("keyup", this.keyMaybeClose); - } - } - - UNSAFE_componentWillReceiveProps() { - this.setState({pickerActive: false}); - } - - componentWillUnmount() { - document.removeEventListener("mousedown", this.clickMaybeClose); - document.removeEventListener("keyup", this.keyMaybeClose); - } - - clickMaybeClose(event) { - if (!this.isColorBoard(event.target)) { - this.setState({pickerActive: false}); - } - } - - keyMaybeClose(event) { - if ((event.key || event.code) === "Escape") { - this.setState({pickerActive: false}); - } - } - - isColorBoard(el) { - if (this.elRef.current - && (this.elRef.current === el || this.elRef.current.contains(el))) { - return true; - } - return false; - } - - renderColorBoard() { - return
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    ; - } - - onClickSwatch(e) { - const color = e.target.style.backgroundColor; - const colorName = e.target.dataset.colorName; - this.setState({color, colorName, pickerActive: false}); - this.props.setColorCallback && this.props.setColorCallback(color, colorName); - - const title = e.target.title.toLowerCase().replace(/\s/g, "-"); - sendEvent(`${title}-select`, "annotation-color-board"); - } - - onClickColorPicker() { - const pickerActive = !this.state.pickerActive; - this.setState({pickerActive}); - sendEvent("color-picker-select", "annotation-toolbar"); - } -}; - -exports.ColorPicker.propTypes = { - color: PropTypes.string, - colorName: PropTypes.string, - setColorCallback: PropTypes.func, -}; diff --git a/server/src/pages/shot/controller.js b/server/src/pages/shot/controller.js deleted file mode 100644 index 633f05dab6..0000000000 --- a/server/src/pages/shot/controller.js +++ /dev/null @@ -1,269 +0,0 @@ -/* jslint browser:true */ - -const sendEvent = require("../../browser-send-event.js"); -const page = require("./page").page; -const { AbstractShot } = require("../../../shared/shot"); -const { createThumbnailUrl } = require("../../../shared/thumbnailGenerator"); -const { shotGaFieldForValue } = require("../../ab-tests.js"); -const { PromotionStrategy } = require("../../promotion-strategy.js"); -const { ShotUtils } = require("../../lib/shot-utils.js"); - -// This represents the model we are rendering: -let model; - -function updateModel(authData) { - Object.assign(model, authData); - model.isExtInstalled = true; -} - -exports.launch = function(data) { - const firstSet = !model; - model = data; - if (window.wantsauth) { - if (window.wantsauth.getAuthData()) { - updateModel(window.wantsauth.getAuthData()); - } else { - window.wantsauth.addAuthDataListener((data) => { - updateModel(data); - render(); - }); - } - } - model.hasSavedShot = false; - model.shot = new AbstractShot(data.backend, data.id, data.shot); - model.shot.contentUrl = `//${model.contentOrigin}/content/${model.shot.id}`; - model.shot.urlIfDeleted = model.urlIfDeleted; - model.shot.deleted = model.deleted; - model.shot.isFavorite = !model.expireTime; - model.controller = exports; - if (model.shot.abTests) { - for (const testName in model.shot.abTests) { - const testValue = model.shot.abTests[testName]; - if (testValue) { - const shotFieldName = shotGaFieldForValue(testName, testValue); - if (shotFieldName && window.abTests) { - window.abTests[testName + "_shot"] = { - gaField: shotFieldName, - value: testValue, - }; - } - } - } - } - - const promoStrategy = new PromotionStrategy(); - - model.hasFxaOnboardingDialog = promoStrategy.shouldShowOnboardingDialog(model.isOwner, true); - model.highlightEditButton = - promoStrategy.shouldHighlightEditIcon(model.isOwner, model.enableAnnotations); - model.promoDialog = - promoStrategy.shouldShowEditToolPromotion(model.isOwner, model.enableAnnotations, model.hasFxaOnboardingDialog); - - if (firstSet) { - refreshHash(); - } - try { - render(); - } catch (e) { - window.Raven.captureException(e); - throw e; - } - // FIXME: copied from frame.js - const isExpired = model.expireTime !== null && Date.now() > model.expireTime; - if (model.isOwner) { - if (isExpired) { - sendEvent("view-expired", "owner"); - } else { - sendEvent("visit", "owner"); - if (Date.now() - model.shot.createdDate < 30000) { - // FIXME: hacky way to determine if this is the first visit: - sendEvent("visit", "owner-first"); - } - } - } else if (isExpired) { - sendEvent("view-expired", "non-owner"); - } else { - sendEvent("visit", "non-owner"); - } - - document.dispatchEvent(new CustomEvent("request-addon-present")); -}; - -exports.changeShotExpiration = async function(shot, expiration) { - try { - const wasExpired = model.expireTime !== null && model.expireTime < Date.now(); - const shotUtils = new ShotUtils(); - await shotUtils.changeShotExpiration(shot, model.backend, model.csrfToken, - model.defaultExpiration, expiration); - model.expireTime = shot.expireTime; - model.shot.expireTime = shot.expireTime; - if (wasExpired) { - window.location.reload(); - } - render(); - } catch (err) { - const errElement = document.getElementById("shotPageAlertErrorUpdatingExpirationTime"); - if (errElement) { - window.alert(errElement.textContent); - } - } -}; - -exports.deleteShot = function(shot) { - const url = model.backend + "/api/delete-shot"; - const req = new XMLHttpRequest(); - req.open("POST", url); - req.setRequestHeader("content-type", "application/x-www-form-urlencoded"); - req.onload = function() { - if (req.status >= 300) { - // FIXME: a lame way to do an error message - const errorMessage = document.getElementById("shotPageAlertErrorDeletingShot").textContent; - window.alert(errorMessage); - window.Raven.captureException(new Error(`Error calling /api/delete-shot: ${req.status} ${req.statusText}`)); - } else { - location.href = model.backend + "/shots"; - } - }; - req.send(`id=${encodeURIComponent(shot.id)}&_csrf=${encodeURIComponent(model.csrfToken)}`); -}; - -exports.saveEdit = function(shot, shotUrl, dimensions) { - const url = model.backend + "/api/save-edit"; - const payload = { - shotId: shot.id, - _csrf: model.csrfToken, - url: shotUrl, - x: dimensions.x, - y: dimensions.y, - }; - - const postWith = body => { - const req = new Request(url, { - method: "POST", - credentials: "include", - headers: new Headers({ - "content-type": "application/json", - }), - body, - }); - return fetch(req).then((resp) => { - if (!resp.ok) { - const errorMessage = "Error saving edited shot"; - window.alert(errorMessage); - window.Raven.captureException(new Error(`Error calling /api/save-edit: ${req.status} ${req.statusText}`)); - } else { - location.reload(); - } - }).catch((error) => { - const errorMessage = "Connection error"; - window.alert(errorMessage); - window.Raven.captureException(error); - throw error; - }); - }; - - const image = shot.getClip(shot.clipNames()[0]).image; - - image.url = shotUrl; - image.dimensions.x = dimensions.x; - image.dimensions.y = dimensions.y; - - createThumbnailUrl(shot).then(thumbnail => { - payload.thumbnail = thumbnail; - return postWith(JSON.stringify(payload)); - }).catch(() => { - return postWith(JSON.stringify(payload)); - }); -}; - -function refreshHash() { - if (location.hash === "#fullpage") { - const frameOffset = document.getElementById("frame").getBoundingClientRect().top + window.scrollY; - const toolbarHeight = document.getElementById("toolbar").clientHeight; - const frameTop = frameOffset - (toolbarHeight * 2); - window.scroll(0, frameTop); - return; - } - let clipId = null; - let match = (/clip=([^&]{1,255})/).exec(location.hash); - if (match) { - clipId = decodeURIComponent(match[1]); - } - let source = "change-clip"; // eslint-disable-line no-unused-vars - match = (/source=([^&]{1,255})/).exec(location.hash); - if (match) { - source = decodeURIComponent(match[1]); - } - if ((model.activeClipId || null) === clipId) { - // No change - return; - } - model.activeClipId = clipId; - sendShowElement(clipId); - exports.render(); -} - -function sendShowElement(clipId) { - const frame = document.getElementById("frame"); - if (!frame) { - return; - } - let postMessage; - if (clipId) { - const clip = model.shot.getClip(clipId); - if (!clip) { - throw new Error("Could not find clip with id " + clipId); - } - postMessage = { - type: "displayClip", - clip: clip.toJSON(), - }; - } else { - postMessage = { - type: "removeDisplayClip", - }; - } - - try { - window.sendToChild(postMessage); - } catch (e) { - console.error("Error sending postMessage:", e); - console.error("Message:", postMessage); - throw e; - } -} - -exports.setTitle = function(title) { - title = title || null; - const url = model.backend + "/api/set-title/" + model.shot.id; - const req = new XMLHttpRequest(); - req.onload = function() { - if (req.status >= 300) { - const errorMessage = document.getElementById("shotPageAlertErrorUpdatingTitle").textContent; - window.alert(errorMessage); - window.Raven.captureException(new Error(`Error calling /api/set-title: ${req.status} ${req.statusText}`)); - return; - } - model.shot.userTitle = title; - render(); - }; - req.open("POST", url); - req.setRequestHeader("content-type", "application/json"); - req.send(JSON.stringify({ title, _csrf: model.csrfToken })); -}; - -function render() { - page.render(model); -} - -document.addEventListener("addon-present", (e) => { - if (e.detail) { - const capabilities = JSON.parse(e.detail); - if (capabilities["copy-to-clipboard"]) { - model.canCopy = true; - render(); - } - } -}); - -window.controller = exports; diff --git a/server/src/pages/shot/crop-tool.js b/server/src/pages/shot/crop-tool.js deleted file mode 100644 index 8ad99a119b..0000000000 --- a/server/src/pages/shot/crop-tool.js +++ /dev/null @@ -1,361 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const sendEvent = require("../../browser-send-event.js"); -const { Selection } = require("../../../shared/selection"); - -const MIN_WIDTH = 10; -const MIN_HEIGHT = 10; -// This is how close (in pixels) you can get to the edge of the window and then -// it will scroll: -const scrollByEdge = 20; - -let isMousedown; -let mousedownPosition; -let mousedownSelection; -let dragHandleLocation; -const SelectionState = { NONE: 0, CREATING: 1, RESIZING: 2, MOVING: 3}; - -exports.CropTool = class CropTool extends React.Component { - constructor(props) { - super(props); - this.el = React.createRef(); - this.state = { - selectionState: SelectionState.NONE, - cropSelection: null, - }; - this.canvasCssWidth = props.canvasCssWidth; - this.canvasCssHeight = props.canvasCssHeight; - } - - componentDidMount() { - if (this.props.toolbarOverrideCallback) { - this.props.toolbarOverrideCallback(); - } - } - - componentWillUnmount() { - if (this.props.toolbarOverrideCallback) { - this.props.toolbarOverrideCallback(); - } - } - - render() { - const cropSelectionBox = this.renderCropSelection(); - - return
    - {cropSelectionBox} -
    ; - } - - renderCropSelection() { - if (!this.state.cropSelection) { - return null; - } - - const zeroPx = "0px"; - const selectionTopPx = `${this.state.cropSelection.top}px`; - const selectionLeftPx = `${this.state.cropSelection.left}px`; - const selectionRightPx = `${this.state.cropSelection.right}px`; - const selectionBottomPx = `${this.state.cropSelection.bottom}px`; - const selectionHeightPx = `${this.state.cropSelection.height}px`; - const selectionWidthPx = `${this.state.cropSelection.width}px`; - const remainingRightSideWidthPx = `${this.canvasCssWidth - this.state.cropSelection.right}px`; - const oneHundredPercent = "100%"; - - const bgTopStyles = { - top: zeroPx, - height: selectionTopPx, - left: zeroPx, - width: oneHundredPercent, - }; - const bgLeftStyles = { - top: selectionTopPx, - height: selectionHeightPx, - left: zeroPx, - width: selectionLeftPx, - }; - const bgRightStyles = { - top: selectionTopPx, - height: selectionHeightPx, - left: selectionRightPx, - width: remainingRightSideWidthPx, - }; - const bgBottomStyles = { - top: selectionBottomPx, - height: oneHundredPercent, - left: zeroPx, - width: oneHundredPercent, - }; - const selectedStyles = { - position: "absolute", - top: selectionTopPx, - left: selectionLeftPx, - height: selectionHeightPx, - width: selectionWidthPx, - }; - - let smallSelection = null; - if (this.state.cropSelection.width < 78 || this.state.cropSelection.height < 78) { - smallSelection = "small-selection"; - } - - return [ -
    , -
    , -
    , -
    , -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    , - ]; - } - - renderToolbar() { - return
    - - - - - - -
    ; - } - - reset() { - this.setState({ - selectionState: SelectionState.NONE, - cropSelection: null, - }); - } - - onClickConfirm(e) { - if (!this.state.cropSelection - || !this.state.cropSelection.width || !this.state.cropSelection.height - || (this.canvasCssWidth === this.state.cropSelection.width - && this.canvasCssHeight === this.state.cropSelection.height)) { - if (this.props.confirmCropHandler) { - this.props.confirmCropHandler(null, null); - } - - this.reset(); - return; - } - - const croppedImage = document.createElement("canvas"); - croppedImage.width = this.state.cropSelection.width * this.props.canvasPixelRatio; - croppedImage.height = this.state.cropSelection.height * this.props.canvasPixelRatio; - const croppedContext = croppedImage.getContext("2d"); - croppedContext.drawImage( - this.props.baseCanvas, - this.state.cropSelection.left * this.props.canvasPixelRatio, - this.state.cropSelection.top * this.props.canvasPixelRatio, - croppedImage.width, croppedImage.height, - 0, 0, croppedImage.width, croppedImage.height); - - if (this.props.confirmCropHandler) { - this.props.confirmCropHandler(this.state.cropSelection, croppedImage); - } - - sendEvent("confirm-crop", "crop-toolbar"); - this.reset(); - } - - onClickCancel(e) { - if (this.props.cancelCropHandler) { - this.props.cancelCropHandler(); - } - sendEvent("cancel-crop", "crop-toolbar"); - this.reset(); - } - - onMouseDown(e) { - if (e.button !== 0 || isMousedown) { - return; - } - - isMousedown = true; - mousedownPosition = this.captureMousePosition(e); - e.preventDefault(); - - if (!this.state.cropSelection) { - this.setState({selectionState: SelectionState.CREATING}); - return; - } - - const classes = e.target.classList; - - if (classes.contains("bghighlight")) { - this.setState({cropSelection: null}); - return; - } - - mousedownSelection = this.state.cropSelection.clone(); - - if (classes.contains("highlight")) { - this.setState({selectionState: SelectionState.MOVING}); - return; - } - - if (classes.contains("mover-target") - || classes.contains("mover")) { - this.setState({selectionState: SelectionState.RESIZING}); - const dragHandle = classes.contains("mover") ? e.target.parentNode : e.target; - const locationClass = dragHandle.classList[dragHandle.classList.length - 1]; - dragHandleLocation = locationClass.split("-")[1]; - } - } - -// TODO This also exist in drawing-tool.js and text-tool.js. Move it to a shared -// space. - captureMousePosition(e) { - const boundingRect = this.el.current.getBoundingClientRect(); - return { - x: e.clientX - boundingRect.left, - y: e.clientY - boundingRect.top, - }; - } - - getDraggedSelection(e) { - const currentMousePosition = this.captureMousePosition(e); - return floorSelection(new Selection( - clamp(mousedownPosition.x, 0, this.canvasCssWidth), - clamp(mousedownPosition.y, 0, this.canvasCssHeight), - clamp(currentMousePosition.x, 0, this.canvasCssWidth), - clamp(currentMousePosition.y, 0, this.canvasCssHeight) - )); - } - - onMouseUp(e) { - isMousedown = false; - mousedownPosition = null; - dragHandleLocation = null; - mousedownSelection = null; - this.setState({selectionState: SelectionState.NONE}); - } - - onMouseMove(e) { - if (!isMousedown) { - return false; - } - - if (this.state.selectionState === SelectionState.CREATING) { - const cropSelection = this.getDraggedSelection(e); - - if (cropSelection.width > MIN_WIDTH && cropSelection.height > MIN_HEIGHT) { - this.setState({cropSelection}); - } - return true; - } - - let updatedSelection; - const currentPosition = this.captureMousePosition(e); - const xDelta = currentPosition.x - mousedownPosition.x; - const yDelta = currentPosition.y - mousedownPosition.y; - - if (this.state.selectionState === SelectionState.RESIZING) { - updatedSelection = mousedownSelection.clone(); - switch (dragHandleLocation) { - case "topLeft": - updatedSelection.top = clamp(mousedownSelection.top + yDelta, 0, this.canvasCssHeight); - updatedSelection.left = clamp(mousedownSelection.left + xDelta, 0, this.canvasCssWidth); - break; - case "top": - updatedSelection.top = clamp(mousedownSelection.top + yDelta, 0, this.canvasCssHeight); - break; - case "topRight": - updatedSelection.right = clamp(mousedownSelection.right + xDelta, 0, this.canvasCssWidth); - updatedSelection.top = clamp(mousedownSelection.top + yDelta, 0, this.canvasCssHeight); - break; - case "left": - updatedSelection.left = clamp(mousedownSelection.left + xDelta, 0, this.canvasCssWidth); - break; - case "right": - updatedSelection.right = clamp(mousedownSelection.right + xDelta, 0, this.canvasCssWidth); - break; - case "bottomLeft": - updatedSelection.left = clamp(mousedownSelection.left + xDelta, 0, this.canvasCssWidth); - updatedSelection.bottom = clamp(mousedownSelection.bottom + yDelta, 0, this.canvasCssHeight); - break; - case "bottom": - updatedSelection.bottom = clamp(mousedownSelection.bottom + yDelta, 0, this.canvasCssHeight); - break; - case "bottomRight": - updatedSelection.right = clamp(mousedownSelection.right + xDelta, 0, this.canvasCssWidth); - updatedSelection.bottom = clamp(mousedownSelection.bottom + yDelta, 0, this.canvasCssHeight); - break; - } - } - - if (this.state.selectionState === SelectionState.MOVING) { - const maxLeft = this.canvasCssWidth - mousedownSelection.width; - const maxTop = this.canvasCssHeight - mousedownSelection.height; - const newLeft = clamp(mousedownSelection.left + xDelta, 0, maxLeft); - const newTop = clamp(mousedownSelection.top + yDelta, 0, maxTop); - - updatedSelection = new Selection( - newLeft, - newTop, - newLeft + this.state.cropSelection.width, - newTop + this.state.cropSelection.height - ); - } - - this.setState({cropSelection: floorSelection(updatedSelection)}); - this.scrollIfByEdge(e); - return true; - } - - scrollIfByEdge(e) { - const top = window.scrollY; - const bottom = top + window.innerHeight; - const left = window.scrollX; - const right = left + window.innerWidth; - if (e.pageY + scrollByEdge >= bottom && bottom < document.body.scrollHeight) { - window.scrollBy(0, scrollByEdge); - } else if (e.pageY - scrollByEdge <= top) { - window.scrollBy(0, -scrollByEdge); - } - if (e.pageX + scrollByEdge >= right && right < document.body.scrollWidth) { - window.scrollBy(scrollByEdge, 0); - } else if (e.pageX - scrollByEdge <= left) { - window.scrollBy(-scrollByEdge, 0); - } - } -}; - -exports.CropTool.propTypes = { - toolbarOverrideCallback: PropTypes.func, - confirmCropHandler: PropTypes.func, - cancelCropHandler: PropTypes.func, - baseCanvas: PropTypes.object, - canvasPixelRatio: PropTypes.number, - canvasCssWidth: PropTypes.number, - canvasCssHeight: PropTypes.number, -}; - -// TODO This also exist in text-tool.js. Move it to a shared space. -function clamp(val, min, max) { - return Math.min(Math.max(val, min), max); -} - -// Decimals make for blurry images. This is a simple function to ensure whole -// numbers in a selection. It mutates and returns. -function floorSelection(selection) { - selection.left = Math.floor(selection.left); - selection.top = Math.floor(selection.top); - selection.right = Math.floor(selection.right); - selection.bottom = Math.floor(selection.bottom); - return selection; -} diff --git a/server/src/pages/shot/drawing-tool.js b/server/src/pages/shot/drawing-tool.js deleted file mode 100644 index d283173288..0000000000 --- a/server/src/pages/shot/drawing-tool.js +++ /dev/null @@ -1,152 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Selection } = require("../../../shared/selection"); - -exports.DrawingTool = class DrawingTool extends React.Component { - constructor(props) { - super(props); - this.canvas = React.createRef(); - } - - render() { - return ; - } - - static getDerivedStateFromProps(nextProps, prevState) { - const newState = { - strokeStyle: nextProps.color, - lineWidth: nextProps.lineWidth, - baseCanvasWidth: nextProps.canvasCssWidth * nextProps.canvasPixelRatio, - baseCanvasHeight: nextProps.canvasCssHeight * nextProps.canvasPixelRatio, - canvasCssWidth: nextProps.canvasCssWidth, - canvasCssHeight: nextProps.canvasCssHeight, - }; - return newState; - } - - componentDidMount() { - this.drawingContext = this.canvas.current.getContext("2d"); - this.drawingContext.scale(this.props.canvasPixelRatio, this.props.canvasPixelRatio); - this.setDrawingProperties(); - } - - setDrawingProperties() { - console.warn("Please override setDrawingProperties in your component."); - } - - componentDidUpdate(oldProps, oldState) { - if (oldState.baseCanvasWidth !== this.state.baseCanvasWidth - || oldState.baseCanvasHeight !== this.state.baseCanvasHeight) { - this.drawingContext.scale(this.props.canvasPixelRatio, this.props.canvasPixelRatio); - } - this.setDrawingProperties(); - } - -// TODO This also exist in crop-tool.js and text-tool.js. Move it to a shared space. - captureMousePosition(e) { - const boundingRect = this.canvas.current.getBoundingClientRect(); - return { - x: e.clientX - boundingRect.left, - y: e.clientY - boundingRect.top, - }; - } - - onMouseDown(e) { - if (e.button !== 0 || this.isMousedown) { - return; - } - this.mousedownPosition = this.captureMousePosition(e); - this.isMousedown = true; - this.updateDrawnArea(this.mousedownPosition); - this.draw(this.mousedownPosition); - } - - onMouseMove(e) { - if (!this.isMousedown) { - return false; - } - e.preventDefault(); - const position = this.captureMousePosition(e); - this.draw(position); - this.updateDrawnArea(position); - return true; - } - - draw(position) { - console.warn("Please override draw() in your component."); - } - - updateDrawnArea(position) { - if (!this.drawnArea) { - this.drawnArea = new Selection(position.x, position.y, position.x, position.y); - return; - } - const newSelection = this.drawnArea.clone(); - newSelection.left = position.x; - newSelection.top = position.y; - this.drawnArea = this.drawnArea.union(newSelection); - } - - clearRect() { - this.drawingContext.clearRect( - Math.min(0, this.drawnArea.left - this.state.lineWidth), - Math.min(0, this.drawnArea.top - this.state.lineWidth), - Math.max(this.state.canvasCssWidth, this.drawnArea.width + this.state.lineWidth), - Math.max(this.state.canvasCssHeight, this.drawnArea.width + this.state.lineWidth)); - } - - onMouseUp(e) { - if (e.button !== 0 || !this.isMousedown) { - return; - } - - this.drawnArea.left = Math.ceil(Math.max(this.drawnArea.left - this.state.lineWidth, 0)); - this.drawnArea.top = Math.ceil(Math.max(this.drawnArea.top - this.state.lineWidth, 0)); - this.drawnArea.right = Math.ceil(Math.min( - this.drawnArea.right + this.state.lineWidth, - this.state.canvasCssWidth)); - this.drawnArea.bottom = Math.ceil(Math.min( - this.drawnArea.bottom + this.state.lineWidth, - this.state.canvasCssHeight)); - - this.finalize(); - - if (this.props.updateImageCallback) { - this.props.updateImageCallback( - this.drawnArea, - this.canvas.current, - this.globalCompositeOperation || "source-over"); - } - - this.sendMetrics(); - this.reset(); - this.isMousedown = false; - this.mousedownPosition = null; - this.drawnArea = null; - } - - finalize() { - // Optional step to finish up the drawing - } - - reset() { - console.warn("Please override reset() in your component."); - } -}; - -exports.DrawingTool.propTypes = { - baseCanvas: PropTypes.object, - canvasPixelRatio: PropTypes.number, - canvasCssWidth: PropTypes.number, - canvasCssHeight: PropTypes.number, - updateImageCallback: PropTypes.func, - color: PropTypes.string, - lineWidth: PropTypes.number, -}; diff --git a/server/src/pages/shot/editor-history.js b/server/src/pages/shot/editor-history.js deleted file mode 100644 index 13e0cf0380..0000000000 --- a/server/src/pages/shot/editor-history.js +++ /dev/null @@ -1,118 +0,0 @@ -const { Selection } = require("../../../shared/selection"); - -exports.EditorHistory = class { - constructor(canvasPixelRatio) { - this.beforeEdits = []; - this.afterEdits = []; - this.canvasPixelRatio = canvasPixelRatio; - } - - push(canvas, area, recordType) { - const record = new EditRecord( - canvas, - area, - this.canvasPixelRatio, - recordType - ); - this.beforeEdits.push(record); - this.afterEdits = []; - } - - pushDiff(canvas, area) { - this.push(canvas, area, RecordType.DIFF); - } - - pushFrame(canvas, area) { - this.push(canvas, area, RecordType.FRAME); - } - - canUndo() { - return !!this.beforeEdits.length; - } - - undo(canvasBeforeUndo) { - if (!this.canUndo()) { - return null; - } - - return this._replay(canvasBeforeUndo, this.beforeEdits, this.afterEdits); - } - - canRedo() { - return !!this.afterEdits.length; - } - - redo(canvasBeforeRedo) { - if (!this.canRedo()) { - return null; - } - - return this._replay(canvasBeforeRedo, this.afterEdits, this.beforeEdits); - } - - _replay(canvasBeforeChange, from, to) { - const fromRecord = from.pop(); - - let area = fromRecord.area; - if (fromRecord.recordType === RecordType.FRAME) { - area = new Selection( - 0, 0, - parseInt(canvasBeforeChange.style.width, 10), - parseInt(canvasBeforeChange.style.height, 10) - ); - } - - const toRecord = new EditRecord( - canvasBeforeChange, - area, - this.canvasPixelRatio, - fromRecord.recordType - ); - - to.push(toRecord); - - return fromRecord; - } -}; - -class EditRecord { - constructor(canvas, area, canvasPixelRatio, recordType) { - this.area = area; - this.recordType = recordType; - this.canvas = this.captureCanvas(canvas, area, canvasPixelRatio, recordType); - } - - captureCanvas(canvas, area, canvasPixelRatio, recordType) { - const copy = document.createElement("canvas"); - - if (recordType === RecordType.FRAME) { - copy.width = canvas.width; - copy.height = canvas.height; - const copyContext = copy.getContext("2d"); - copyContext.scale(canvasPixelRatio, canvasPixelRatio); - copyContext.drawImage( - canvas, - 0, 0, canvas.width, canvas.height, - 0, 0, area.width, area.height); - return copy; - } - - copy.width = area.width * canvasPixelRatio; - copy.height = area.height * canvasPixelRatio; - const copyContext = copy.getContext("2d"); - copyContext.scale(canvasPixelRatio, canvasPixelRatio); - copyContext.drawImage( - canvas, - area.left * canvasPixelRatio, - area.top * canvasPixelRatio, - area.width * canvasPixelRatio, - area.height * canvasPixelRatio, - 0, 0, area.width, area.height - ); - - return copy; - } -} - -const RecordType = { DIFF: 0, FRAME: 1 }; -exports.RecordType = RecordType; diff --git a/server/src/pages/shot/editor.js b/server/src/pages/shot/editor.js deleted file mode 100644 index 4627e699b0..0000000000 --- a/server/src/pages/shot/editor.js +++ /dev/null @@ -1,444 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const sendEvent = require("../../browser-send-event.js"); -const { PenTool } = require("./pen-tool"); -const { HighlighterTool } = require("./highlighter-tool"); -const { CropTool } = require("./crop-tool"); -const { TextTool } = require("./text-tool"); -const { ColorPicker } = require("./color-picker"); -const { EditorHistory, RecordType } = require("./editor-history"); -const { Selection } = require("../../../shared/selection"); - -exports.Editor = class Editor extends React.Component { - constructor(props) { - super(props); - this.state = { - canvasCssWidth: Math.floor(this.props.clip.image.dimensions.x), - canvasCssHeight: Math.floor(this.props.clip.image.dimensions.y), - tool: "", - color: "", - colorName: "", - lineWidth: "", - actionsDisabled: true, - canUndo: false, - canRedo: false, - }; - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseMove = this.onMouseMove.bind(this); - this.selectedTool = React.createRef(); - } - - calculateCanvasPixelRatio() { - this.originalImage = new Image(); - this.originalImage.crossOrigin = "Anonymous"; - this.originalImage.onload = () => { - let canvasPixelRatio = 1; - - if (this.props.clip.image.captureType !== "fullPage" - && this.props.clip.image.captureType !== "fullPageTruncated") { - canvasPixelRatio = this.originalImage.naturalWidth / Math.floor(this.props.clip.image.dimensions.x); - } - - this.setState({canvasPixelRatio}); - this.history = new EditorHistory(canvasPixelRatio); - }; - this.originalImage.src = this.props.clip.image.url; - } - - componentDidMount() { - this.calculateCanvasPixelRatio(); - document.addEventListener("mouseup", this.onMouseUp); - this.setState({ - tool: "pen", - color: "#000", - colorName: "black", - lineWidth: 5, - actionsDisabled: true, - }); - } - - componentDidUpdate(oldProps, oldState) { - if ((!oldState.canvasPixelRatio && this.state.canvasPixelRatio) || - (oldState.canvasCssWidth !== this.state.canvasCssWidth - || oldState.canvasCssHeight !== this.state.canvasCssHeight)) { - const imageContext = this.imageCanvas.getContext("2d"); - imageContext.scale(this.state.canvasPixelRatio, this.state.canvasPixelRatio); - } - if ((!oldState.canvasPixelRatio && this.state.canvasPixelRatio) || - oldState.resetCanvas !== this.state.resetCanvas) { - this.drawOriginalImage(); - } - } - - drawOriginalImage() { - this.imageContext = this.imageCanvas.getContext("2d"); - this.imageContext.drawImage( - this.originalImage, - 0, 0, this.state.canvasCssWidth, this.state.canvasCssHeight); - this.setState({isCanvasRendered: true, actionsDisabled: false}); - } - - render() { - if (!this.state.canvasPixelRatio) { - return null; - } - const toolContent = this.state.isCanvasRendered ? this.renderSelectedTool() : null; - const toolBar = this.state.isCanvasRendered ? this.renderToolBar() : null; - const display = this.loader || this.renderCanvas(toolContent); - return
    - { toolBar } - { display } -
    ; - } - - renderCanvas(toolContent) { - return
    -
    - { this.imageCanvas = image; }} - width={this.state.canvasCssWidth * this.state.canvasPixelRatio} - height={this.state.canvasCssHeight * this.state.canvasPixelRatio} - style={{ width: this.state.canvasCssWidth, height: this.state.canvasCssHeight }}> - {toolContent} -
    -
    ; - } - - renderSelectedTool() { - switch (this.state.tool) { - case "pen": - return ; - case "highlighter": - return ; - case "cropTool": - return ; - case "textTool": - return ; - default: - return null; - } - } - - overrideToolbar() { - this.setState({overrideToolbar: this.state.tool}); - } - - deriveButtonStates() { - this.setState({ - canUndo: this.history.canUndo(), - canRedo: this.history.canRedo(), - }); - } - - isToolActive(tool) { - return this.state.tool === tool; - } - - renderToolBar() { - if (this.selectedTool.current && this.selectedTool.current.renderToolbar) { - return this.selectedTool.current.renderToolbar(); - } - - const penState = this.isToolActive("pen") ? "active" : "inactive"; - const highlighterState = this.isToolActive("highlighter") ? "active" : "inactive"; - const undoButtonState = this.state.canUndo ? "active" : "inactive"; - const redoButtonState = this.state.canRedo ? "active" : "inactive"; - - return
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - - - - - - -
    -
    ; - } - - setColor(color, colorName) { - this.setState({color, colorName}); - } - - renderShotsLoading() { - return
    -
    -
    -
    -
    ; - } - - onClickCrop() { - this.previousTool = this.state.tool; - this.setState({tool: "cropTool"}); - sendEvent("crop-select", "annotation-toolbar"); - } - - onDrawingUpdate(affectedArea, incomingCanvas, compositeOp) { - if (!affectedArea || !incomingCanvas) { - return; - } - - this.history.pushDiff(this.imageCanvas, affectedArea); - - this.imageContext.globalCompositeOperation = (compositeOp || "source-over"); - this.imageContext.drawImage(incomingCanvas, - affectedArea.left * this.state.canvasPixelRatio, - affectedArea.top * this.state.canvasPixelRatio, - affectedArea.width * this.state.canvasPixelRatio, - affectedArea.height * this.state.canvasPixelRatio, - affectedArea.left, affectedArea.top, affectedArea.width, affectedArea.height); - - this.deriveButtonStates(); - } - - applyDiff(area, diffCanvas) { - this.imageContext.globalCompositeOperation = "source-over"; - this.imageContext.drawImage(diffCanvas, - 0, 0, diffCanvas.width, diffCanvas.height, - area.left, area.top, area.width, area.height); - } - - onCropUpdate(affectedArea, incomingCanvas) { - if (!affectedArea || !incomingCanvas) { - this.setState({tool: this.previousTool}); - return; - } - - this.history.pushFrame(this.imageCanvas, new Selection( - 0, 0, this.state.canvasCssWidth, this.state.canvasCssHeight - )); - this.applyFrame(affectedArea, incomingCanvas); - this.setState({tool: this.previousTool}); - this.deriveButtonStates(); - } - - applyFrame(area, frameCanvas) { - const img = new Image(); - img.crossOrigin = "Anonymous"; - img.onload = () => { - imageContext.drawImage(img, 0, 0, area.width, area.height); - }; - const imageContext = this.imageCanvas.getContext("2d"); - this.imageContext = imageContext; - img.src = frameCanvas.toDataURL("image/png"); - this.setState({canvasCssWidth: area.width, canvasCssHeight: area.height}); - } - - onClickCancelCrop() { - this.setState({tool: this.previousTool}); - } - - onUndo(e) { - if (!this.history.canUndo()) { - return; - } - e.target.blur(); - this.applyHistory(this.history.undo(this.imageCanvas)); - this.deriveButtonStates(); - sendEvent("undo", "annotation-toolbar"); - } - - onRedo(e) { - if (!this.history.canRedo()) { - return; - } - e.target.blur(); - this.applyHistory(this.history.redo(this.imageCanvas)); - this.deriveButtonStates(); - sendEvent("redo", "annotation-toolbar"); - } - - applyHistory(record) { - if (!record) { - return; - } - if (record.recordType === RecordType.DIFF) { - this.applyDiff(record.area, record.canvas); - } else { - this.applyFrame(record.area, record.canvas); - } - } - - onClickClear() { - this.setState({ - canvasCssWidth: Math.floor(this.props.clip.image.dimensions.x), - canvasCssHeight: Math.floor(this.props.clip.image.dimensions.y), - resetCanvas: !this.state.resetCanvas, - }); - this.history = new EditorHistory(this.state.canvasPixelRatio); - this.deriveButtonStates(); - this.imageContext.clearRect(0, 0, this.imageCanvas.width, this.imageCanvas.height); - sendEvent("clear-select", "annotation-toolbar"); - } - - onClickCancel() { - this.props.onCancelEdit(false); - sendEvent("cancel", "annotation-toolbar"); - } - - onClickSave() { - this.loader = this.renderShotsLoading(); - this.setState({actionsDisabled: true}); - let dataUrl = this.imageCanvas.toDataURL(); - - if (this.props.pngToJpegCutoff && dataUrl.length > this.props.pngToJpegCutoff) { - const jpegDataUrl = this.imageCanvas.toDataURL("image/jpeg"); - if (jpegDataUrl.length < dataUrl.length) { - dataUrl = jpegDataUrl; - } - } - - const dimensions = {x: this.state.canvasCssWidth, y: this.state.canvasCssHeight}; - this.props.onClickSave(dataUrl, dimensions); - sendEvent("save", "annotation-toolbar"); - } - - onClickHighlight() { - if (this.state.tool !== "highlighter") { - this.setState({tool: "highlighter", lineWidth: 20}); - sendEvent("highlighter-select", "annotation-toolbar"); - } - } - - onClickPen() { - if (this.state.tool !== "pen") { - this.setState({tool: "pen", lineWidth: 5}); - sendEvent("pen-select", "annotation-toolbar"); - } - } - - onClickText() { - this.previousTool = this.state.tool; - this.setState({tool: "textTool"}); - sendEvent("text-select", "annotation-toolbar"); - } - - onClickUpdateText(affectedArea, incomingCanvas) { - if (!affectedArea || !incomingCanvas) { - this.setState({tool: this.previousTool}); - return; - } - this.history.pushDiff(this.imageCanvas, affectedArea); - - this.imageContext.globalCompositeOperation = "source-over"; - this.imageContext.drawImage(incomingCanvas, - affectedArea.left * this.state.canvasPixelRatio, - affectedArea.top * this.state.canvasPixelRatio, - affectedArea.width * this.state.canvasPixelRatio, - affectedArea.height * this.state.canvasPixelRatio, - affectedArea.left, affectedArea.top, affectedArea.width, affectedArea.height); - this.setState({tool: this.previousTool}); - this.deriveButtonStates(); - } - - onClickCancelText() { - this.setState({tool: this.previousTool}); - } - - - onMouseUp(e) { - // This is here so that when the user releases the mouse button outside of - // the canvas area, the drawing will stop. - if (this.selectedTool.current - && this.selectedTool.current.onMouseUp) { - e.stopPropagation(); - this.selectedTool.current.onMouseUp(e); - } - } - - onMouseMove(e) { - // This is here because we don't want whatever the tool action is to stop - // completely as soon as the mouse cursor exits the canvas/tool area (it's - // rather jarring). - if (this.selectedTool.current - && this.selectedTool.current.onMouseMove - && this.selectedTool.current.onMouseMove(e)) { - e.stopPropagation(); - } - } - - componentWillUnmount() { - document.removeEventListener("mouseup", this.onMouseUp); - } - -}; - -exports.Editor.propTypes = { - clip: PropTypes.object, - onCancelEdit: PropTypes.func, - onClickSave: PropTypes.func, - pngToJpegCutoff: PropTypes.number, -}; diff --git a/server/src/pages/shot/footer.js b/server/src/pages/shot/footer.js deleted file mode 100644 index e4e6e65a66..0000000000 --- a/server/src/pages/shot/footer.js +++ /dev/null @@ -1,29 +0,0 @@ -const React = require("react"); -const { Localized } = require("fluent-react/compat"); -const { Footer } = require("../../footer-view.js"); -const sendEvent = require("../../browser-send-event.js"); - -exports.ShotFooter = class ShotFooter extends Footer { - updateLinks() { - if (this.props.isOwner) { - this.links.push(
  • - Remove All Data -
  • ); - } else { - const dmcaIdx = this.links.findIndex(link => link.key === "dmca"); - if (dmcaIdx !== -1) { - this.links.splice(dmcaIdx, 0, -
  • - Report Shot -
  • ); - } - } - } - - onReportShot() { - sendEvent("start-flag", "navbar", {useBeacon: true}); - } -}; diff --git a/server/src/pages/shot/highlighter-tool.js b/server/src/pages/shot/highlighter-tool.js deleted file mode 100644 index f95a9e8bc3..0000000000 --- a/server/src/pages/shot/highlighter-tool.js +++ /dev/null @@ -1,99 +0,0 @@ -const { DrawingTool } = require("./drawing-tool"); -const sendEvent = require("../../browser-send-event.js"); - -let previousPosition; -let points = []; - -exports.HighlighterTool = class HighlighterTool extends DrawingTool { - constructor(props) { - super(props); - this.state = { - strokeStyle: props.color || "#000", - lineWidth: props.lineWidth || 20, - classNames: "highlighter", - }; - } - - static getDerivedStateFromProps(nextProps, prevState) { - return Object.assign( - super.getDerivedStateFromProps(nextProps, prevState), - {classNames: getClassNamesByColor(nextProps.color)} - ); - } - - setDrawingProperties() { - this.drawingContext.strokeStyle = this.state.strokeStyle; - this.drawingContext.lineWidth = this.state.lineWidth; - this.drawingContext.lineCap = "square"; - this.drawingContext.lineJoin = "round"; - } - - draw(position) { - if (!previousPosition) { - previousPosition = position; - } - points.push(position); - - if (points.length < 3) { - this.drawingContext.beginPath(); - this.drawingContext.moveTo(previousPosition.x, previousPosition.y); - this.drawingContext.lineTo(position.x, position.y); - this.drawingContext.stroke(); - previousPosition = position; - return; - } - - this.drawingContext.moveTo(previousPosition.x, previousPosition.y); - this.drawingContext.lineTo(position.x, position.y); - this.clearRect(); - this.drawingContext.beginPath(); - this.drawingContext.moveTo(points[0].x, points[0].y); - let i; - for (i = 1; i < points.length - 2; i++) { - const endX = (points[i].x + points[i + 1].x) / 2; - const endY = (points[i].y + points[i + 1].y) / 2; - this.drawingContext.quadraticCurveTo(points[i].x, points[i].y, endX, endY); - } - this.drawingContext.quadraticCurveTo( - points[i].x, - points[i].y, - points[i + 1].x, - points[i + 1].y - ); - this.drawingContext.stroke(); - previousPosition = position; - } - - finalize() { - if (isWhite(this.state.strokeStyle)) { - this.globalCompositeOperation = "soft-light"; - } else { - this.globalCompositeOperation = "multiply"; - } - } - - sendMetrics() { - sendEvent("draw", "highlight"); - } - - reset() { - this.clearRect(); - previousPosition = null; - points = []; - } -}; - -function isWhite(color) { - if (color === "rgb(255, 255, 255)" - || color === "#FFF") { - return true; - } - return false; -} - -function getClassNamesByColor(color) { - if (isWhite(color)) { - return "highlighter white"; - } - return "highlighter"; -} diff --git a/server/src/pages/shot/model.js b/server/src/pages/shot/model.js deleted file mode 100644 index 3a6368f95d..0000000000 --- a/server/src/pages/shot/model.js +++ /dev/null @@ -1,89 +0,0 @@ -const { createDownloadUrl } = require("../../proxy-url"); -const { getGitRevision } = require("../../linker"); -const MobileDetect = require("mobile-detect"); - -exports.createModel = function(req) { - const buildTime = require("../../build-time").string; - const isMobile = !!(new MobileDetect(req.headers["user-agent"])).mobile(); - let downloadUrl = null; - const clip = req.shot.getClip(req.shot.clipNames()[0]); - if (clip) { - downloadUrl = createDownloadUrl(clip.image.url, req.shot.filename); - } - const title = req.getText("shotPageTitle", {originalTitle: req.shot.title}); - const enableAnnotations = req.config.enableAnnotations; - const copyImageErrorMessage = { - title: req.getText("copyImageErrorTitle"), - message: req.getText("copyImageErrorMessage"), - }; - const serverPayload = { - title, - staticLink: req.staticLink, - backend: req.backend, - shot: req.shot, - contentOrigin: req.config.contentOrigin, - contentProtocol: req.protocol, - id: req.shot.id, - productName: req.config.productName, - isExtInstalled: !!req.deviceId, - isOwner: req.shot.isOwner, - gaId: req.config.gaId, - deviceId: req.deviceId, - buildTime, - simple: false, - shotDomain: req.url, // FIXME: should be a property of the shot - expireTime: req.shot.expireTime === null ? null : req.shot.expireTime.getTime(), - retentionTime: req.config.expiredRetentionTime * 1000, - defaultExpiration: req.config.defaultExpiration * 1000, - sentryPublicDSN: req.config.sentryPublicDSN, - cspNonce: req.cspNonce, - hashAnalytics: true, - userAgent: req.headers["user-agent"], - blockType: req.shot.blockType, - downloadUrl, - isMobile, - enableAnnotations, - }; - const clientPayload = { - title, - gitRevision: getGitRevision(), - backend: req.backend, - shot: req.shot.toJSON(), - contentOrigin: req.config.contentOrigin, - contentProtocol: req.protocol, - id: req.shot.id, - productName: req.config.productName, - isExtInstalled: !!req.deviceId, - isOwner: req.shot.isOwner, - gaId: req.config.gaId, - deviceId: req.deviceId, - shotAccountId: req.shot.accountId, - shotDomain: req.url, - urlIfDeleted: req.shot.urlIfDeleted, - expireTime: req.shot.expireTime === null ? null : req.shot.expireTime.getTime(), - deleted: req.shot.deleted, - buildTime, - simple: false, - retentionTime: req.config.expiredRetentionTime * 1000, - defaultExpiration: req.config.defaultExpiration * 1000, - pngToJpegCutoff: req.config.pngToJpegCutoff, - hashAnalytics: true, - userAgent: req.headers["user-agent"], - blockType: req.shot.blockType, - downloadUrl, - isMobile, - enableAnnotations, - copyImageErrorMessage, - }; - if (serverPayload.expireTime !== null && Date.now() > serverPayload.expireTime) { - clientPayload.shot = { - url: req.shot.url, - docTitle: req.shot.title, - }; - serverPayload.shot = Object.assign({ - urlIfDeleted: req.shot.urlIfDeleted, - title: req.shot.title, - }, clientPayload.shot); - } - return Promise.resolve({serverModel: serverPayload, jsonModel: clientPayload}); -}; diff --git a/server/src/pages/shot/page.js b/server/src/pages/shot/page.js deleted file mode 100644 index 7b3afe0756..0000000000 --- a/server/src/pages/shot/page.js +++ /dev/null @@ -1,6 +0,0 @@ -const { Page } = require("../../reactruntime"); - -exports.page = new Page({ - dir: __dirname, - viewModule: require("./view.js"), -}); diff --git a/server/src/pages/shot/pen-tool.js b/server/src/pages/shot/pen-tool.js deleted file mode 100644 index 6a974dd005..0000000000 --- a/server/src/pages/shot/pen-tool.js +++ /dev/null @@ -1,42 +0,0 @@ -const { DrawingTool } = require("./drawing-tool"); -const sendEvent = require("../../browser-send-event.js"); - -let previousPosition; - -exports.PenTool = class PenTool extends DrawingTool { - constructor(props) { - super(props); - this.state = { - strokeStyle: props.color || "#000", - lineWidth: props.lineWidth || 5, - classNames: "pen", - }; - } - - setDrawingProperties() { - this.drawingContext.globalCompositeOperation = "source-over"; - this.drawingContext.strokeStyle = this.state.strokeStyle; - this.drawingContext.lineWidth = this.state.lineWidth; - this.drawingContext.lineCap = "round"; - } - - draw(position) { - if (!previousPosition) { - previousPosition = position; - } - this.drawingContext.beginPath(); - this.drawingContext.moveTo(previousPosition.x, previousPosition.y); - this.drawingContext.lineTo(position.x, position.y); - this.drawingContext.stroke(); - previousPosition = position; - } - - sendMetrics() { - sendEvent("draw", "pen"); - } - - reset() { - this.clearRect(); - previousPosition = null; - } -}; diff --git a/server/src/pages/shot/promo-dialog.js b/server/src/pages/shot/promo-dialog.js deleted file mode 100644 index 64775a2583..0000000000 --- a/server/src/pages/shot/promo-dialog.js +++ /dev/null @@ -1,40 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const sendEvent = require("../../browser-send-event.js"); - -exports.PromoDialog = class PromoDialog extends React.Component { - constructor(props) { - super(props); - } - - render() { - if (this.props.display) { - return
    - - - - -

    Take Note!

    -
    - -

    - Updated editing tools let you crop, highlight, and even add text to your shot. -

    -
    -

    Give them a try

    -
    ; - } - return null; - } - - closePanel(event) { - this.props.promoClose(); - sendEvent("promo-closed"); - } -}; - -exports.PromoDialog.propTypes = { - display: PropTypes.bool, - promoClose: PropTypes.func, -}; diff --git a/server/src/pages/shot/server.js b/server/src/pages/shot/server.js deleted file mode 100644 index f94a355f08..0000000000 --- a/server/src/pages/shot/server.js +++ /dev/null @@ -1,27 +0,0 @@ -const express = require("express"); -const { Shot } = require("../../servershot"); -const { notFound } = require("../../pages/not-found/server"); -const reactrender = require("../../reactrender"); -const mozlog = require("../../logging").mozlog("shot"); - -const app = express(); - -exports.app = app; - -app.get("/:id/:domain", function(req, res) { - const shotId = `${req.params.id}/${req.params.domain}`; - Shot.get(req.backend, shotId, req.deviceId, req.accountId).then((shot) => { - const noSuchShot = !shot; - const nonOwnerAndBlocked = shot && shot.blockType !== "none" && !shot.isOwner; - if (noSuchShot || nonOwnerAndBlocked || shot.deleted) { - mozlog.info("shot-404", {shotId, ip: req.ip}); - notFound(req, res); - return; - } - req.shot = shot; - const page = require("./page").page; - reactrender.render(req, res, page); - }).catch(function(err) { - require("../../responses").errorResponse(res, req.getText("shotIndexPageErrorRendering", {error: err}), err); - }); -}); diff --git a/server/src/pages/shot/shotpage-header.js b/server/src/pages/shot/shotpage-header.js deleted file mode 100644 index 0fb4054aad..0000000000 --- a/server/src/pages/shot/shotpage-header.js +++ /dev/null @@ -1,215 +0,0 @@ -/* globals controller */ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const sendEvent = require("../../browser-send-event.js"); -const { SignInButton } = require("../../signin-button.js"); -const { Header } = require("../../header.js"); -const { TimeDiff } = require("./time-diff"); - -exports.ShotPageHeader = class ShotPageHeader extends React.Component { - constructor(props) { - super(props); - } - - renderMyShotsText() { - // FIXME: this means that on someone else's shot they won't see a My Shots link: - if (!this.props.isOwner) { - return ( - - - - - Firefox - - - Screenshots - - - - - ); - } - return ( - - - - - - ); - } - - onClickMyShots() { - if (this.props.isOwner) { - sendEvent("goto-myshots", "navbar", {useBeacon: true}); - } else { - sendEvent("goto-homepage", "navbar", {useBeacon: true}); - } - } - - renderShotInfo() { - const shot = this.props.shot; - const linkTextShort = shot.urlDisplay; - const timeDiff = ; - let expirationSubtitle; - if (this.props.expireTime === null) { - expirationSubtitle = does not expire; - } else { - const expired = this.props.expireTime < Date.now(); - const expireTimeDiff = ; - if (expired) { - expirationSubtitle = expired {expireTimeDiff}; - } else { - expirationSubtitle = expires {expireTimeDiff}; - } - } - - return ( -
    -
    - -
    - { linkTextShort ? { linkTextShort } : null } - { linkTextShort ?  •  : null } - { timeDiff } -  •  - { expirationSubtitle } -
    -
    -
    - ); - } - - onClickOrigUrl(label) { - if (this.props.isOwner) { - sendEvent("view-original", `${label}-owner`, {useBeacon: true}); - } else { - sendEvent("view-original", `${label}-non-owner`, {useBeacon: true}); - } - // Note: we allow the default action to continue - } - - renderFxASignIn() { - if (this.props.isOwner) { - return ( - - ); - } - return null; - } - - renderShotActions() { - return ( - this.props.shotActions ? -
    {this.props.shotActions}
    : null - ); - } - - render() { - const myShotsText = this.renderMyShotsText(); - const signin = this.renderFxASignIn(); - const shotInfo = this.renderShotInfo(); - const shotActions = this.renderShotActions(); - - return ( -
    - { myShotsText } - { shotInfo } - { shotActions } - { this.props.children } - { signin } -
    - ); - } -}; - -exports.ShotPageHeader.propTypes = { - children: PropTypes.node, - isOwner: PropTypes.bool, - shot: PropTypes.object, - hasFxa: PropTypes.bool, - expireTime: PropTypes.number, - shouldGetFirefox: PropTypes.bool, - shotActions: PropTypes.array, - staticLink: PropTypes.func, - hasFxaOnboardingDialog: PropTypes.bool, -}; - -class EditableTitle extends React.Component { - - constructor(props) { - super(props); - this.state = {isEditing: false, isSaving: false, minWidth: 200}; - } - - UNSAFE_componentWillReceiveProps(nextProps) { - // When the save completes, this component just gets updated with the new title - if (this.state.isSaving && this.state.isSaving === nextProps.title) { - this.setState({isSaving: false}); - } - } - - render() { - if (this.state.isEditing) { - return this.renderEditing(); - } - let className = "shot-title"; - const handlers = {}; - if (this.props.isOwner) { - className += " editable"; - handlers.onClick = this.onClick.bind(this); - } - if (this.state.isSaving) { - className += " saving"; - } - return this.titleElement = titleElement} className={className} {...handlers}>{this.state.isSaving || this.props.title}; - } - - renderEditing() { - return
    - this.textInput = input} - className="shot-title-input" - style={{minWidth: this.state.minWidth}} - type="text" defaultValue={this.props.title} autoFocus={true} - onBlur={this.onExit.bind(this)} onKeyUp={this.onKeyUp.bind(this)} - onFocus={this.onFocus} /> -
    ; - } - - onClick() { - if (!this.state.isEditing) { - this.setState({minWidth: this.titleElement.offsetWidth }); - } - this.setState({isEditing: true}); - } - - onExit() { - const val = this.textInput.value; - - if (val.trim() === "") { - this.setState({isEditing: false, isSaving: false}); - } else { - controller.setTitle(val); - this.setState({isEditing: false, isSaving: val}); - } - } - - onFocus(event) { - event.target.select(); - } - - onKeyUp(event) { - if ((event.key || event.code) === "Escape") { - this.setState({isEditing: false}); - } - } - -} - -EditableTitle.propTypes = { - isOwner: PropTypes.bool, - title: PropTypes.string, -}; diff --git a/server/src/pages/shot/text-tool.js b/server/src/pages/shot/text-tool.js deleted file mode 100644 index a06bcd4949..0000000000 --- a/server/src/pages/shot/text-tool.js +++ /dev/null @@ -1,341 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const sendEvent = require("../../browser-send-event.js"); -const { Selection } = require("../../../shared/selection"); -const { ColorPicker } = require("./color-picker"); - -// Text input height is determined by text size and padding -// See frame.scss mixin type-box($size) -const TEXT_INPUT_PADDING = 4; - -// Padding used by draggable div -const DRAG_DIV_PADDING = 10; - -// Editor header height in pixel -const EDITOR_HEADER_HEIGHT = 100; - -const FONT_STYLE = "sans-serif"; -const FONT_WEIGHT = 900; -const INIT_FONT_SIZE = 36; - -// Text Input drag limit from the edge of the canvas -const TEXT_DRAG_EDGE_LIMIT = 5; - -let previousTextInputWidth; -let hasFirstInput; - -let dragMouseDown = false; -let prevDragMousePos = null; - -exports.TextTool = class TextTool extends React.Component { - constructor(props) { - super(props); - this.el = React.createRef(); - this.textInput = React.createRef(); - - this.canvasCssWidth = props.canvasCssWidth; - this.canvasCssHeight = props.canvasCssHeight; - - const VISIBLE_HEIGHT = this.canvasCssHeight > window.innerHeight ? window.innerHeight - EDITOR_HEADER_HEIGHT : - this.canvasCssHeight; - - const INIT_LEFT = Math.floor(this.canvasCssWidth / 2); - const INIT_TOP = window.scrollY + Math.floor((VISIBLE_HEIGHT / 2) - ((INIT_FONT_SIZE) / 2) - TEXT_INPUT_PADDING); - - this.state = { - left: INIT_LEFT, - top: INIT_TOP, - color: this.props.color, - colorName: this.props.colorName, - textSize: "large-text", - }; - } - - componentDidMount() { - // Set hidden div to placeholder text and has first input happened flag to false. hasFirstInput - // is used in adjustX to avoid setting hidden div textContent to empty textInput value - hasFirstInput = false; - this.textInput.current.nextSibling.textContent = this.textInput.current.placeholder; - this.textInput.current.focus(); - this.textInput.current.nextSibling.style.maxWidth = `${this.canvasCssWidth - 2 * TEXT_DRAG_EDGE_LIMIT}px`; - this.adjustWidth(); - const maxLeft = this.getInputMaxLeft(); - const newLeft = clamp(this.state.left - this.textInput.current.clientWidth / 2 + TEXT_DRAG_EDGE_LIMIT, TEXT_DRAG_EDGE_LIMIT, maxLeft); - this.setState({left: newLeft}); - - previousTextInputWidth = this.textInput.current.clientWidth; - if (this.props.toolbarOverrideCallback) { - this.props.toolbarOverrideCallback(); - } - } - - componentDidUpdate(oldProps, oldState) { - if (oldState.textSize !== this.state.textSize) { - this.props.toolbarOverrideCallback(); - this.adjustX(); - } - } - - componentWillUnmount() { - if (this.props.toolbarOverrideCallback) { - this.props.toolbarOverrideCallback(); - } - } - - render() { - const textToolBox = this.renderTextBox(); - return
    - {textToolBox} -
    ; - } - - renderTextBox() { - const dragDivTopPx = `${this.state.top - DRAG_DIV_PADDING}px`; - const dragDivLeftPx = `${this.state.left - DRAG_DIV_PADDING}px`; - const dragDivPadding = `${DRAG_DIV_PADDING}px`; - - const dragDivStyles = { - position: "absolute", - top: dragDivTopPx, - left: dragDivLeftPx, - padding: dragDivPadding, - cursor: "move", - }; - - // Styles used by hidden div that is used to compute width of input - // text for respective font-size - const hiddenDivStyles = { - position: "absolute", - zIndex: "-999", - visibility: "hidden", - }; - - return [ -
    - - - - -
    -
    , - ]; - } - - renderToolbar() { - return
    - - - - - - - - - - - -
    ; - } - - setColor(color, colorName) { - this.setState({color, colorName}); - - const txtInput = this.textInput.current; - if (!this.isElementInViewPort(txtInput)) { - txtInput.scrollIntoView({block: "center"}); - } - txtInput.focus(); - } - - onDragMouseDown(e) { - if (e.target === this.textInput.current) { - return; - } - dragMouseDown = true; - prevDragMousePos = this.captureMousePosition(e); - } - - onMouseMove(e) { - if (!dragMouseDown) { - return; - } - - const mousePos = this.captureMousePosition(e); - const xDelta = mousePos.x - prevDragMousePos.x; - const yDelta = mousePos.y - prevDragMousePos.y; - - const maxLeft = this.getInputMaxLeft(); - const maxTop = this.canvasCssHeight - this.textInput.current.clientHeight - TEXT_DRAG_EDGE_LIMIT; - - const newLeft = clamp(this.state.left + xDelta, TEXT_DRAG_EDGE_LIMIT, maxLeft); - const newTop = clamp(this.state.top + yDelta, TEXT_DRAG_EDGE_LIMIT, maxTop); - this.setState({ - left: newLeft, - top: newTop, - }); - - prevDragMousePos = mousePos; - } - - onMouseUp(e) { - dragMouseDown = false; - prevDragMousePos = null; - } - -// TODO This also exist in drawing-tool.js and crop-tool.js. Move it to a shared -// space. - captureMousePosition(e) { - const boundingRect = this.el.current.getBoundingClientRect(); - return { - x: e.clientX - boundingRect.left, - y: e.clientY - boundingRect.top, - }; - } - - onClickConfirm(e) { - // Exit if user doesn't enter any text - if (!this.textInput.current.value) { - if (this.props.cancelTextHandler) { - this.props.cancelTextHandler(); - } - sendEvent("cancel-text", "text-toolbar"); - return; - } - const styles = window.getComputedStyle(this.textInput.current); - const FONT_SIZE = parseInt(styles["font-size"], 10); - let line_height = styles["line-height"]; - - // Depending on the user agent computed styles - // line-height can have value as normal - if (line_height.toLowerCase() === "normal") { - line_height = 1.1 * FONT_SIZE; - } - - // Due to line-height differences of how fonts are rendered across platforms - // adjust text y position to one-third of difference of line-height and font-size - const ADJUST_VERTICAL_SHIFT = (parseFloat(line_height) - FONT_SIZE) / 3; - const x = this.state.left + parseFloat(styles["padding-left"]); - const y = this.state.top + TEXT_INPUT_PADDING + parseFloat(line_height) / 2 + ADJUST_VERTICAL_SHIFT; - - const textCanvas = document.createElement("canvas"); - textCanvas.width = this.props.baseCanvas.width; - textCanvas.height = this.props.baseCanvas.height; - const drawingContext = textCanvas.getContext("2d"); - - drawingContext.scale(this.props.canvasPixelRatio, this.props.canvasPixelRatio); - drawingContext.textBaseline = "middle"; - drawingContext.fillStyle = styles.backgroundColor; - drawingContext.fillRect(this.state.left, - this.state.top, - this.textInput.current.clientWidth, - this.textInput.current.clientHeight); - drawingContext.fillStyle = styles.color; - drawingContext.font = `${FONT_WEIGHT} ${FONT_SIZE}px ${FONT_STYLE}`; - drawingContext.fillText(this.textInput.current.value, x, y); - - const textSelection = new Selection(this.state.left, - this.state.top, - this.state.left + this.textInput.current.clientWidth, - this.state.top + this.textInput.current.clientHeight); - - if (this.props.confirmTextHandler) { - this.props.confirmTextHandler(textSelection, textCanvas); - } - sendEvent("confirm-text", "text-toolbar"); - } - - onClickCancel(e) { - if (this.props.cancelTextHandler) { - this.props.cancelTextHandler(); - } - sendEvent("cancel-text", "text-toolbar"); - } - - onChangeTextSize(event) { - const size = event.target.value; - const txtInput = this.textInput.current; - - this.setState({textSize: size}); - if (!this.isElementInViewPort(txtInput)) { - txtInput.scrollIntoView({block: "center"}); - } - txtInput.focus(); - } - - onInput() { - const txtInput = this.textInput.current; - - hasFirstInput = true; - this.adjustX(); - if (!this.isElementInViewPort(txtInput)) { - txtInput.scrollIntoView({block: "center"}); - } - } - - adjustWidth() { - const width = this.textInput.current.nextSibling.clientWidth; - this.textInput.current.style.width = `${width}px`; - } - - adjustX() { - const styles = window.getComputedStyle(this.textInput.current); - // Check for text input width not to exceed canvas width, if yes constraint - // text input value to hidden div text content to stop additional text in the input box - if ((this.textInput.current.value.length > this.textInput.current.nextSibling.textContent.length) && - (this.textInput.current.nextSibling.clientWidth >= - this.canvasCssWidth - (2 * parseFloat(styles.paddingLeft)))) { - this.textInput.current.value = this.textInput.current.nextSibling.textContent; - } else if (hasFirstInput) { - this.textInput.current.nextSibling.textContent = this.textInput.current.value; - } - - this.adjustWidth(); - const widthDiff = this.textInput.current.clientWidth - previousTextInputWidth; - const maxLeft = this.getInputMaxLeft(); - const newLeft = clamp(this.state.left - widthDiff / 2, TEXT_DRAG_EDGE_LIMIT, maxLeft); - this.setState({left: newLeft}); - previousTextInputWidth = this.textInput.current.clientWidth; - } - - isElementInViewPort(el) { - const rect = el.getBoundingClientRect(); - return ( - rect.top >= (EDITOR_HEADER_HEIGHT + rect.height) && - rect.left >= 0 && - rect.bottom <= window.innerHeight && - rect.right <= window.innerWidth - ); - } - - getInputMaxLeft() { - return this.canvasCssWidth - this.textInput.current.clientWidth - TEXT_DRAG_EDGE_LIMIT; - } -}; - -exports.TextTool.propTypes = { - baseCanvas: PropTypes.object, - color: PropTypes.string, - colorName: PropTypes.string, - toolbarOverrideCallback: PropTypes.func, - confirmTextHandler: PropTypes.func, - cancelTextHandler: PropTypes.func, - canvasPixelRatio: PropTypes.number, - canvasCssWidth: PropTypes.number, - canvasCssHeight: PropTypes.number, -}; - -// TODO This also exist in crop-tool.js. Move it to a shared space. -function clamp(val, min, max) { - return Math.min(Math.max(val, min), max); -} diff --git a/server/src/pages/shot/time-diff.js b/server/src/pages/shot/time-diff.js deleted file mode 100644 index 18502e81c9..0000000000 --- a/server/src/pages/shot/time-diff.js +++ /dev/null @@ -1,76 +0,0 @@ -const React = require("react"); -const { Localized } = require("fluent-react/compat"); -const PropTypes = require("prop-types"); - -exports.TimeDiff = class TimeDiff extends React.Component { - constructor(props) { - super(props); - this.state = {useLocalTime: false}; - } - - render() { - let timeDiff; - if (this.state.useLocalTime) { - timeDiff = this.makeDiffString(this.props.date); - } else { - timeDiff = this.dateString(this.props.date); - } - return ; - } - - componentDidMount() { - if (typeof window !== "undefined" && !this.state.useLocalTime) { - setTimeout(() => { - this.setState({useLocalTime: true}); - }); - } - } - - makeDiffString(d) { - let timeDiff; - let l10nID; - let seconds = (Date.now() - d) / 1000; - if (seconds > 0) { - if (seconds < 20) { - l10nID = "timeDiffJustNow"; - } else if (seconds > 60 && seconds < 60 * 60) { - l10nID = "timeDiffMinutesAgo"; - timeDiff = Math.floor(seconds / 60); - } else if (seconds > 60 * 60 && seconds < 60 * 60 * 24) { - l10nID = "timeDiffHoursAgo"; - timeDiff = Math.floor(seconds / (60 * 60)); - } else if (seconds > 60 * 60 * 24) { - l10nID = "timeDiffDaysAgo"; - seconds += 60 * 60 * 2; // 2 hours fudge time - timeDiff = Math.floor(seconds / (60 * 60 * 24)); - } - } else if (seconds > -20) { - l10nID = "timeDiffFutureSeconds"; - } else if (seconds > -60 * 60) { - l10nID = "timeDiffFutureMinutes"; - timeDiff = Math.floor(seconds / -60); - } else if (seconds > -60 * 60 * 24) { - l10nID = "timeDiffFutureHours"; - timeDiff = Math.floor(seconds / (-60 * 60)); - } else { - seconds -= 60 * 60 * 2; // 2 hours fudge time - l10nID = "timeDiffFutureDays"; - timeDiff = Math.floor(seconds / (-60 * 60 * 24)); - } - return {diff: timeDiff, l10nID}; - } - - dateString(d) { - if (!this.state.useLocalTime) { - return ""; - } - if (!(d instanceof Date)) { - d = new Date(d); - } - return d.toLocaleString(); - } -}; - -exports.TimeDiff.propTypes = { - date: PropTypes.number, -}; diff --git a/server/src/pages/shot/view.js b/server/src/pages/shot/view.js deleted file mode 100644 index c25c9a8697..0000000000 --- a/server/src/pages/shot/view.js +++ /dev/null @@ -1,601 +0,0 @@ -/* globals controller */ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const { ShotFooter } = require("./footer"); -const sendEvent = require("../../browser-send-event.js"); -const { PromoDialog } = require("./promo-dialog"); -const { DeleteShotButton } = require("../../delete-shot-button"); -const { TimeDiff } = require("./time-diff"); -const reactruntime = require("../../reactruntime"); -const { Editor } = require("./editor"); -const { isValidClipImageUrl } = require("../../../shared/shot"); -const { ShotPageHeader } = require("./shotpage-header"); - -class Clip extends React.Component { - constructor(props) { - super(props); - } - - componentDidMount() { - // TODO: how can we resize nicely if JS is disabled? maybe CSS? - const image = this.clipImage; - const onResize = () => { - const windowHeight = window.innerHeight; - let paddingTop = Math.floor((windowHeight - image.height - 35) / 2); - if (paddingTop < 66) { - paddingTop = 66; - } - this.setState({paddingTop}); - }; - window.addEventListener("resize", onResize, true); - - onResize(); - // FIXME: need to remove event listener on unmount - } - - render() { - const clip = this.props.clip; - if (!clip.image) { - console.warn("Somehow there's a shot without an image"); - return null; - } - if (!isValidClipImageUrl(clip.image.url)) { - return null; - } - - const node = this.clipImage = clipImage} - src={clip.image.url} - alt={clip.image.text} />; - - const clipUrl = this.props.isMobile - ? this.props.downloadUrl - : clip.image.url; - - return
    this.clipContainer = clipContainer} className="clip-container"> - { this.copyTextContextMenu() } - - { node } - -
    ; - } - - onClickClip() { - if (this.props.isMobile) { - sendEvent("mobile-download", "content", {useBeacon: true}); - } else { - sendEvent("goto-clip", "content", {useBeacon: true}); - } - // Allow default action to continue - } - - copyTextContextMenu() { - if (this.props.clip.image.text) { - return ( - - - - - - ); - } - return null; - } - - copyImageText() { - sendEvent("copy-image-text", "context-menu"); - const text = this.props.clip.image.text; - const el = document.createElement("textarea"); - el.value = text; - document.body.appendChild(el); - el.select(); - document.execCommand("copy"); - document.body.removeChild(el); - } -} - -Clip.propTypes = { - clip: PropTypes.object, - isMobile: PropTypes.bool, - downloadUrl: PropTypes.string, -}; - -class Head extends React.Component { - render() { - const expired = this.props.expireTime !== null && Date.now() > this.props.expireTime; - if (expired) { - return ( - - - - - - ); - } - -} - -Head.propTypes = { - staticLink: PropTypes.func, -}; - -class Body extends React.Component { - constructor(props) { - super(props); - this.state = {defaultSearch: props.defaultSearch}; - } - - render() { - return ( - -
    - - { this.props.disableSearch ? null : this.renderSearchForm() } -
    - { this.renderShots() } -
    - { this.renderPageNavigation() } - { this.renderErrorMessages() } - -
    -
    - ); - } - - renderShots() { - if (this.props.shots === null) { - return this.renderShotsLoading(); - } - const children = []; - if (this.props.shots && this.props.shots.length) { - for (const shot of this.props.shots) { - children.push(); - } - } - - if (children.length === 0) { - if (!this.props.authenticated) { - children.push(this.renderNoDeviceId()); - } else if (this.props.defaultSearch) { - children.push(this.renderNoSearchResults()); - } else { - children.push(this.renderNoShots()); - } - } else { - const masonryOptions = { - originLeft: !this.props.isRtl, - }; - return ( -
    - - {children} - -
    - ); - } - return children; - } - - renderShotsLoading() { - return
    -
    -
    -
    -
    ; - } - - renderPageNavigation() { - if (!this.props.totalShots || parseInt(this.props.totalShots, 10) === 0) { - return null; - } - - const totalPages = Math.ceil(this.props.totalShots / this.props.shotsPerPage) || 1; - const hasPrev = this.props.pageNumber > 1; - const prevPageNumber = this.props.pageNumber - 1; - const prevClasses = ["shots-page-nav"].concat(!hasPrev && "disabled").join(" "); - const hasNext = this.props.pageNumber < totalPages; - const nextPageNumber = this.props.pageNumber - 0 + 1; - const nextClasses = ["shots-page-nav"].concat(!hasNext && "disabled").join(" "); - const hidden = totalPages < 2; - let arrowheadPrev = this.props.staticLink("/static/img/arrowhead-left-16.svg"); - let arrowheadNext = this.props.staticLink("/static/img/arrowhead-right-16.svg"); - if (this.props.isRtl) { - [arrowheadNext, arrowheadPrev] = [arrowheadPrev, arrowheadNext]; - } - - return ( - - ); - } - - onChangePage(pageNumber, e) { - controller.onChangePage(pageNumber); - e.preventDefault(); - window.scrollTo(0, 0); - } - - renderErrorMessages() { - return ( -
    - - - - - - - - - -
    - ); - } - - renderNoShots() { - return ( -
    - - no Shots found - - -

    No saved shots.

    -
    - -

    Go on, create some.

    -
    -
    - ); - } - - renderNoDeviceId() { - return ( -
    - - no Shots found - - -

    Looking for your shots...

    -
    -
    - ); - } - - renderNoSearchResults() { - return ( -
    - - no Shots found - - -

    Hmmm!

    -
    - -

    We can’t find any shots that match your search.

    -
    -
    - ); - } - - renderSearchForm() { - return ( -
    - - - this.searchInput = searchInput} maxLength="100" placeholder="search my shots" defaultValue={this.state.defaultSearch} onChange={this.onChangeSearch.bind(this)} /> - - -
    -
    - - ); - } - - onSubmitForm(e) { - e.preventDefault(); - const val = this.searchInput.value; - if (val) { - sendEvent("search", "submit"); - } else { - sendEvent("clear-search", "submit"); - } - controller.onChangeSearch(val); - } - - onChangeSearch() { - const val = this.searchInput.value; - this.setState({defaultSearch: val}); - if (!val) { - sendEvent("clear-search", "keyboard"); - controller.onChangeSearch(val); - return; - } - if (this._keyupTimeout) { - clearTimeout(this._keyupTimeout); - this._keyupTimeout = undefined; - } - if (val.length > 3) { - this._keyupTimeout = setTimeout(() => { - sendEvent("search", "timed"); - controller.onChangeSearch(val); - }, 1000); - } - } - - onClearSearch(e) { - const val = ""; - this.searchInput.value = val; - this.setState({defaultSearch: val}); - controller.onChangeSearch(val); - sendEvent("clear-search", "button"); - return null; - } - - componentDidUpdate() { - if ((this.props.defaultSearch || "") !== (this.state.defaultSearch || "")) { - document.body.classList.add("search-results-loading"); - } else { - document.body.classList.remove("search-results-loading"); - } - } - -} - -Body.propTypes = { - abTests: PropTypes.object, - defaultSearch: PropTypes.string, - disableSearch: PropTypes.bool, - downloadUrls: PropTypes.object, - enableUserSettings: PropTypes.bool, - authenticated: PropTypes.bool, - hasFxa: PropTypes.bool, - isExtInstalled: PropTypes.bool, - pageNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - shots: PropTypes.array, - shotsPerPage: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - staticLink: PropTypes.func, - totalShots: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - isRtl: PropTypes.bool, -}; - -class Card extends React.Component { - constructor(props) { - super(props); - this.state = {panelOpen: "panel-closed", deleted: false}; - } - - render() { - const defaultImageUrl = this.props.staticLink("img/question-mark.svg"); - const shot = this.props.shot; - const downloadUrl = this.props.downloadUrl; - let imageUrl; - const clip = shot.clipNames().length ? shot.getClip(shot.clipNames()[0]) : null; - if (!clip) { - // Some corrupted shot, we'll have to ignore it - return null; - } - if (shot.thumbnail) { - imageUrl = shot.thumbnail; - } else if (clip && clip.image && clip.image.url) { - imageUrl = clip.image.url; - } else if (shot.images.length) { - imageUrl = shot.images[0].url; - } else { - imageUrl = defaultImageUrl; - } - - // fallback to the question mark if the imageUrl is invalid - if (!isValidClipImageUrl(imageUrl)) { - imageUrl = this.props.staticLink("img/question-mark.svg"); - } - - let favoriteIndicator = null; - if (!shot.expireTime) { - favoriteIndicator = -
    -
    ; - } else if (this.props.hasFxa) { - favoriteIndicator = -
    -
    ; - } - // Disabling all favorites for now: - favoriteIndicator = null; - - let syncedShotIndicator = null; - if (shot.isSynced) { - syncedShotIndicator = -
    - -
    -
    ; - } - - const deleteConfirmationClass = this.state.deletePanelOpen ? "panel-open" : ""; - - return ( - - ); - } - - getClipType(thumbnailUrl, dimensions) { - // "portrait": 210 x 280, image scaled on X - // "landscape": 210 x 140, image scaled on Y - // "square": 210 x 210, image scaled on X or Y - - const containerWidth = 210; - const landscapeHeight = 140; - const portraitHeight = 280; - const landscapeAspectRatio = containerWidth / landscapeHeight; - const portraitAspectRatio = containerWidth / portraitHeight; - let thumbnailWidth, thumbnailHeight; - - if (!thumbnailUrl) { - thumbnailWidth = dimensions.x; - thumbnailHeight = dimensions.y; - } else { - const thumbnailDimensions = getThumbnailDimensions(dimensions.x, dimensions.y); - thumbnailWidth = thumbnailDimensions.width; - thumbnailHeight = thumbnailDimensions.height; - } - - const thumbnailAspectRatio = thumbnailWidth / thumbnailHeight; - - if (thumbnailAspectRatio <= portraitAspectRatio) { - return "portrait"; - } - if (thumbnailAspectRatio >= landscapeAspectRatio) { - return "landscape"; - } - if (thumbnailHeight > thumbnailWidth) { - return "square-x"; - } - return "square-y"; - } - - setPanelState(state) { - this.setState({panelOpen: state}); - } - - isDeleted() { - return this.state.deleted ? "deleted" : ""; - } - - onOpen(url, event) { - if (event.ctrlKey || event.metaKey || event.button === 1) { - // Don't override what might be an open-in-another-tab click - sendEvent("goto-shot", "myshots-tile-new-tab", {useBeacon: true}); - return; - } - - sendEvent("goto-shot", "myshots-tile", {useBeacon: true}); - location.href = url; - } - - displayTitle(title) { - // FIXME: this won't work for rtl languages. use CSS ellipsis instead? (#3116) - if (title.length > 140) { - return (title.substring(0, 140) + "..."); - } - return title; - } - - clickDeleteHandler(event) { - sendEvent("start-delete", "my-shots", {useBeacon: true}); - this.setState({ deletePanelOpen: true }); - } - - confirmDeleteHandler(shot, event) { - sendEvent("delete", "my-shots-popup-confirm", { useBeacon: true }); - controller.deleteShot(shot); - this.setState({ deleted: true, deletePanelOpen: false }); - } - - cancelDeleteHandler(event) { - this.setState({ deletePanelOpen: false }); - sendEvent("cancel-delete", "my-shots-popup-confirm"); - } - - onClickDownload() { - this.downloadButton.blur(); - sendEvent("download", "myshots-tile"); - } - - onClickFavorite(shot) { - if (shot.isFavorite) { - sendEvent("unfavorite", "myshots-tile"); - } else { - sendEvent("favorite", "myshots-tile"); - } - - controller.toggleFavoriteShot(shot); - } -} - -Card.propTypes = { - abTests: PropTypes.object, - downloadUrl: PropTypes.string, - hasFxa: PropTypes.bool, - isExtInstalled: PropTypes.bool, - isOwner: PropTypes.bool, - shot: PropTypes.object, - staticLink: PropTypes.func, -}; - -exports.HeadFactory = React.createFactory(Head); -exports.BodyFactory = React.createFactory(Body); diff --git a/server/src/promotion-strategy.js b/server/src/promotion-strategy.js deleted file mode 100644 index ab848dacaa..0000000000 --- a/server/src/promotion-strategy.js +++ /dev/null @@ -1,86 +0,0 @@ -class PromotionStrategy { - /* Display Firefox Account onboarding dialog in header below signin button */ - shouldShowOnboardingDialog(isOwner, isShotPage) { - // Because we are deprecating the server, we never want to show this. - return false; - /* - let show = false; - // Exit without showing dialog on non-owner shot page - if (isShotPage && !isOwner) { - return show; - } - - const count = localStorage.hasSeenOnboardingDialog; - if (!count) { - localStorage.hasSeenOnboardingDialog = 1; - show = true; - } else if (count < 3) { - localStorage.hasSeenOnboardingDialog = parseInt(count, 10) + 1; - show = true; - } - return show; - */ - } - - /* Display edit tool promotion on shot page below edit button */ - shouldShowEditToolPromotion(isOwner, enableAnnotations, hasFxaOnboardingDialog) { - // Hide edit tool promotion when showing fxaOnboarding dialog - if (!isOwner || !enableAnnotations || hasFxaOnboardingDialog) { - return false; - } - let show = false; - const count = localStorage.hasSeenPromoDialog; - if (!count) { - localStorage.hasSeenPromoDialog = 1; - show = true; - } else if (count < 3) { - localStorage.hasSeenPromoDialog = parseInt(count, 10) + 1; - show = true; - } - return show; - } - - /* Highlight edit tool icon on the shot page when user lands on shot page - for the first time and when the edit tool promo is displayed */ - shouldHighlightEditIcon(isOwner, enableAnnotations) { - if (!isOwner) { - return false; - } - const hasSeen = localStorage.hasSeenEditButton; - if (!hasSeen && enableAnnotations) { - localStorage.hasSeenEditButton = "1"; - } - return !hasSeen; - } - - /* Display upsell ad-banner inside header */ - shouldShowFirefoxBanner(shouldGetFirefox, isOwner) { - return false; - /* - if (shouldGetFirefox && !isOwner) { - return true; - } - return false; - */ - } - - /* Display FxA signin ad-banner inside header */ - shouldShowFxaBanner(hasFxa) { - // Because we are deprecating the server, we never want to show this. - return false; - /* - if (!hasFxa) { - return true; - } - return false; - */ - } - - shouldShowDeprecation() { - return false; - } -} - -if (typeof exports !== "undefined") { - exports.PromotionStrategy = PromotionStrategy; -} diff --git a/server/src/proxy-url.js b/server/src/proxy-url.js deleted file mode 100644 index 2d6ffc3146..0000000000 --- a/server/src/proxy-url.js +++ /dev/null @@ -1,23 +0,0 @@ -const dbschema = require("./dbschema"); -const config = require("./config").getProperties(); -const { isValidClipImageUrl } = require("../shared/shot"); -const { URL } = require("url"); - -exports.createProxyUrl = function(req, url, hash) { - const base = `${req.protocol}://${config.contentOrigin}`; - const sig = dbschema.getKeygrip("proxy-url").sign(new Buffer(url, "utf8")); - let proxy = `${base}/proxy?url=${encodeURIComponent(url)}&sig=${encodeURIComponent(sig)}`; - if (hash) { - proxy += "#" + hash; - } - return proxy; -}; - -exports.createDownloadUrl = function(url, filename) { - const path = (new URL(url)).pathname; - const sig = dbschema.getKeygrip("download-url").sign(new Buffer(`${path} ${filename}`, "utf8")); - if (!isValidClipImageUrl(url)) { - return ""; - } - return `${url}?download=${encodeURIComponent(filename)}&sig=${encodeURIComponent(sig)}`; -}; diff --git a/server/src/ravenclient.js b/server/src/ravenclient.js deleted file mode 100644 index 9aa1c6ee13..0000000000 --- a/server/src/ravenclient.js +++ /dev/null @@ -1,73 +0,0 @@ -const config = require("./config").getProperties(); -const Raven = require("raven"); -const urlParse = require("url").parse; - - -let useRaven = false; - -if (config.sentryDSN) { - Raven.config(config.sentryDSN).install(); - useRaven = true; -} - -/** Returns true if the path looks like '/some-id/some-domain' */ -function isShotLikePath(path) { - return /^\/[^/]+\/[^/]+\/?$/.test(path); -} - -function makeOptionsFromRequest(req, options) { - let referrer = null; - let path = req.originalUrl; - if (req.headers.referer) { - referrer = req.headers.referer; - if (referrer.startsWith(req.backend)) { - const parsed = urlParse(referrer); - let pathname = parsed.pathname; - if (isShotLikePath(pathname)) { - pathname = "/a-shot/redacted"; - } - referrer = `${parsed.protocol}//${parsed.host}${pathname}`; - } - } - if (isShotLikePath(path)) { - path = "/a-shot/redacted"; - } - options = options || {}; - options.extra = options.extra || {}; - options.extra.path = path; - options.extra.method = req.method; - options.extra.userAgent = req.headers["user-agent"]; - options.extra.referrer = referrer; - options.extra.authenticated = !!req.deviceId; - return options; -} - -exports.sendRavenMessage = function(req, message, options) { - if (!useRaven) { - return; - } - options = makeOptionsFromRequest(req, options); - Raven.captureMessage(message, options); -}; - -exports.captureRavenException = function(exc, req, options) { - if (req) { - options = makeOptionsFromRequest(req, options); - } - if (useRaven) { - return Raven.captureException(exc, options); - } - return null; -}; - -exports.addRavenRequestHandler = function(app) { - if (useRaven) { - app.use(Raven.requestHandler()); - } -}; - -exports.addRavenErrorHandler = function(app) { - if (useRaven) { - app.use(Raven.errorHandler()); - } -}; diff --git a/server/src/reactrender.js b/server/src/reactrender.js deleted file mode 100644 index 3b774bdb6d..0000000000 --- a/server/src/reactrender.js +++ /dev/null @@ -1,99 +0,0 @@ -const { addReactScripts } = require("./reactutils"); -const ReactDOMServer = require("react-dom/server"); -const { getGitRevision } = require("./linker"); - -const { JSDOM } = require("jsdom"); -const dom = new JSDOM(""); -const template = dom.window.document.querySelector("template"); - -// Used by the LocalizationProvider to sanitize markup in translations on the -// server side. During runtime it uses document.createElement("template"). -function parseMarkup(textContent) { - // eslint-disable-next-line no-unsanitized/property - template.innerHTML = textContent; - return Array.from(template.content.childNodes); -} - -exports.render = function(req, res, page) { - const modelModule = require("./" + page.modelModuleName); - const viewModule = page.viewModule; - const cdn = req.config.siteCdn.replace(/\/*$/, ""); - Promise.resolve(modelModule.createModel(req)).then((model) => { - model.backend = req.backend; - let jsonModel = model.jsonModel || model; - let serverModel = model.serverModel || model; - const csrfToken = req.csrfToken && req.csrfToken(); - jsonModel = Object.assign({ - authenticated: !!(req.deviceId || req.accountId), - hasFxa: !!req.accountId, - sentryPublicDSN: req.config.sentryPublicDSN, - backend: req.backend, - gitRevision: getGitRevision(), - cdn, - csrfToken, - abTests: req.abTests, - userLocales: req.userLocales, - parseMarkup, - }, jsonModel); - serverModel = Object.assign({ - authenticated: !!(req.deviceId || req.accountId), - hasFxa: !!req.accountId, - sentryPublicDSN: req.config.sentryPublicDSN, - staticLink: req.staticLink, - csrfToken, - abTests: req.abTests, - userLocales: req.userLocales, - messages: req.messages, - parseMarkup, - }, serverModel); - if (req.query.data === "json") { - if (req.query.pretty !== undefined) { - res.type("json").send(JSON.stringify(jsonModel, null, " ")); - } else { - res.type("json").send(jsonModel); - } - return; - } - const head = ReactDOMServer.renderToStaticMarkup(viewModule.HeadFactory(serverModel)); - let body; - if (page.noBrowserJavascript) { - body = ReactDOMServer.renderToStaticMarkup(viewModule.BodyFactory(serverModel)); - } else { - body = ReactDOMServer.renderToString(viewModule.BodyFactory(serverModel)); - } - const jsonString = JSON.stringify(jsonModel).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/`; - if (page.noBrowserJavascript) { - inlineJson = ""; - } - let doc = ` - - ${head} - -
    ${body}
    - ${inlineJson} - - `.trim(); - if (!page.noBrowserJavascript) { - // FIXME: we should just inline the addReactScripts functionality in this function: - let script = `\ - var jsonData = document.getElementById('json-data').textContent; -window.initialModel = JSON.parse(jsonData); -window.initialModelLaunched = false; -if (window.controller) { - window.controller.launch(window.initialModel); - window.initialModelLaunched = true; -} -`; - if (page.extraBodyJavascript) { - script += page.extraBodyJavascript; - } - doc = addReactScripts(doc, script, req.cspNonce); - } - res.send(doc); - }).catch((err) => { - res.type("txt").status(500).send("Error: " + err + "\n" + err.stack); - }); -}; diff --git a/server/src/reactruntime.js b/server/src/reactruntime.js deleted file mode 100644 index 63199bd00a..0000000000 --- a/server/src/reactruntime.js +++ /dev/null @@ -1,197 +0,0 @@ -require("core-js"); - -const React = require("react"); -const ReactDOM = require("react-dom"); -const PropTypes = require("prop-types"); -const linker = require("./linker"); -require("fluent-intl-polyfill/compat"); -const { FluentBundle } = require("fluent/compat"); -const { LocalizationProvider } = require("fluent-react/compat"); -const { getLocaleMessages } = require("./locale-messages"); - -function generateBundles(messages, locales) { - const bundles = []; - for (const locale of locales) { - const bundle = new FluentBundle(locale); - bundle.addMessages(messages[locale]); - bundles.push(bundle); - } - return bundles; -} - -exports.HeadTemplate = class HeadTemplate extends React.Component { - - render() { - // FIXME: this should probably include some standard CSS or other boilerplate - let activationScript; - if (!this.props.noAnalytics) { - if (this.props.hashAnalytics) { - activationScript = - ${footer}` - ); - } - return `\n${body}`; -}; diff --git a/server/src/responses.js b/server/src/responses.js deleted file mode 100644 index 8bf456dfd1..0000000000 --- a/server/src/responses.js +++ /dev/null @@ -1,33 +0,0 @@ -const config = require("./config").getProperties(); -const { captureRavenException } = require("./ravenclient"); -const mozlog = require("./logging").mozlog("server"); - -exports.simpleResponse = function(res, message, status) { - status = status || 200; - res.header("Content-Type", "text/plain; charset=utf-8"); - res.status(status); - res.send(message); -}; - -exports.jsResponse = function(res, jsstring) { - res.header("Content-Type", "application/javascript; charset=utf-8"); - res.send(jsstring); -}; - -exports.errorResponse = function(res, message, err) { - res.header("Content-Type", "text/plain; charset=utf-8"); - res.status(500); - if (config.showStackTraces) { - if (err) { - message += "\n" + err; - if (err.stack) { - message += "\n\n" + err.stack; - } - } - res.send(message); - } else { - res.send("Server error"); - } - mozlog.error("generic-error-response", {msg: message, error: err}); - captureRavenException(err, res.req); -}; diff --git a/server/src/server.js b/server/src/server.js deleted file mode 100644 index 988019161d..0000000000 --- a/server/src/server.js +++ /dev/null @@ -1,1363 +0,0 @@ -const config = require("./config").getProperties(); -require("./logging").installConsoleHandler(); -const mozlog = require("./logging").mozlog("server"); -const path = require("path"); -const { readFileSync, existsSync } = require("fs"); -const Cookies = require("cookies"); -const { URL } = require("url"); -const Watchdog = require("./watchdog"); - -let istanbulMiddleware = null; -if (config.enableCoverage && process.env.NODE_ENV === "dev") { - istanbulMiddleware = require("istanbul-middleware"); - mozlog.info("coverage-hook-enabled", {msg: "Hook loader for coverage - ensure this is not production!"}); - istanbulMiddleware.hookLoader(__dirname); // cover all files except under node_modules -} - -const { Shot } = require("./servershot"); -const { - checkLogin, - registerLogin, - setState, - checkState, - tradeCode, - getAccountId, - registerAccount, - fetchProfileData, - saveProfileData, - disconnectDevice, - retrieveAccount, - isValidDeviceId, -} = require("./users"); -const dbschema = require("./dbschema"); -const express = require("express"); -const bodyParser = require("body-parser"); -const contentDisposition = require("content-disposition"); -const { csrfProtection, csrfErrorResponse } = require("./middleware/csrf"); -const morgan = require("morgan"); -const linker = require("./linker"); -const { randomBytes } = require("./helpers"); -const errors = require("./errors"); -const buildTime = require("./build-time").string; -const ua = require("universal-analytics"); -const http = require("http"); -const https = require("https"); -const gaActivation = require("./ga-activation"); -const genUuid = require("nodify-uuid"); -const statsd = require("./statsd"); -const { notFound } = require("./pages/not-found/server"); -const { setMonthlyCache, setDailyCache, doNotCache } = require("./caching"); -const { captureRavenException, sendRavenMessage, - addRavenRequestHandler, addRavenErrorHandler } = require("./ravenclient"); -const { errorResponse, simpleResponse, jsResponse } = require("./responses"); -const selfPackage = require("./package.json"); -const { b64EncodeJson, b64DecodeJson } = require("./b64"); -const { l10n } = require("./middleware/l10n"); -const multer = require("multer"); -const storage = multer.memoryStorage(); -const upload = multer({storage}); -const { isValidClipImageUrl } = require("../shared/shot"); -const urlParse = require("url").parse; -const { updateAbTests } = require("./ab-tests"); -const util = require("util"); - -const COOKIE_EXPIRE_TIME = 30 * 24 * 60 * 60 * 1000; // 30 days - -function initDatabase() { - const forceDbVersion = config.db.forceDbVersion; - if (forceDbVersion) { - let hadError = false; - // eslint-disable-next-line promise/catch-or-return - dbschema.forceDbVersion(forceDbVersion).then(() => { - }, - (e) => { - hadError = true; - mozlog.error("database-version-update-error", {msg: "Error forcing database version:", dbVersion: forceDbVersion, error: e}); - }).then(() => { - mozlog.info("database-version-update-exit", {msg: "Exiting after downgrade"}); - process.exit(hadError ? 2 : 0); - }); - return; - } - let promise; - if (config.disableControllerTasks) { - mozlog.info("database-version-update-skipped", {msg: "Note: this server will not perform database initialization"}); - promise = dbschema.createKeygrip(); - } else { - promise = dbschema.createTables().then(() => { - return dbschema.createKeygrip(); - }).then(() => { - return Shot.upgradeSearch(); - }); - } - promise.catch((e) => { - mozlog.error("database-version-update-error", {msg: "Error initializing database:", error: e, stack: e.stack}); - captureRavenException(e); - // Give Raven/etc a chance to work before exit: - setTimeout(() => { - process.exit(1); - }, 500); - }); -} - -initDatabase(); - -const app = express(); - -app.set("trust proxy", true); - -// Disable x-powered-by header -app.disable("x-powered-by"); - -if (config.enableCoverage && istanbulMiddleware) { - // enable coverage endpoints under /coverage - app.use("/coverage", istanbulMiddleware.createHandler()); -} - -const SITE_CDN = (config.siteCdn && (new URL(config.siteCdn)).host) || ""; -const CONTENT_NAME = config.contentOrigin || ""; -const CONTENT_CDN = (config.contentCdn && (new URL(config.contentCdn)).host) || ""; -const FXA_SERVER = config.fxa.profileServer && require("url").parse(config.fxa.profileServer).host; -const FXA_USER_CONTENT = config.fxa.profileImageServer || ""; - -function addHSTS(req, res) { - // Note: HSTS will only produce warning on a localhost self-signed cert - if (req.protocol === "https" && !config.localhostSsl) { - const time = 24 * 60 * 60; // 24 hours - res.header( - "Strict-Transport-Security", - `max-age=${time}`); - } -} - -app.use((req, res, next) => { - res.header("X-Content-Type-Options", "nosniff"); - addHSTS(req, res); - next(); -}); - -addRavenRequestHandler(app); - -if (config.expectProtocol) { - if (!/^https?$/.test(config.expectProtocol)) { - throw new Error(`Error, bad EXPECT_PROTOCOL: ${config.expectProtocol}`); - } - app.use((req, res, next) => { - req.headers["x-forwarded-proto"] = config.expectProtocol; - next(); - }); -} - -function isApiUrl(url) { - return url.startsWith("/api") || url === "/event" || url === "/timing"; -} - -app.use((req, res, next) => { - if (isApiUrl(req.url)) { - // All API requests are CORS-enabled - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS"); - res.header("Access-Control-Allow-Headers", "Cookie, Content-Type, User-Agent"); - if (req.method === "OPTIONS") { - res.type("text"); - res.send(""); - return; - } - } - next(); -}); - -app.use(bodyParser.urlencoded({extended: false})); -app.use(bodyParser.json({limit: config.requestBodySizeLimit})); - -app.use( - "/static", - function(req, res, next) { - if (req.query.rev && req.query.rev === linker.getGitRevision()) { - setMonthlyCache(res); - } else { - doNotCache(res); - } - next(); - }, - express.static(path.join(__dirname, "static"), {index: false}) -); - -const xpidir = path.join(__dirname, "..", "xpi"); -app.use("/xpi", express.static(xpidir, {index: false})); - -app.use(morgan("combined")); - -app.use(function(req, res, next) { - const authHeader = req.headers["x-screenshots-auth"]; - let authInfo = {}; - const cookies = new Cookies(req, res, {keys: dbschema.getKeygrip("auth")}); - if (authHeader) { - authInfo = decodeAuthHeader(authHeader); - } else { - authInfo.deviceId = cookies.get("user", {signed: true}); - authInfo.accountId = cookies.get("accountid", {signed: true}); - const encodedAbTests = cookies.get("abtests", {signed: true}); - let abTests; - if (encodedAbTests) { - abTests = b64DecodeJson(encodedAbTests); - } - if (!authInfo.deviceId) { - // Authenticated users get A/B tests when they register/login, but unauthenticated - // users have to get it lazily - const origAbTests = Object.assign({}, abTests); - abTests = updateAbTests(abTests || {}, null, true); - if (Object.keys(abTests).length) { - // Only send if there's some test - const newEncodedAbTests = b64EncodeJson(abTests); - if (encodedAbTests !== newEncodedAbTests) { - cookies.set("abtests", newEncodedAbTests, {signed: true, sameSite: "lax", maxAge: COOKIE_EXPIRE_TIME}); - } - } else if (Object.keys(origAbTests).length) { - // All the A/B tests were removed (probably because the tests have been - // deprecated), but the user has an old A/B test. Therefore we should - // delete the cookie - cookies.set("abtests", "", {signed: true, sameSite: "lax", maxAge: 0}); - } - } - authInfo.abTests = abTests; - } - - if (authInfo.deviceId) { - if (!isValidDeviceId(authInfo.deviceId)) { - next(new Error("Bad deviceId in login")); - return; - } - req.deviceId = authInfo.deviceId; - req.userAnalytics = ua(config.gaId, req.deviceId, {strictCidFormat: false}); - } - - if (authInfo.accountId) { - if (authInfo.accountId.search(/^[a-zA-Z0-9]{1,255}$/) === -1) { - next(new Error("Bad accountId in login")); - return; - } - req.accountId = authInfo.accountId; - } - req.cookies = cookies; - req.abTests = authInfo.abTests || {}; - const host = req.headers.host === config.contentOrigin ? config.contentOrigin : config.siteOrigin; - req.backend = `${req.protocol}://${host}`; - req.config = config; - next(); -}); - -// NOTE - the csrf middleware should come after the middleware that -// assigns req.cookies. -app.use(csrfProtection); - -function decodeAuthHeader(header) { - /** Decode a string header in the format {deviceId}:{deviceIdSig};abtests={b64thing}:{sig} */ - // Since it's treated as opaque, we'll use a fragile regex - const keygrip = dbschema.getKeygrip("auth"); - const match = /^([^:]{1,255}):([^;]{1,255});abTests=([^:]{1,1500}):(.{0,255})$/.exec(header); - if (!match) { - const exc = new Error("Invalid auth header"); - exc.headerValue = header; - captureRavenException(exc); - return {}; - } - const deviceId = match[1]; - const deviceIdSig = match[2]; - const abTestsEncoded = match[3]; - const abTestsEncodedSig = match[4]; - if (!keygrip.verify(deviceId, deviceIdSig)) { - const exc = new Error("deviceId signature incorrect"); - exc.deviceIdLength = typeof deviceId === "string" ? deviceId.length : String(deviceId); - exc.deviceIdSigLength = typeof deviceIdSig === "string" ? deviceIdSig.length : String(deviceIdSig); - captureRavenException(exc); - return {}; - } - if (!keygrip.verify(abTestsEncoded, abTestsEncodedSig)) { - const exc = new Error("abTests signature incorrect"); - exc.abTestsEncodedLength = typeof abTestsEncoded === "string" ? abTestsEncoded.length : String(abTestsEncoded); - exc.abTestsEncodedSigLength = typeof abTestsEncodedSig === "string" ? abTestsEncodedSig.length : String(abTestsEncodedSig); - captureRavenException(exc); - return {}; - } - const abTests = b64DecodeJson(abTestsEncoded); - return {deviceId, abTests}; -} - -app.use(l10n); - -app.use(function(req, res, next) { - req.staticLink = linker.staticLink.bind(null, { - cdn: req.config.siteCdn, - isRtl: req.isRtl, - }); - // The contentCdn config does not have a default value but contentOrigin does. - const base = config.contentCdn || `${req.protocol}://${config.contentOrigin}`; - linker.imageLinkWithHost = linker.imageLink.bind(null, base); - next(); -}); - -app.param("id", function(req, res, next, id) { - if (/^[a-zA-Z0-9]{16}$/.test(id)) { - next(); - return; - } - const exc = new Error("invalid id"); - exc.isAppError = true; - exc.output = { - statusCode: 400, - payload: "Invalid id", - }; - next(exc); -}); - -app.param("domain", function(req, res, next, domain) { - if (/^[^\s/]{1,252}$/.test(domain)) { - next(); - return; - } - next(new Error("invalid domain")); -}); - -app.get("/ga-activation.js", function(req, res) { - sendGaActivation(req, res, false); -}); - -app.get("/ga-activation-hashed.js", function(req, res) { - sendGaActivation(req, res, true); -}); - -function sendGaActivation(req, res, hashPage) { - let promise; - let loginType = "non-login"; - if (req.accountId) { - if (req.deviceId) { - loginType = "extension-fxa"; - } else { - loginType = "browser-fxa"; - } - } else if (req.deviceId) { - loginType = "extension"; - } - setMonthlyCache(res, {private: true}); - if (req.accountId || req.deviceId) { - promise = hashUserId(req.accountId || req.deviceId).then((uuid) => { - return uuid.toString(); - }); - } else { - promise = Promise.resolve(""); - } - promise.then((userUuid) => { - const script = gaActivation.makeGaActivationString({ - gaId: config.gaId, - userId: userUuid, - abTests: req.abTests, - hashLocation: hashPage, - loginType, - }); - jsResponse(res, script); - }).catch((e) => { - errorResponse(res, "Error creating user UUID:", e); - }); -} - -const parentHelperJs = readFileSync(path.join(__dirname, "/static/js/parent-helper.js"), {encoding: "UTF-8"}); - -app.get("/parent-helper.js", function(req, res) { - setMonthlyCache(res); - const postMessageOrigin = `${req.protocol}://${req.config.contentOrigin}`; - const script = `${parentHelperJs}\nvar CONTENT_HOSTING_ORIGIN = "${postMessageOrigin}";`; - jsResponse(res, script); -}); - -const ravenClientJs = readFileSync(require.resolve("raven-js/dist/raven.min"), {encoding: "UTF-8"}); - -app.get("/install-raven.js", function(req, res) { - setMonthlyCache(res); - if (!req.config.sentryPublicDSN) { - jsResponse(res, ""); - return; - } - const options = { - environment: process.env.NODE_ENV || "dev", - release: linker.getGitRevision(), - sanitizeKeys: ["url"], - serverName: req.backend, - }; - const script = ` - ${ravenClientJs} - Raven.config("${req.config.sentryPublicDSN}", ${JSON.stringify(options)}).install(); - window.Raven = Raven;`; - jsResponse(res, script); -}); - -app.get("/favicon.ico", function(req, res) { - res.redirect(301, "/static/img/icon-32.png"); -}); - -app.post("/error", function(req, res) { - const bodyObj = req.body; - if (typeof bodyObj !== "object") { - throw new Error(`Got unexpected req.body type: ${typeof bodyObj}`); - } - const userAnalytics = ua(config.gaId); - let desc = bodyObj.name; - const attrs = []; - for (const attr in bodyObj) { - if (attr === "name" || attr === "help" || attr === "version") { - continue; - } - let value = "" + bodyObj[attr]; - // FIXME: maybe a crude attempt to ensure some santization of parameters: - value = value.replace(/\n/g, " / "); - value = value.replace(/[\t\r]/g, " "); - value = value.replace(/\s+/g, " "); - value = value.replace(/[^a-z0-9_\-=+{}().,/?:[\]| ]/gi, "?"); - value = value.substr(0, 100); - attrs.push(`${attr}: ${value}`); - } - if (attrs.length) { - desc += " - " + attrs.join("; "); - } - userAnalytics.exception({ - hitType: "exception", - userAgentOverride: req.headers["user-agent"], - applicationName: "firefox", - applicationVersion: bodyObj.version, - exceptionDescription: desc, - }).send(); - mozlog.info("remote-error", {msg: "Error received:", description: desc}); - simpleResponse(res, "OK", 200); -}); - -function hashUserId(deviceId) { - return new Promise((resolve, reject) => { - if (!dbschema.getTextKeys("ga-user-nonce")) { - throw new Error("Server keys not initialized"); - } - const userKey = dbschema.getTextKeys("ga-user-nonce")[0] + deviceId; - genUuid.generate(genUuid.V_SHA1, genUuid.nil, userKey, function(err, userUuid) { - if (err) { - reject(err); - } else { - resolve(userUuid); - } - }); - }); -} - -app.post("/event", function(req, res) { - const bodyObj = req.body; - if (typeof bodyObj !== "object") { - throw new Error(`Got unexpected req.body type: ${typeof bodyObj}`); - } - // We allow clients to signal events with a deviceId even if they haven't logged in yet, - // by putting deviceId into the request body: - const deviceId = req.deviceId || bodyObj.deviceId; - let events; - - if (bodyObj.events) { - events = bodyObj.events; - } else { - events = [bodyObj]; - } - - hashUserId(deviceId).then((userUuid) => { - const userAnalytics = ua(config.gaId, userUuid.toString(), {strictCidFormat: false}); - events.forEach(event => { - const params = Object.assign( - {}, - event.options, - { - ec: event.event, - ea: event.action, - el: event.label, - ev: event.eventValue, - qt: (event.queueTime || 0), - } - ); - if (req.headers["user-agent"]) { - params.ua = req.headers["user-agent"]; - } - userAnalytics.event(params); - }); - userAnalytics.send(); - simpleResponse(res, "OK", 200); - }).catch((e) => { - errorResponse(res, "Error creating user UUID:", e); - }); -}); - -app.post("/timing", function(req, res) { - const bodyObj = req.body; - if (typeof bodyObj !== "object") { - throw new Error(`Got unexpected req.body type: ${typeof bodyObj}`); - } - - const deviceId = req.deviceId || bodyObj.deviceId; - let timings; - - if (bodyObj.timings) { - timings = bodyObj.timings; - } else { - timings = [bodyObj]; - } - - hashUserId(deviceId).then((userUuid) => { - const userAnalytics = ua(config.gaId, userUuid.toString(), {strictCidFormat: false}); - timings.forEach(timing => { - const params = { - userTimingCategory: timing.timingCategory, - userTimingVariableName: timing.timingVar, - userTimingTime: timing.timingValue, - userTimingLabel: timing.timingLabel, - }; - userAnalytics.timing(params); - }); - userAnalytics.send(); - simpleResponse(res, "OK", 200); - }).catch((e) => { - errorResponse(res, "Error creating user UUID:", e); - }); -}); - -app.post("/api/register", function(req, res) { - const vars = req.body; - const canUpdate = vars.deviceId === req.deviceId; - if (!vars.deviceId) { - mozlog.error("bad-api-register", {msg: "Bad register request", vars: JSON.stringify(vars, null, " ")}); - sendRavenMessage(req, "Attempted to register without deviceId"); - simpleResponse(res, "Bad request, no deviceId", 400); - return; - } - if (!isValidDeviceId(vars.deviceId)) { - mozlog.error("bad-api-register", {msg: "Bad register request", vars: JSON.stringify(vars, null, " ")}); - sendRavenMessage(req, "Attempted to register with invalid deviceId"); - simpleResponse(res, "Bad request, invalid deviceId", 400); - return; - } - if (!vars.secret) { - mozlog.error("bad-api-register", {msg: "Bad register request", vars: JSON.stringify(vars, null, " ")}); - sendRavenMessage(req, "Attempted to register without secret"); - simpleResponse(res, "Bad request, no secret", 400); - return; - } - registerLogin(vars.deviceId, req.accountId, { - secret: vars.secret, - nickname: vars.nickname || null, - avatarurl: vars.avatarurl || null, - }, canUpdate).then(function(userAbTests) { - if (userAbTests) { - sendAuthInfo(req, res, {deviceId: vars.deviceId, userAbTests}); - // FIXME: send GA signal? - } else { - sendRavenMessage(req, "Attempted to register existing user", { - extra: { - hasSecret: !!vars.secret, - hasNickname: !!vars.nickname, - hasAvatarurl: !!vars.avatarurl, - }, - }); - simpleResponse(res, "User exists", 401); - } - }).catch(function(err) { - errorResponse(res, "Error registering:", err); - }); -}); - -function sendAccountIdCookie(req, res, accountId) { - if (accountId) { - const keygrip = dbschema.getKeygrip("auth"); - const cookies = new Cookies(req, res, {keys: keygrip}); - cookies.set("accountid", accountId, {signed: true, sameSite: "lax", maxAge: COOKIE_EXPIRE_TIME}); - } -} - -function sendAuthInfo(req, res, params) { - const { deviceId, accountId, userAbTests } = params; - if (deviceId.search(/^[a-zA-Z0-9_-]{1,255}$/) === -1) { - const exc = new Error("Bad deviceId in login"); - exc.deviceId = deviceId; - captureRavenException(exc, req); - throw new Error("Bad deviceId"); - } - const encodedAbTests = b64EncodeJson(userAbTests); - const keygrip = dbschema.getKeygrip("auth"); - const cookies = new Cookies(req, res, {keys: keygrip}); - cookies.set("user", deviceId, {signed: true, sameSite: "lax", maxAge: COOKIE_EXPIRE_TIME}); - sendAccountIdCookie(req, res, accountId); - cookies.set("abtests", encodedAbTests, {signed: true, sameSite: "lax", maxAge: COOKIE_EXPIRE_TIME}); - const authHeader = `${deviceId}:${keygrip.sign(deviceId)};abTests=${encodedAbTests}:${keygrip.sign(encodedAbTests)}`; - const responseJson = { - ok: "User created", - sentryPublicDSN: config.sentryPublicDSN, - abTests: userAbTests, - authHeader, - isOwner: params.isOwner, - accountId, - }; - // FIXME: I think there's a JSON sendResponse equivalent - simpleResponse(res, JSON.stringify(responseJson), 200); -} - - -app.post("/api/login", function(req, res) { - const vars = req.body; - let deviceInfo = {}; - try { - deviceInfo = JSON.parse(vars.deviceInfo); - } catch (e) { - if (e instanceof SyntaxError) { - // JSON isn't valid - deviceInfo = {}; - } else { - throw e; - } - } - if (!vars.secret) { - mozlog.error("bad-api-login", {msg: "Bad login request", vars: JSON.stringify(vars, null, " ")}); - sendRavenMessage(req, "Attempted to login without secret"); - simpleResponse(res, "Bad request", 400); - return; - } - checkLogin(vars.deviceId, vars.secret, deviceInfo.addonVersion).then((userAbTests) => { - if (userAbTests) { - const sendParams = { - deviceId: vars.deviceId, - userAbTests, - }; - let sendParamsPromise = Promise.resolve(sendParams); - retrieveAccount(vars.deviceId).then((accountId) => { - return sendParams.accountId = accountId; - }).then((accountId) => { - if (vars.ownershipCheck) { - - sendParamsPromise = Shot.checkOwnership(vars.ownershipCheck, vars.deviceId, accountId).then((isOwner) => { - sendParams.isOwner = isOwner; - return sendParams; - }); - } - sendParamsPromise.then((params) => { - sendAuthInfo(req, res, params); - }).catch((error) => { - errorResponse(res, "Error checking ownership", error); - }); - }).catch((error) => { - errorResponse(res, "Error retrieving account", error); - }); - if (config.gaId) { - const userAnalytics = ua(config.gaId, vars.deviceId, {strictCidFormat: false}); - userAnalytics.event({ - ec: "server", - ea: "api-login", - ua: req.headers["user-agent"], - ni: true, - }).send(); - } - } else if (!userAbTests) { - simpleResponse(res, '{"error": "No such user"}', 404); - } else { - sendRavenMessage(req, "Invalid login"); - simpleResponse(res, '{"error": "Invalid login"}', 401); - } - }).catch(function(err) { - errorResponse(res, JSON.stringify({"error": `Error in login: ${err}`}), err); - }); -}); - -app.post("/api/set-login-cookie", function(req, res) { - if (!req.deviceId) { - sendRavenMessage(req, "Attempt to set login cookie without authentication"); - simpleResponse(res, "Not logged in", 401); - return; - } - sendAuthInfo(req, res, { - deviceId: req.deviceId, - accountId: req.accountId, - userAbTests: req.abTests, - }); -}); - -/** This endpoint is used by the site to confirm if the cookie was set */ -app.get("/api/check-login-cookie", function(req, res) { - if (req.deviceId) { - simpleResponse(res, "Login OK", 200); - } else { - simpleResponse(res, "No credentials available", 401); - } -}); - -app.put("/data/:id/:domain", - upload.fields([{name: "blob", maxCount: 1}, {name: "thumbnail", maxCount: 1}]), - function(req, res) { - const slowResponse = config.testing.slowResponse; - const failSometimes = config.testing.failSometimes; - if (failSometimes && Math.floor(Math.random() * failSometimes)) { - console.log("Artificially making request fail"); // eslint-disable-line no-console - res.status(500); - res.end(); - return; - } - let bodyObj = []; - if (req.body.shot && req.files) { - bodyObj = JSON.parse(req.body.shot); - const clipId = Object.getOwnPropertyNames(bodyObj.clips)[0]; - let b64 = req.files.blob[0].buffer.toString("base64"); - let contentType = req.files.blob[0].mimetype; - if (contentType !== "image/png" && contentType !== "image/jpeg") { - // Force PNG as a fallback - mozlog.warn("invalid-upload-content-type", {contentType}); - contentType = "image/png"; - } - b64 = `data:${contentType};base64,${b64}`; - bodyObj.clips[clipId].image.url = b64; - - if (req.files.thumbnail) { - const encodedThumbnail = req.files.thumbnail[0].buffer.toString("base64"); - bodyObj.thumbnail = `data:image/png;base64,${encodedThumbnail}`; - } - } else if (req.body) { - bodyObj = req.body; - } - if (typeof bodyObj !== "object") { - throw new Error(`Got unexpected req.body type: ${typeof bodyObj}`); - } - const shotId = `${req.params.id}/${req.params.domain}`; - if (!req.deviceId) { - mozlog.warn("put-without-auth", {msg: "Attempted to PUT without logging in", url: req.url}); - sendRavenMessage(req, "Attempt PUT without authentication"); - simpleResponse(res, "Not logged in", 401); - return; - } - const shot = new Shot(req.deviceId, req.backend, shotId, bodyObj); - const match = /Firefox\/(\d+)\./.exec(req.headers["user-agent"] || ""); - if (match) { - shot.firefoxMajorVersion = parseInt(match[1], 10); - } - let responseDelay = Promise.resolve(); - if (slowResponse) { - responseDelay = new Promise((resolve) => { - setTimeout(resolve, slowResponse); - }); - } - responseDelay.then(() => { - return shot.insert(); - }).then((inserted) => { - if (!inserted) { - return shot.update(); - } - return inserted; - }).then((commands) => { - if (!commands) { - mozlog.warn("invalid-put-update", {msg: "Attempt to PUT to existing shot by non-owner", ip: req.ip}); - simpleResponse(res, "No shot updated", 403); - return; - } - Watchdog.submit(shot); - commands = commands || []; - simpleResponse(res, JSON.stringify({updates: commands.filter((x) => !!x)}), 200); - }).catch((err) => { - errorResponse(res, "Error saving Object:", err); - }); -}); - -app.get("/data/:id/:domain", function(req, res) { - if (!req.deviceId) { - res.status(404).send("Not found"); - return; - } - const shotId = `${req.params.id}/${req.params.domain}`; - // FIXME: maybe we should allow for accountId here too: - Shot.getRawValue(shotId, req.deviceId).then((data) => { - if (!data) { - simpleResponse(res, "No such shot", 404); - } else { - let value = data.value; - value = JSON.parse(value); - value = JSON.stringify(value); - if ("format" in req.query) { - value = JSON.stringify(JSON.parse(value), null, " "); - } - res.header("Content-Type", "application/json"); - res.send(value); - } - }).catch(function(err) { - errorResponse(res, "Error serving data:", err); - }); -}); - -app.post("/api/delete-shot", function(req, res) { - if (!(req.deviceId || req.accountId)) { - sendRavenMessage(req, "Attempt to delete shot without login"); - simpleResponse(res, "Not logged in", 401); - return; - } - Shot.deleteShot(req.backend, req.body.id, req.deviceId, req.accountId).then((result) => { - if (result) { - simpleResponse(res, "ok", 200); - } else { - sendRavenMessage(req, "Attempt to delete shot that does not exist"); - simpleResponse(res, "No such shot", 404); - } - }).catch((err) => { - errorResponse(res, "Error: could not delete shot", err); - }); -}); - -app.post("/api/disconnect-device", function(req, res) { - if (!(req.deviceId || req.accountId)) { - sendRavenMessage(req, "Attempt to disconnect without login"); - simpleResponse(res, "Not logged in", 401); - return; - } - disconnectDevice(req.deviceId).then((result) => { - const keygrip = dbschema.getKeygrip("auth"); - const cookies = new Cookies(req, res, {keys: keygrip}); - cookies.set("accountid"); - cookies.set("accountid.sig"); - simpleResponse(res, "ok", 200); - }).catch((err) => { - errorResponse(res, "Error: could not disconnect", err); - }); -}); - -app.post("/api/set-title/:id/:domain", function(req, res) { - const shotId = `${req.params.id}/${req.params.domain}`; - const userTitle = req.body.title; - if (userTitle === undefined) { - simpleResponse(res, "No title given", 400); - return; - } - if (!(req.deviceId || req.accountId)) { - sendRavenMessage(req, "Attempt to set title on shot without login"); - simpleResponse(res, "Not logged in", 401); - return; - } - Shot.get(req.backend, shotId, req.deviceId, req.accountId).then((shot) => { - if (!shot) { - simpleResponse(res, "No such shot", 404); - return null; - } - - if (!shot.isOwner) { - simpleResponse(res, "Attempt to set title on shot user doesn't own", 403); - return null; - } - - shot.userTitle = userTitle; - if (shot.openGraph && shot.openGraph.title) { - shot.openGraph.title = userTitle; - } - return shot.update(); - }).then((updated) => { - if (updated) { - simpleResponse(res, "Updated", 200); - } - }).catch((err) => { - errorResponse(res, "Error updating title", err); - }); -}); - -app.post("/api/save-edit", function(req, res) { - const vars = req.body; - if (!(req.deviceId || req.accountId)) { - sendRavenMessage(req, "Attempt to edit shot without login"); - simpleResponse(res, "Not logged in", 401); - return; - } - const id = vars.shotId; - const url = vars.url; - const width = vars.x; - const height = vars.y; - let thumbnail = vars.thumbnail || null; - if (!isValidClipImageUrl(url)) { - sendRavenMessage(req, "Attempt to edit shot to set invalid clip url."); - simpleResponse(res, "Invalid shot url.", 400); - return; - } - if (thumbnail && !isValidClipImageUrl(thumbnail)) { - thumbnail = null; - } - Shot.get(req.backend, id, req.deviceId, req.accountId).then((shot) => { - if (!shot) { - sendRavenMessage(req, "Attempt to edit shot that does not exist"); - simpleResponse(res, "No such shot", 404); - return null; - } - if (!shot.isOwner) { - simpleResponse(res, "Attempt to edit shot user doesn't own", 403); - return null; - } - const name = shot.clipNames()[0]; - shot.getClip(name).image.url = url; - shot.getClip(name).image.dimensions.x = width; - shot.getClip(name).image.dimensions.y = height; - shot.thumbnail = thumbnail; - return shot.update().then(updated => ({updated, shot})); - }).then((result) => { - if (result) { - Watchdog.submit(result.shot); - simpleResponse(res, "Updated", 200); - } - }).catch((err) => { - errorResponse(res, "Error updating image", err); - }); -}); - -app.post("/api/set-expiration", function(req, res) { - if (!(req.deviceId || req.accountId)) { - sendRavenMessage(req, "Attempt to set expiration without login"); - simpleResponse(res, "Not logged in", 401); - return; - } - const shotId = req.body.id; - const expiration = parseInt(req.body.expiration, 10); - if (expiration < 0) { - sendRavenMessage(req, "Attempt negative expiration", {extra: {expiration}}); - simpleResponse(res, "Error: negative expiration", 400); - return; - } - if (isNaN(expiration)) { - sendRavenMessage(req, "Set expiration to non-number", {extra: {rawExpiration: req.body.expiration}}); - simpleResponse(res, `Error: bad expiration (${req.body.expiration})`, 400); - return; - } - Shot.setExpiration(req.backend, shotId, req.deviceId, expiration, req.accountId).then((result) => { - if (result) { - simpleResponse(res, "ok", 200); - } else { - sendRavenMessage(req, "Attempt to set expiration on shot that does not exist"); - simpleResponse(res, "No such shot", 404); - } - }).catch((err) => { - errorResponse(res, "Error: could not set expiration on shot", err); - }); -}); - -function serveImage(req, res) { - const embedded = req.query.embedded; - const download = req.query.download; - const sig = req.query.sig; - Shot.getRawBytesForClip( - req.params.imageid - ).then((obj) => { - if (obj === null) { - notFound(req, res); - } else { - let localReferrer = false; - if (req.headers.referer) { - localReferrer = req.headers.referer.startsWith(req.backend); - } - if (!localReferrer) { - const hasher = require("crypto").createHash("sha1"); - hasher.update(req.params.imageid); - const hashedId = hasher.digest("hex").substr(0, 15); - const analyticsUrl = `/images/${embedded ? "embedded/" : ""}hash${encodeURIComponent(hashedId)}`; - let analytics = req.userAnalytics; - if (!analytics) { - analytics = ua(config.gaId); - } - const view = embedded ? "direct-view-embedded" : "direct-view"; - const el = view + (obj.ownerId === req.deviceId ? "-owner" : "-non-owner"); - let documentReferrer = null; - if (req.headers.referer) { - try { - const parsed = urlParse(req.headers.referer); - documentReferrer = `${parsed.protocol}//${parsed.host}`; - } catch (e) { - // We ignore any errors parsing this header - } - } - analytics.pageview({ - dp: analyticsUrl, - dh: req.backend, - documentReferrer, - ua: req.headers["user-agent"], - }).event({ - ec: "web", - ea: "visit", - el, - }).send(); - } - let contentType = obj.contentType; - if (contentType !== "image/png" && contentType !== "image/jpeg") { - contentType = "image/png"; - } - res.header("Content-Type", contentType); - if (download) { - if (dbschema.getKeygrip("download-url").verify(new Buffer(`${req.path} ${download}`, "utf8"), sig)) { - res.header("Content-Disposition", contentDisposition(download)); - } - } - setDailyCache(res); - res.header("Access-Control-Allow-Origin", `${req.protocol}://${config.siteOrigin}`); - res.status(200); - res.send(obj.data); - } - }).catch((e) => { - errorResponse(res, "Error getting image from database:", e); - }); -} - -app.get("/images/:imageid", serveImage); -app.get("/images/:imageid/:filename", serveImage); - -app.get("/__version__", function(req, res) { - dbschema.getCurrentDbPatchLevel().then(level => { - const response = { - source: "https://github.com/mozilla-services/screenshots/", - description: "Firefox Screenshots application server", - version: selfPackage.version, - buildDate: buildTime, - commit: linker.getGitRevision(), - contentOrigin: config.contentOrigin, - commitLog: `https://github.com/mozilla-services/screenshots/commits/${linker.getGitRevision()}`, - unincludedCommits: `https://github.com/mozilla-services/screenshots/compare/${linker.getGitRevision()}...master`, - dbSchemaVersion: level, - dbSchemaVersionJS: dbschema.MAX_DB_LEVEL, - }; - res.header("Content-Type", "application/json; charset=utf-8"); - res.send(JSON.stringify(response, null, " ")); - }).catch((e) => { - errorResponse(res, "Error fetching version data: ", e); - }); -}); - -app.get("/contribute.json", function(req, res) { - const data = { - name: "Firefox Screenshots", - description: "Firefox Screenshots is an add-on for Firefox and a service for screenshots", - repository: { - url: "https://github.com/mozilla-services/screenshots/", - license: "MPL2", - tests: "https://circleci.com/gh/mozilla-services/screenshots", - }, - participate: { - home: "https://github.com/mozilla-services/screenshots/", - irc: "irc://irc.mozilla.org/#screenshots", - "irc-contacts": ["ianbicking", "fzzzy"], - }, - bugs: { - list: "https://github.com/mozilla-services/screenshots/issues", - report: "https://github.com/mozilla-services/screenshots/issues/new", - goodfirstbugs: "https://github.com/mozilla-services/screenshots/labels/good%20first%20bug", - }, - urls: { - prod: "https://screenshots.firefox.com", - stage: "https://screenshots.stage.mozaws.net", - dev: "https://screenshots.dev.mozaws.net", - }, - keywords: [ - "javascript", - "node", - "express", - "react", - "postgresql", - "firefox", - ], - }; - res.header("Content-Type", "application/json; charset=utf-8"); - res.send(JSON.stringify(data, null, " ")); -}); - -app.get("/oembed", function(req, res) { - let url = req.query.url; - if (!url) { - simpleResponse(req, "No ?url given", 400); - return; - } - const format = req.query.format || "json"; - if (format !== "json") { - simpleResponse(res, "Only JSON OEmbed is supported", 501); - return; - } - let maxwidth = req.query.maxwidth || null; - if (maxwidth) { - maxwidth = parseInt(maxwidth, 10); - } - let maxheight = req.query.maxheight || null; - if (maxheight) { - maxheight = parseInt(maxheight, 10); - } - url = url.replace(/^http:\/\//i, "https://"); - const backend = req.backend.replace(/^http:\/\//i, "https://"); - if (!url.startsWith(backend)) { - simpleResponse(res, `Error: URL is not hosted here (${req.backend})`, 501); - return; - } - url = url.substr(backend.length); - const match = /^\/{0,255}([^/]{1,255})\/([^/]{1,255})/.exec(url); - if (!match) { - simpleResponse(res, "Error: not a Shot url", 404); - return; - } - const shotId = match[1] + "/" + match[2]; - Shot.get(req.backend, shotId).then((shot) => { - if (!shot) { - notFound(req, res); - return; - } - const body = shot.oembedJson({maxheight, maxwidth}); - res.header("Content-Type", "application/json"); - res.send(body); - }).catch((e) => { - errorResponse(res, "Error fetching shot for OEmbed:", e); - }); -}); - -const END_POINT_SEPARATOR = "|"; - -// Get OAuth client params for the client-side authorization flow. -app.get("/api/fxa-oauth/login/*", async function(req, res, next) { - try { - const stateBytes = await randomBytes(32); - let state = stateBytes.toString("hex"); - let stateId = null; - - const cookies = new Cookies(req, res, {keys: dbschema.getKeygrip("fxa-oauth")}); - - if (req.deviceId) { - if (cookies.get("fxaState")) { - // Remove invalid fxaState cookie in favor of using deviceId as StateId - cookies.set("fxaState"); - cookies.set("fxaState.sig"); - } - stateId = req.deviceId; - } else { - const uuidPromise = util.promisify(genUuid.generate); - const uuid = await uuidPromise(genUuid.V_RANDOM); - stateId = uuid.toString(); - - cookies.set("fxaState", stateId, {signed: true}); - } - - const inserted = await setState(stateId, state); - if (!inserted) { - throw errors.dupeLogin(); - } - - const redirectUri = `${req.backend}/api/fxa-oauth/confirm-login`; - // Use state to store post-auth redirect page inside the 'state' - // request parameter sent to FxA authorization API - // FxA returns state parameter as is upon redirection to url given in - // redirectUri. - state = `${state}${END_POINT_SEPARATOR}${req.params[0]}`; - const profile = "profile"; - res.redirect(`${config.fxa.oAuthServer}/authorization?client_id=${encodeURIComponent(config.fxa.clientId)}&redirect_uri=${encodeURIComponent(redirectUri)}&state=${encodeURIComponent(state)}&scope=${encodeURIComponent(profile)}`); - } catch (err) { - mozlog.warn("fxa-oauth-login-failed", {err}); - next(err); - } -}); - -app.get("/api/fxa-oauth/confirm-login", async function(req, res, next) { - if (!req.query) { - next(errors.missingParams()); - return; - } - const { code, state } = req.query; - // Retrieve endpoint and 32-bit value used to verify if - // the redirect is authentic. Use endpoint to redirect to page - // where the login request was initiated from. - const data = state.split(END_POINT_SEPARATOR, 2); - const endpoint = data[1]; - - const cookies = new Cookies(req, res, {keys: dbschema.getKeygrip("fxa-oauth")}); - - let stateId = cookies.get("fxaState"); - if (stateId && (!/^[a-zA-Z0-9_-]{1,255}$/.test(stateId))) { - const err = new Error("Bad stateId in confirm-login"); - next(err); - return; - } - stateId = stateId || req.deviceId; - - try { - const isValid = await checkState(stateId, data[0]); - if (!isValid) { - throw errors.badState(); - } - const { access_token: accessToken } = await tradeCode(code); - const { uid: accountId } = await getAccountId(accessToken); - - await registerAccount(req.deviceId, accountId, accessToken); - const { avatar, displayName, email } = await fetchProfileData(accessToken); - await saveProfileData(accountId, avatar, displayName, email); - - if (config.gaId) { - const analytics = ua(config.gaId); - analytics.event({ - ec: "server", - ea: "fxa-login", - ua: req.headers["user-agent"], - }).send(); - } - sendAccountIdCookie(req, res, accountId); - const pageUri = endpoint ? "/" + endpoint : "/"; - res.redirect(pageUri); - } catch (err) { - mozlog.warn("fxa-oauth-confirm-login-failed", {err}); - next(err); - } -}); - -app.get("/api/has-shots", async function(req, res) { - if (!(req.deviceId || req.accountId)) { - res.status(401).send("Authentication required"); - } - const hasShots = await Shot.userHasShots(req.deviceId, req.accountId); - res.send(hasShots); -}); - -app.post("/watchdog/:submissionId", function(req, res) { - Watchdog.handleResult(req); - res.end(); -}); - -app.use((req, res, next) => { - genUuid.generate(genUuid.V_RANDOM, function(err, uuid) { - if (!err) { - let dsn = config.sentryPublicDSN; - if (dsn) { - dsn = dsn.replace(/^https?:\/\/[^@]*@/, "").replace(/\/.*/, ""); - } else { - dsn = ""; - } - req.cspNonce = uuid; - // This should be a temporary workaround for - // https://github.com/mozilla-services/screenshots/issues/4281 - // (https://bugzilla.mozilla.org/show_bug.cgi?id=1267027). - // TODO: remove this when bug 1267027 is resolved. - const DO_NOT_SEND_CSP = process.env.NODE_ENV === "dev" && process.env.DO_NOT_SEND_CSP && process.env.DO_NOT_SEND_CSP === "true"; - if (!DO_NOT_SEND_CSP) { - res.header( - "Content-Security-Policy", - `default-src 'self'; img-src 'self' ${FXA_SERVER} ${FXA_USER_CONTENT} www.google-analytics.com ${SITE_CDN} ${CONTENT_CDN} ${CONTENT_NAME} data:; script-src 'self' ${SITE_CDN} www.google-analytics.com 'nonce-${uuid}'; style-src 'self' ${SITE_CDN} 'unsafe-inline' https://code.cdn.mozilla.net; connect-src 'self' ${SITE_CDN} ${CONTENT_CDN} www.google-analytics.com ${dsn}; font-src https://code.cdn.mozilla.net; frame-ancestors 'none'; object-src 'none';`); - } - res.header("X-Frame-Options", "DENY"); - next(); - } else { - errorResponse(res, "Error creating nonce:", err); - } - }); -}); - -app.use("/homepage", express.static(path.join(__dirname, "static/homepage"), { - index: false, -})); - -// This is a minimal heartbeat that only indicates the server process is up and responding -app.get("/__lbheartbeat__", function(req, res) { - res.send("OK"); -}); - -// This tests if the server is really working -app.get("/__heartbeat__", function(req, res) { - dbschema.connectionOK().then((ok) => { - if (!ok) { - statsd.increment("heartbeat.fail"); - res.status(500).send("schema fail"); - } else { - statsd.increment("heartbeat.pass"); - res.send("OK"); - } - }).catch((error) => { - statsd.increment("heartbeat.fail"); - res.status(500).send("database fail"); - }); -}); - -if (!config.disableMetrics) { - app.use("/metrics", require("./pages/metrics/server").app); -} - -app.use("/shots", require("./pages/shotindex/server").app); - -app.use("/export", require("./pages/export/server").app); - -app.use("/leave-screenshots", require("./pages/leave-screenshots/server").app); - -app.use("/creating", require("./pages/creating/server").app); - -app.use("/settings", require("./pages/settings/server").app); - -app.use("/hosting-shutdown", require("./pages/hosting-shutdown/server").app); - -app.use("/", require("./pages/shot/server").app); - -app.use("/", require("./pages/homepage/server").app); - -let httpsCredentials; -if (config.localhostSsl) { - // To generate trusted keys on Mac, see: https://certsimple.com/blog/localhost-ssl-fix - const key = `${process.env.HOME}/.localhost-ssl/key.pem`; - const cert = `${process.env.HOME}/.localhost-ssl/cert.pem`; - if (!(existsSync(key) && existsSync(cert))) { - /* eslint-disable no-console */ - console.log("Error: to use localhost SSL/HTTPS you must create a key.pem and cert.pem file"); - console.log(" These must be located in:"); - console.log(` ${key}`); - console.log(` ${cert}`); - console.log(" You can find instructions on creating these files here:"); - console.log(" https://certsimple.com/blog/localhost-ssl-fix"); - /* eslint-enable no-console */ - process.exit(2); - } - httpsCredentials = { - key: readFileSync(key), - cert: readFileSync(cert), - }; -} - -linker.init().then(() => { - let server; - let scheme; - if (httpsCredentials) { - server = https.createServer(httpsCredentials, app); - scheme = "https"; - } else { - server = http.createServer(app); - scheme = "http"; - } - server.listen(config.port); - mozlog.info("server-started", {msg: `server listening on ${scheme}://localhost:${config.port}/`}); -}).catch((err) => { - mozlog.error("git-revision-error", {msg: "Error getting git revision", error: err, stack: err.stack}); -}); - -require("./jobs").start(); - -addRavenErrorHandler(app); - -app.use(function(err, req, res, next) { - if (err.isAppError) { - const { statusCode, headers, payload } = err.output; - res.status(statusCode); - if (headers) { - res.header(headers); - } - res.send(payload); - return; - } - if (err.type === "entity.too.large") { - mozlog.info("entity-too-large", { - length: err.length, - limit: err.limit, - expected: err.expected, - }); - res.status(err.statusCode); - res.type("text"); - res.send(res.message); - return; - } - if (err.code === "EBADCSRFTOKEN") { - csrfErrorResponse(err, req, res); - return; - } - errorResponse(res, "General error:", err); -}); - -/* General 404 handler: */ -app.use(function(req, res, next) { - notFound(req, res); -}); diff --git a/server/src/servershot.js b/server/src/servershot.js deleted file mode 100644 index fa8a41b216..0000000000 --- a/server/src/servershot.js +++ /dev/null @@ -1,1077 +0,0 @@ -const { AbstractShot } = require("../shared/shot"); -const renderOembedString = require("./oembed-view.js").renderString; -const db = require("./db"); -const uuid = require("uuid"); -const linker = require("./linker"); -const config = require("./config").getProperties(); -const fs = require("fs"); -const mozlog = require("./logging").mozlog("servershot"); -const validUrl = require("valid-url"); - -const SEARCHABLE_VERSION = 1; - -const PNG_HEADER_BASE64 = "iVBORw0KGgo="; -const PNG_HEADER = Buffer.from(PNG_HEADER_BASE64, "base64"); -const JPEG_HEADER_BASE64 = "/9g="; -const JPEG_HEADER = Buffer.from(JPEG_HEADER_BASE64, "base64").slice(0, 2); - - -const SHOTS_PER_PAGE = 24; - -function assertPngOrJpeg(dataUrl) { - const pngHeader = "data:image/png;base64,"; - const jpegHeader = "data:image/jpeg;base64,"; - if (!(dataUrl.startsWith(pngHeader) || dataUrl.startsWith(jpegHeader))) { - mozlog.warn("invalid-data-url", {msg: "Invalid data: URL submitted", prefix: dataUrl.substr(0, jpegHeader.length + 10)}); - throw new Error("invalid data url"); - } - // only decode enough to get the header - // we're lucky that 9 bytes is exactly 12 base64 characters - if (dataUrl.startsWith(pngHeader)) { - const base64Header = dataUrl.substr(pngHeader.length, PNG_HEADER_BASE64.length); - if (base64Header.length < PNG_HEADER_BASE64.length) { - mozlog.warn("invalid-data-image", {msg: "Invalid PNG image submitted", prefix: dataUrl.substr(0, pngHeader.length + PNG_HEADER_BASE64.length)}); - throw new Error("invalid image"); - } - const header = Buffer.from(base64Header, "base64"); // 9 bytes - if (!PNG_HEADER.equals(header.slice(0, PNG_HEADER.length))) { - mozlog.warn("invalid-data-image-decoded", {msg: "Invalid PNG image (after base64 decoding)"}); - throw new Error("invalid png"); - } - } else { - const base64Header = dataUrl.substr(jpegHeader.length, JPEG_HEADER_BASE64.length); - if (base64Header.length < JPEG_HEADER_BASE64.length) { - mozlog.warn("invalid-data-image", {msg: "Invalid JPEG image submitted", prefix: dataUrl.substr(0, jpegHeader.length + JPEG_HEADER_BASE64.length)}); - throw new Error("invalid image"); - } - const header = Buffer.from(base64Header, "base64"); // 9 bytes - if (!JPEG_HEADER.equals(header.slice(0, JPEG_HEADER.length))) { - mozlog.warn("invalid-data-image-decoded", {msg: "Invalid JPEG image (after base64 decoding)"}); - throw new Error("invalid jpeg"); - } - } -} - -let s3bucket; -let put; -let get; -let del; - -if (!config.useS3) { - if (!fs.existsSync("data")) { - fs.mkdirSync("data"); - } - - get = (uid, contentType) => { - if (uid.includes("/") && uid.includes(".")) { - return Promise.reject("Invalid uid"); - } - return new Promise((resolve, reject) => { - fs.readFile("data/" + uid, (err, data) => { - if (err) { - reject(err); - } else { - resolve({data, contentType}); - } - }); - }); - }; - put = (uid, body, comment) => { - if (uid.includes("/") && uid.includes(".")) { - return Promise.reject("Invalid uid"); - } - return new Promise((resolve, reject) => { - fs.writeFile("data/" + uid, body, (err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - }; - - del = (uid) => { - if (uid.includes("/") && uid.includes(".")) { - return Promise.reject("Invalid uid"); - } - return new Promise((resolve, reject) => { - fs.unlink("data/" + uid, function(err) { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - }; -} else { - const AWS = require("aws-sdk"); - - s3bucket = new AWS.S3({params: {Bucket: config.s3BucketName}}); - - get = (uid, contentType) => { - return new Promise((resolve, reject) => { - s3bucket.createBucket(() => { - const params = {Key: uid}; - s3bucket.getObject(params, function(err, data) { - if (err) { - mozlog.error("error-downloading-data", {err}); - reject(err); - } else { - resolve({data: data.Body, contentType}); - } - }); - }); - }); - }; - - put = (uid, body, comment) => { - return new Promise((resolve, reject) => { - s3bucket.createBucket(() => { - const params = {Key: uid, Body: body, ContentType: "image/png"}; - s3bucket.upload(params, function(err, result) { - if (err) { - reject(err); - mozlog.error("error-uploading-data", {comment, uid, err}); - } else { - resolve(); - } - }); - }); - }); - }; - - del = (uid) => { - return new Promise((resolve, reject) => { - s3bucket.createBucket(() => { - const params = {Key: uid}; - s3bucket.deleteObject(params, function(err, result) { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - }); - }; -} - -class Shot extends AbstractShot { - - constructor(ownerId, backend, id, attrs) { - super(backend, id, attrs); - this.ownerId = ownerId; - } - - oembedJson({maxheight, maxwidth}) { - const body = renderOembedString({shot: this, maxheight, maxwidth, backend: this.backend}); - return { - // Attributes we could set, but don't (yet): - // author_name: "", - // author_url: "", - // cache_age: "", - // thumbnail_url: "", - // thumbnail_width: "", - // thumbnail_height: "", - type: "rich", - version: "1.0", - title: this.title, - provider_name: "Firefox Screenshots", - provider_url: this.backend, - html: body, - // I don't really understand how these relate to maxheight/maxwidth, or how we should set them: - height: 300, - width: 400, - }; - } - - get contentUrl() { - return "//" + config.contentOrigin + "/content/" + this.id; - } - - insert() { - return db.transaction((client) => { - return db.queryWithClient( - client, "SELECT id FROM data WHERE id = $1", [this.id] - ).then((rows) => { - if (rows.rowCount) { - // duplicate key - return false; - } - - const clipRewrites = new ClipRewrites(this); - clipRewrites.rewriteShotUrls(); - const oks = clipRewrites.commands(); - const json = this.toJSON(); - const title = this.title; - oks.push({setHead: null}); - oks.push({setBody: null}); - // Make sure you update this (9) if you add a column to the query below: - const searchable = this._makeSearchableText(9); - const url = json.fullUrl || json.url || json.origin; - return db.queryWithClient( - client, - `INSERT INTO data (id, deviceid, value, url, title, firefox_major_version, firefox_channel, searchable_version, searchable_text) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, ${searchable.query})`, - [this.id, this.ownerId, JSON.stringify(json), url, title, this.firefoxMajorVersion || null, this.firefoxChannel || null, searchable.version].concat(searchable.args) - ).then((result) => { - return clipRewrites.commit(client); - }).then(() => { - return oks; - }).catch((err) => { - if (err.code === "23505") { - // This is a duplicate key error, means the insert failed - clipRewrites.revertShotUrls(); - return false; - } - throw err; - }); - }); - }); - } - - update() { - const clipRewrites = new ClipRewrites(this); - clipRewrites.rewriteShotUrls(); - const oks = clipRewrites.commands(); - const json = this.toJSON(); - return db.transaction((client) => { - const searchable = this._makeSearchableText(7); - const promise = db.queryWithClient( - client, - `UPDATE data SET value = $1, url = $2, title=$3, searchable_version = $4, searchable_text = ${searchable.query} - WHERE id = $5 AND deviceid = $6`, - [JSON.stringify(json), this.url, this.title, searchable.version, this.id, this.ownerId].concat(searchable.args) - ); - return promise.then((result) => { - if (!result.rowCount) { - clipRewrites.revertShotUrls(); - return false; - } - return clipRewrites.commit(client).then(() => { - return true; - }); - }).then((updated) => { - return updated ? oks : null; - }); - }); - } - - upgradeSearch() { - const searchable = this._makeSearchableText(3); - return db.transaction((client) => { - return db.queryWithClient( - client, - `UPDATE data SET searchable_version = $1, searchable_text = ${searchable.query} - WHERE id = $2`, - [searchable.version, this.id].concat(searchable.args) - ); - }); - } - - _makeSearchableText(argStart) { - const queryParts = []; - const texts = []; - function addText(t) { - texts.push(t); - return "$" + (texts.length + argStart - 1); - } - function addWeight(t, weight, name) { - if (Array.isArray(t)) { - t = t.filter((i) => i).join(" "); - } - if (!t) { - return; - } - if (!["A", "B", "C", "D"].includes(weight)) { - throw new Error("Bad weight, should be A, B, C, or D"); - } - queryParts.push(`setweight(to_tsvector(${addText(t)}), '${weight}') /* ${name} */`); - } - if (this.url) { - const domain = this.url.replace(/^.{0,4000}:/, "").replace(/\/.{0,4000}$/, ""); - addWeight(domain, "B", "domain"); - } - addWeight(this.title, "A", "title"); - if (this.openGraph) { - const openGraphProps = ` - site_name description - article:author article:section article:tag - book:author book:tag - profile:first_name profile:back_name profile:username - `.split(/\s+/g); - addWeight(openGraphProps.map((n) => this.openGraph[n]), "B", "openGraph"); - } - if (this.twitterCard) { - const twitterProps = ` - site title description - `.split(/\s+/g); - addWeight(twitterProps.map((n) => this.twitterCard[n]), "A", "twitterCard"); - for (const clipId of this.clipNames()) { - const clip = this.getClip(clipId); - addWeight(clip.image && clip.image.text, "A", "clip text"); - } - } - return { - query: queryParts.join(" || "), - args: texts, - // Update this version if you update the algorithm: - version: SEARCHABLE_VERSION, - }; - } - -} - -Shot.getRawBytesForClip = function(uid) { - return db.select( - `SELECT images.url, images.contenttype, data.deviceid, devices.accountid - FROM devices, images - JOIN data ON images.shotid = data.id - WHERE images.id = $1 - AND (data.expire_time IS NULL OR data.expire_time > NOW()) - AND data.block_type = 'none' - AND data.deviceid = devices.id - AND NOT data.deleted`, [uid] - ).then((rows) => { - if (!rows.length) { - return null; - } - return get(uid, rows[0].contenttype) - .then(result => { - result.ownerId = rows[0].deviceid; - result.accountId = rows[0].accountid; - return result; - }); - }); -}; - -exports.Shot = Shot; - -class ServerClip extends AbstractShot.prototype.Clip { - constructor(shot, id, json) { - super(shot, id, json); - if (this.isDataUrl()) { - assertPngOrJpeg(json.image.url); - } - } - - imageBinary() { - if (!(this.image && this.image.url)) { - throw new Error("Not an image clip"); - } - const url = this.image.url; - const match = (/^data:([^;]*);base64,/).exec(url); - if (!match) { - if (!url) { - mozlog.warn("empty-clip-url", {msg: "Submitted with empty clip URL"}); - throw new Error("Empty clip URL"); - } else { - mozlog.warn("bad-clip-url", {msg: "Submitted with bad clip URL", urlPrefix: url.substr(0, 10) + "..."}); - throw new Error("Bad clip URL"); - } - } - let imageData = url.substr(match[0].length); - imageData = new Buffer(imageData, "base64"); - return { - contentType: match[1], - data: imageData, - }; - } - - setUrlFromBinary(binaryData) { - let url = "data:" + binaryData.contentType + ";base64,"; - url += binaryData.data.toString("base64"); - this.image.url = url; - } -} - -Shot.prototype.Clip = ServerClip; - -Shot.get = async function(backend, id, deviceId, accountId) { - if (!id) { - throw new Error("Empty id: " + id); - } - - const rawValue = await Shot.getRawValue(id); - if (!rawValue) { - return null; - } - const json = JSON.parse(rawValue.value); - const jsonTitle = json.userTitle || (json.openGraph && json.openGraph.title) || json.docTitle; - json.docTitle = jsonTitle || rawValue.title; - if (!json.url && rawValue.url) { - json.url = rawValue.url; - } - - const shot = new Shot(rawValue.deviceId, backend, id, json); - shot.isOwner = rawValue.deviceId === deviceId || (accountId && rawValue.accountId === accountId); - shot.urlIfDeleted = rawValue.url; - shot.accountId = rawValue.accountId; - shot.expireTime = rawValue.expireTime; - shot.deleted = rawValue.deleted; - shot.blockType = rawValue.blockType; - return shot; -}; - -Shot.getRawValue = function(id, deviceId, accountId) { - if (!id) { - throw new Error("Empty id: " + id); - } - let query = `SELECT value, deviceid, url, title, expire_time, deleted, block_type, devices.accountid - FROM data, devices WHERE data.deviceid = devices.id AND data.id = $1`; - const params = [id]; - if (accountId) { - query += ` AND devices.accountid = $2`; - params.push(accountId); - } else if (deviceId) { - query += ` AND deviceid = $2`; - params.push(deviceId); - } - return db.select( - query, - params - ).then((rows) => { - if (!rows.length) { - return null; - } - const row = rows[0]; - return { - deviceId: row.deviceid, - value: row.value, - url: row.url, - title: row.title, - expireTime: row.expire_time, - deleted: row.deleted, - blockType: row.block_type, - accountId: row.accountid, - }; - }); -}; - -Shot.checkOwnership = function(shotId, deviceId, accountId) { - return db.select( - `SELECT data.id - FROM data, devices - WHERE data.id = $1 AND (devices.id = $2 OR devices.accountid = $3) - AND data.deviceid = devices.id - `, - [shotId, deviceId, accountId] - ).then((rows) => { - return !!rows.length; - }); -}; - -Shot.emptyShotsPage = { - pageNumber: 1, - totalShots: 0, - shotsPerPage: SHOTS_PER_PAGE, - shots: null, -}; - -Shot.getShotsForDevice = function(backend, deviceId, accountId, searchQuery, pageNumber, shotsPerPage) { - shotsPerPage = shotsPerPage || SHOTS_PER_PAGE; - if (!deviceId && !accountId) { - throw new Error("Empty deviceId: " + deviceId); - } - if (pageNumber < 1) { - pageNumber = 1; - } - const shotsPage = { - pageNumber, - shotsPerPage, - }; - let deviceIds = []; - let likeQuery = ""; - - const idParamPositions = (offset, ids) => { - return ids.map((_, idx) => { - return `$${offset + idx + 1}`; - }); - }; - - // accountId is null if not set, treated as NULL in the SQL query - return db.select( - `SELECT DISTINCT devices.id - FROM devices - WHERE devices.id = $1 OR devices.accountid = $2 - `, - [deviceId, accountId] - ).then(rows => { - deviceIds = rows.map(x => x.id); - }).then(() => { - if (!deviceIds.length) { - shotsPage.totalShots = 0; - return [{totalshots: 0}]; - } - - let idNums, sql, args; - - if (searchQuery) { - idNums = idParamPositions(2, deviceIds); - sql = ` - SELECT COUNT(data.id) AS totalShots - FROM data, plainto_tsquery($1) AS query - WHERE data.deviceid IN (${idNums.join(", ")}) - AND NOT data.deleted - AND (expire_time IS NULL OR expire_time > NOW()) - AND (data.searchable_text @@ query - OR url ILIKE $2 - OR title ILIKE $2) - `; - likeQuery = "%" + searchQuery.replace(/%/g, "%%") + "%"; - args = [searchQuery, likeQuery].concat(deviceIds); - } else { - idNums = idParamPositions(0, deviceIds); - sql = ` - SELECT COUNT(data.id) AS totalShots - FROM data - WHERE data.deviceid IN (${idNums.join(", ")}) - AND NOT data.deleted - AND (expire_time IS NULL OR expire_time > NOW()) - `; - args = deviceIds; - } - return db.select(sql, args); - }).then(rows => { - if (!rows.length) { - shotsPage.totalShots = 0; - } else { - shotsPage.totalShots = rows[0].totalshots; - } - }).then(() => { - const offset = (pageNumber - 1) * shotsPerPage; - let sql, args, idNums; - if (!deviceIds.length) { - return []; - } - - if (searchQuery) { - idNums = idParamPositions(4, deviceIds); - sql = ` - SELECT data.id, data.value, data.deviceid, data.expire_time, ts_rank_cd(data.searchable_text, query) AS rank - FROM data, plainto_tsquery($1) AS query - WHERE data.deviceid IN (${idNums.join(", ")}) - AND NOT data.deleted - AND (expire_time IS NULL OR expire_time > NOW()) - AND (data.searchable_text @@ query - OR url ILIKE $2 - OR title ILIKE $2) - ORDER BY rank DESC, data.created DESC - LIMIT $3 OFFSET $4 - `; - args = [searchQuery, likeQuery, shotsPerPage, offset].concat(deviceIds); - } else { - idNums = idParamPositions(2, deviceIds); - sql = ` - SELECT data.id, data.value, data.deviceid, data.expire_time - FROM data - WHERE data.deviceid IN (${idNums.join(", ")}) - AND NOT data.deleted - AND (expire_time IS NULL OR expire_time > NOW()) - ORDER BY data.created DESC - LIMIT $1 OFFSET $2 - `; - args = [shotsPerPage, offset].concat(deviceIds); - } - return db.select(sql, args); - }).then((rows) => { - const result = []; - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - const json = JSON.parse(row.value); - if (json === null) { - mozlog.warn("error-parsing-json", { - deviceid: row.deviceid, - rowid: row.id, - rowvalue: row.value, - }); - } else { - let shot; - try { - shot = new Shot(row.deviceid, backend, row.id, json); - shot.expireTime = row.expire_time; - shot.isSynced = row.deviceid !== deviceId; - } catch (e) { - mozlog.warn("error-instantiating-shot", {err: e}); - continue; - } - result.push(shot); - } - } - shotsPage.shots = result; - return shotsPage; - }); -}; - -Shot.setExpiration = function(backend, shotId, deviceId, expiration, accountId) { - return db.select( - `SELECT devices.id - FROM data, devices - WHERE data.id = $1 AND (devices.id = $2 OR devices.accountid = $3) - AND data.deviceid = devices.id - `, - [shotId, deviceId, accountId] - ).then((rows) => { - if (!rows.length) { - return null; - } - const id = rows[0].id; - if (expiration === 0) { - return db.update( - `UPDATE data - SET expire_time = NULL - WHERE id = $1 - AND deviceid = $2 - `, - [shotId, id] - ); - } - if (typeof expiration !== "number") { - throw new Error("Bad expiration type"); - } else if (expiration < 0) { - throw new Error("Expiration less than zero"); - } - expiration = Math.floor(expiration / 1000); - return db.update( - `UPDATE data - SET expire_time = NOW() + ($1 || ' SECONDS')::INTERVAL - WHERE id = $2 - AND deviceid = $3 - `, - [expiration, shotId, id] - ); - }); -}; - -Shot.deleteShot = function(backend, shotId, deviceId, accountId) { - let id; - return db.select( - `SELECT devices.id - FROM data, devices - WHERE data.id = $1 AND (devices.id = $2 OR devices.accountid = $3) - AND data.deviceid = devices.id - `, - [shotId, deviceId, accountId] - ).then((rows) => { - if (!rows.length) { - return null; - } - id = rows[0].id; - return Shot.get(backend, shotId, id) - .then((shot) => { - const clipRewrites = new ClipRewrites(shot); - clipRewrites.clear(); - return db.transaction((client) => { - return clipRewrites.commit(client); - }); - }) - .then(() => { - return db.update( - `DELETE FROM data - WHERE id = $1 - AND deviceid = $2 - `, - [shotId, id] - ); - }); - }); -}; - -Shot.deleteEverythingForDevice = function(backend, deviceId, accountId) { - let deviceIds; - - const getDeviceIds = () => { - if (accountId) { - return db.select( - `SELECT devices.id - FROM devices - WHERE devices.accountid = $1`, - [accountId]); - } - return Promise.resolve([{id: deviceId}]); - }; - - const imageIdsSelect = (deviceIdRows) => { - deviceIds = deviceIdRows.map(row => row.id); - if (!deviceIds.length) { - deviceIds = [deviceId]; - } - return db.select( - `SELECT images.id - FROM images JOIN data - ON images.shotid = data.id - WHERE data.deviceid IN (${db.markersForArgs(1, deviceIds.length)})`, - deviceIds); - }; - - const deleteImageData = (imageIdRows) => { - imageIdRows.forEach(row => del(row.id)); - }; - - const deleteShotRecords = () => { - const deleteSql = `DELETE FROM data WHERE - deviceid IN (${db.markersForArgs(1, deviceIds.length)})`; - return db.update( - deleteSql, - deviceIds - ); - }; - - return getDeviceIds() - .then(imageIdsSelect) - .then(deleteImageData) - .then(deleteShotRecords); -}; - -Shot.userHasShots = async function(deviceId, accountId) { - let deviceIds = [{id: deviceId}]; - if (accountId) { - deviceIds = await db.select( - `SELECT devices.id - FROM devices - WHERE devices.id = $1 OR devices.accountid = $2 - `, - [deviceId, accountId]); - } - deviceIds = deviceIds.map(row => row.id); - const markers1 = db.markersForArgs(1, deviceIds.length); - const markers2 = db.markersForArgs(deviceIds.length + 1, deviceIds.length); - const hasSome = await db.select(` - SELECT - EXISTS ( - SELECT data.id - FROM data - WHERE data.expire_time IS NULL - AND NOT data.deleted - AND data.deviceid IN (${markers1}) - ) AS hasindefinite, - EXISTS ( - SELECT data.id - FROM data - WHERE NOT data.deleted - AND data.deviceid IN (${markers2}) - ) AS hasany - `, deviceIds.concat(deviceIds)); - return {hasIndefinite: hasSome[0].hasindefinite, hasAny: hasSome[0].hasany}; -}; - - -const ClipRewrites = class ClipRewrites { - - constructor(shot) { - this.shot = shot; - this.committed = false; - this.unedited = []; - this.toInsertClipIds = []; - this.toInsert = {}; - for (const name of this.shot.clipNames()) { - const clip = this.shot.getClip(name); - if (clip.image && clip.isDataUrl()) { - this.toInsertClipIds.push(clip.id); - let extension = ".png"; - const type = clip.image.type || "png"; - if (type === "jpeg") { - extension = ".jpg"; - } - const imageId = uuid.v4() + extension; - this.toInsert[clip.id] = { - uuid: imageId, - url: linker.imageLinkWithHost(imageId), - binary: clip.imageBinary(), - }; - } else { - this.unedited.push(clip.id); - } - } - this.toInsertThumbnail = null; - this.oldThumbnail = this.shot.thumbnail; - if (!validUrl.isWebUri(this.shot.url)) { - this.shot.fullUrl = ""; - this.shot.origin = ""; - } - const pngDataUrlMediaType = "data:image/png;base64,"; - if (this.shot.thumbnail && this.shot.thumbnail.startsWith(pngDataUrlMediaType)) { - let imageData = this.shot.thumbnail.substr(pngDataUrlMediaType.length); - imageData = new Buffer(imageData, "base64"); - const imageId = `${uuid.v4()}.png`; - this.toInsertThumbnail = { - contentType: "image/png", - binary: imageData, - uuid: imageId, - url: linker.imageLinkWithHost(imageId), - }; - } else if (this.shot.thumbnail && validUrl.isWebUri(this.shot.thumbnail)) { - // When there is no thumbnail to insert or update, but there is a - // thumbnail previously, use the old one. This happens when other - // properties of the shot are being updated. - // - // The clip id of a thumbnail is its filename, so we add that to the - // unedited list to prevent it from being deleted in commit(). - this.unedited.push(this.shot.thumbnail.split("/").pop()); - } - } - - rewriteShotUrls() { - for (const clipId of this.toInsertClipIds) { - const url = this.toInsert[clipId].url; - const clip = this.shot.getClip(clipId); - clip.image.url = url; - } - if (this.toInsertThumbnail !== null) { - this.shot.thumbnail = this.toInsertThumbnail.url; - } - } - - revertShotUrls() { - for (const clipId of this.toInsertClipIds) { - const data = this.toInsert[clipId]; - const clip = this.shot.getClip(clipId); - clip.setUrlFromBinary(data.binary); - } - this.shot.thumbnail = this.oldThumbnail; - } - - clear() { - this.unedited = []; - this.toInsert = {}; - this.toInsertClipIds = []; - this.toInsertThumbnail = null; - } - - commands() { - const commands = []; - if (this.toInsertThumbnail !== null) { - commands.push({updateThumbnailUrl: this.toInsertThumbnail.url}); - } - for (const clipId of this.toInsertClipIds) { - const url = this.toInsert[clipId].url; - commands.push({updateClipUrl: {clipId, url}}); - } - return commands; - } - - commit(client) { - let query; - const unedited = this.unedited; - if (unedited.length) { - query = `SELECT id FROM images WHERE shotid = $1 - AND clipid NOT IN (${db.markersForArgs(2, this.unedited.length)})`; - } else { - query = `SELECT id FROM images WHERE shotid = $1`; - } - const promise = db.queryWithClient( - client, - query, - [this.shot.id].concat(this.unedited) - ).then((result) => { - - // Fire and forget attempts to delete from s3 - for (let i = 0; i < result.rows.length; i++) { - del(result.rows[i].id); - } - - if (unedited.length) { - query = `DELETE FROM images - WHERE shotid = $1 - AND clipid NOT IN (${db.markersForArgs(2, this.unedited.length)}) - `; - } else { - query = "DELETE FROM images WHERE shotid = $1"; - } - return db.queryWithClient(client, query, [this.shot.id].concat(this.unedited)); - }); - return promise.then(() => { - return Promise.all( - this.toInsertClipIds.map((clipId) => { - const data = this.toInsert[clipId]; - - put(data.uuid, data.binary.data, "image"); - - return db.queryWithClient( - client, - `INSERT INTO images (id, shotid, clipid, url, contenttype, size) - VALUES ($1, $2, $3, $4, $5, $6) - `, - [data.uuid, this.shot.id, clipId, data.url, data.binary.contentType, data.binary.data.length]); - }) - ); - }).then(() => { - if (this.toInsertThumbnail === null) { - return Promise.resolve(); - } - - put(this.toInsertThumbnail.uuid, this.toInsertThumbnail.binary, "thumbnail"); - - return db.queryWithClient( - client, - `INSERT INTO images (id, shotid, clipid, url, contenttype, size) - VALUES ($1, $2, $3, $4, $5, $6) - `, - // Since we don't have a clipid for the thumbnail and the column is NOT NULL, - // Use the thumbnail uuid as the clipid. This allows figuring out which - // images are thumbnails, too. - [this.toInsertThumbnail.uuid, this.shot.id, this.toInsertThumbnail.uuid, - this.toInsertThumbnail.url, this.toInsertThumbnail.contentType, this.toInsertThumbnail.binary.length]); - }).then(() => { - this.committed = true; - }); - } - -}; - -Shot.cleanDeletedShots = function() { - const retention = config.expiredRetentionTime; - let imagesDeleted = -1; - let imagesFailed = 0; - return db.transaction((client) => { - return Promise.resolve().then(() => { - return db.queryWithClient( - client, - ` - SELECT images.id AS id - FROM images, data - WHERE images.shotid = data.id - AND data.expire_time + ($1 || ' SECONDS')::INTERVAL < CURRENT_TIMESTAMP - AND (NOT data.deleted OR images.failed_delete) - `, - [retention] - ); - }).then((result) => { - imagesDeleted = result.rowCount; - const promiseMap = {}; - for (const row of result.rows) { - promiseMap[row.id] = del(row.id); - } - return resolveAllPromises(promiseMap); - }).then(() => { - return []; - }, (delFailed) => { - mozlog.error("del-image-failed", {errors: delFailed}); - return Object.keys(delFailed); - }).then((failedIds) => { - imagesFailed = failedIds.length; - imagesDeleted -= imagesFailed; - if (!failedIds.length) { - return db.queryWithClient( - client, - ` - DELETE FROM images - USING data - WHERE images.shotid = data.id - AND data.expire_time + ($1 || ' SECONDS')::INTERVAL < CURRENT_TIMESTAMP - AND (NOT data.deleted OR images.failed_delete) - `, - [retention] - ); - } - const idMarkersFrom1 = []; - const idMarkersFrom2 = []; - for (let i = 0; i < failedIds.length; i++) { - idMarkersFrom1.push("$" + String(i + 1)); - idMarkersFrom2.push("$" + String(i + 2)); - } - return db.queryWithClient( - client, - ` - UPDATE images - SET failed_delete = TRUE - WHERE images.id IN (${idMarkersFrom1}) - `, - failedIds - ).then(() => { - return db.queryWithClient( - client, - ` - DELETE FROM images - USING data - WHERE images.shotid = data.id - AND data.expire_time + ($1 || ' SECONDS')::INTERVAL < CURRENT_TIMESTAMP - AND images.id NOT IN (${idMarkersFrom2}) - `, - [retention].concat(failedIds) - ); - }); - }).then((result) => { - return db.queryWithClient( - client, - ` - UPDATE data - SET value = '{}', deleted = TRUE - WHERE expire_time + ($1 || ' SECONDS')::INTERVAL < CURRENT_TIMESTAMP - AND NOT deleted - `, - [retention] - ); - }).then((result) => { - return { - shotsDeleted: result.rowCount, - imagesDeleted, - imagesFailed, - }; - }); - }); -}; - -Shot.upgradeSearch = function() { - const batchSize = config.upgradeSearchBatchSize; - return db.select( - `SELECT id FROM data - WHERE searchable_version IS NULL OR searchable_version < $1 - ORDER BY created DESC - LIMIT $2 - `, - [SEARCHABLE_VERSION, batchSize]).then((rows) => { - if (!rows.length) { - return null; - } - let index = 0; - return new Promise((resolve, reject) => { - function run() { - if (index >= rows.length) { - return resolve(); - } - Shot.get("upgrade_search_only", rows[index].id).then((shot) => { - // This shouldn't really happen, but apparently can... - if (!shot) { - return null; - } - return shot.upgradeSearch(); - }).then(() => { - index++; - run(); - }).catch(reject); - return null; - } - run(); - }).then(() => { - mozlog.info("upgraded-rows", { - msg: `Upgraded ${rows.length} records to SEARCHABLE_VERSION ${SEARCHABLE_VERSION}`, - }); - setTimeout(Shot.upgradeSearch.bind(Shot), 10000); - }); - }); -}; - -/** Waits for all the values of mapping to resolve or reject, resolving if everything - succeeds, or rejecting with a mapping of keys to errors */ -function resolveAllPromises(mapping) { - const promises = []; - const result = {}; - Object.keys(mapping).forEach((key) => { - promises.push(mapping[key]); - mapping[key].catch((error) => { - result[key] = error; - }); - }); - return Promise.all(promises).then( - null, - (error) => { - throw result; - } - ); -} - -Shot.prototype.atob = require("atob"); -Shot.prototype.btoa = require("btoa"); diff --git a/server/src/share-buttons.js b/server/src/share-buttons.js deleted file mode 100644 index 17fc51872f..0000000000 --- a/server/src/share-buttons.js +++ /dev/null @@ -1,227 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const classnames = require("classnames"); -const { Localized } = require("fluent-react/compat"); -const sendEvent = require("./browser-send-event.js"); - -exports.ShareButton = class ShareButton extends React.Component { - constructor(props) { - super(props); - const display = false; - this.state = {display}; - } - - render() { - let panel = null; - if (this.state.display) { - panel = ; - } - const useNewIcon = this.props.abTests.shotShareIcon && this.props.abTests.shotShareIcon.value === "newicon"; - const shareClasses = classnames("button", "transparent", "share", { - "active": this.state.display, - "inactive": !this.state.display, - "newicon": useNewIcon, - }); - return
    - -
    ; - } - - onClick() { - const show = !this.state.display; - this.setState({display: show}); - if (show) { - if (this.props.setPanelState) { - this.props.setPanelState("panel-open"); - } - sendEvent( - this.props.isOwner ? "start-share-owner" : "start-share-non-owner", - "navbar"); - } else { - if (this.props.setPanelState) { - this.props.setPanelState("panel-closed"); - } - if (this.shareDiv) { - this.shareDiv.blur(); - } - sendEvent("cancel-share"); - } - } - - onPanelClose() { - this.setState({display: false}); - if (this.props.setPanelState) { - this.props.setPanelState("panel-closed"); - } - } -}; - -exports.ShareButton.propTypes = { - abTests: PropTypes.object, - clipUrl: PropTypes.string, - isExtInstalled: PropTypes.bool, - isOwner: PropTypes.bool, - renderExtensionNotification: PropTypes.bool, - setPanelState: PropTypes.func, - shot: PropTypes.object, - staticLink: PropTypes.func, -}; - -class ShareButtonPanel extends React.Component { - constructor(props) { - super(props); - this.state = {copy: "copy"}; - this.clickMaybeClose = this.clickMaybeClose.bind(this); - this.keyMaybeClose = this.keyMaybeClose.bind(this); - } - - - onClickShareButton(whichButton, shareUrl) { - sendEvent( - this.props.isOwner ? "share-owner" : "share-non-owner", - whichButton); - - // There's always an extra event argument at the end - if (typeof shareUrl === "string") { - window.open(shareUrl).opener = null; - this.props.closePanel(); - return false; - } - - this.props.closePanel(); - return null; - } - - onClickCopyButton(e) { - const target = e.target; - target.previousSibling.select(); - document.execCommand("copy"); - this.setState({copy: "copied"}); - setTimeout(() => { - this.setState({copy: "copy"}); - }, 1000); - sendEvent("share", "copy"); - } - - onClickInputField(e) { - e.target.select(); - sendEvent("share", "focus-url"); - } - - render() { - let className = "share-panel"; - if (this.props.renderExtensionNotification) { - className += " share-panel-with-notification"; - } - return
    this.shareDiv = shareDiv} style={{top: this.state.top, left: this.state.left}}> -
    - - - - - - - - - - - - - - - - - -
    -
    - -

    Get a shareable link to this shot:

    -
    -
    - - - - -
    - -

    - This shot is only visible to you until you share the link. -

    -
    -
    -
    ; - } - - changePanelPosition() { - const el = this.shareDiv; - const rect = el.getBoundingClientRect(); - if (!(rect.right <= (window.innerWidth || document.documentElement.clientWidth))) { - this.setState({left: -140}); - } - if (!(rect.bottom <= (window.innerHeight || document.documentElement.clientHeight))) { - this.setState({top: -385}); - } - } - - componentDidMount() { - this.changePanelPosition(); - document.addEventListener("click", this.clickMaybeClose); - document.addEventListener("keyup", this.keyMaybeClose); - } - - componentWillUnmount() { - document.removeEventListener("click", this.clickMaybeClose); - document.removeEventListener("keyup", this.keyMaybeClose); - } - - clickMaybeClose(event) { - if (!this.isPanel(event.target)) { - this.props.closePanel(); - } - } - - keyMaybeClose(event) { - if ((event.key || event.code) === "Escape") { - this.props.closePanel(); - } - } - - /* Returns true if the element is part of the share panel */ - isPanel(el) { - while (el) { - if (el.id === "share-buttons-panel") { - return true; - } - el = el.parentNode; - } - return false; - } - -} - -ShareButtonPanel.propTypes = { - clipUrl: PropTypes.string, - closePanel: PropTypes.func, - isOwner: PropTypes.bool, - renderExtensionNotification: PropTypes.bool, - shot: PropTypes.object, - staticLink: PropTypes.func, -}; diff --git a/server/src/signin-button.js b/server/src/signin-button.js deleted file mode 100644 index 9723a5a636..0000000000 --- a/server/src/signin-button.js +++ /dev/null @@ -1,73 +0,0 @@ -const React = require("react"); -const PropTypes = require("prop-types"); -const { Localized } = require("fluent-react/compat"); -const sendEvent = require("./browser-send-event.js"); -const { FxaOnboardingDialog } = require("./fxa-onboarding-dialog"); - -exports.SignInButton = class SignInButton extends React.Component { - constructor(props) { - super(props); - this.state = { - displaySettings: props.isFxaAuthenticated, - hasFxaOnboardingDialog: props.hasFxaOnboardingDialog, - }; - } - - static getDerivedStateFromProps(nextProps, prevState) { - return { displaySettings: nextProps.isFxaAuthenticated}; - } - - componentDidUpdate(oldProps, oldState) { - if (oldProps.hasFxaOnboardingDialog !== this.props.hasFxaOnboardingDialog) { - this.setState({hasFxaOnboardingDialog: this.props.hasFxaOnboardingDialog}); - } - } - - render() { - if (this.state.displaySettings) { - return
    - - - - - -
    ; - } - - const logInURI = "/api/fxa-oauth/login/" + this.props.initialPage; - const fxaOnboardingDialog = this.state.hasFxaOnboardingDialog ? - : null; - - return
    - - - - - - { fxaOnboardingDialog } -
    ; - } - - clickHandler(event) { - sendEvent("fxa-signin", this.props.initialPage, {useBeacon: true}); - if (this.state.hasFxaOnboardingDialog) { - this.hideFxaOnboardingDialog(); - } - } - - hideFxaOnboardingDialog() { - const hasFxaOnboardingDialog = !this.state.hasFxaOnboardingDialog; - this.setState({hasFxaOnboardingDialog}); - // set counter to max to stop showing promo again - localStorage.hasSeenOnboardingDialog = 3; - } -}; - -exports.SignInButton.propTypes = { - initialPage: PropTypes.string, - isFxaAuthenticated: PropTypes.bool, - staticLink: PropTypes.func, - hasFxaOnboardingDialog: PropTypes.bool, -}; diff --git a/server/src/statsd.js b/server/src/statsd.js deleted file mode 100644 index dc60fc0abf..0000000000 --- a/server/src/statsd.js +++ /dev/null @@ -1,16 +0,0 @@ -const config = require("./config").getProperties(); - -let StatsD = null; -let client = null; -const prefix = config.statsdPrefix; - -if (prefix) { - StatsD = require("node-statsd"); - client = new StatsD({prefix}); -} - -exports.increment = function(name) { - if (client) { - client.increment(name); - } -}; diff --git a/server/src/users.js b/server/src/users.js deleted file mode 100644 index 3a396fa05a..0000000000 --- a/server/src/users.js +++ /dev/null @@ -1,273 +0,0 @@ -const config = require("./config").getProperties(); -const db = require("./db"); -const errors = require("./errors"); -const fetch = require("node-fetch"); -const crypto = require("crypto"); -const mozlog = require("./logging").mozlog("users"); -const abTests = require("./ab-tests"); - -function hashMatches(hash, secret) { - const parts = hash.split(/:/g); - if (parts[0] !== "shaHmac") { - throw new Error("Unknown type of hash"); - } - if (parts.length !== 3) { - throw new Error("Bad hash format, should be type:nonce:data"); - } - const expected = createHash(secret, parts[1]); - return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(hash)); -} - -function createHash(secret, nonce) { - if (!nonce) { - nonce = createNonce(); - } - if (nonce.search(/^[0-9a-zA-Z]+$/) === -1) { - throw new Error("Bad nonce"); - } - const hmac = crypto.createHmac("sha256", nonce); - hmac.update(secret); - const digest = hmac.digest("hex"); - return `shaHmac:${nonce}:${digest}`; -} - -function createNonce() { - return crypto.randomBytes(10).toString("hex"); -} - -/** Parses the FORCE_AB_TESTS config */ -function getForceAbTests() { - const val = config.forceAbTests || ""; - if (!val) { - return null; - } - const parts = val.split(/\s/g); - const result = {}; - for (const part of parts) { - const equals = part.split("="); - result[equals[0]] = equals[1]; - } - return result; -} - -function isValidDeviceId(deviceId) { - return /^(anon)?[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(deviceId); -} -exports.isValidDeviceId = isValidDeviceId; - -exports.checkLogin = function(deviceId, secret, addonVersion) { - if (!secret) { - throw new Error("No secret given"); - } - return db.select( - `SELECT secret_hashed, ab_tests FROM devices WHERE id = $1`, - [deviceId] - ).then((rows) => { - if (!rows.length) { - return null; - } - let userAbTests = {}; - if (rows[0].ab_tests) { - userAbTests = JSON.parse(rows[0].ab_tests); - } - userAbTests = abTests.updateAbTests(userAbTests, getForceAbTests()); - if (hashMatches(rows[0].secret_hashed, secret)) { - db.update( - `UPDATE devices - SET last_login = NOW(), - session_count = session_count + 1, - last_addon_version = $1, - ab_tests = $2 - WHERE id = $3 - `, - [addonVersion, JSON.stringify(userAbTests), deviceId] - ).catch((error) => { - mozlog.error("error-updating-devices-table", {err: error}); - }); - return userAbTests; - } - return false; - }); -}; - -exports.registerLogin = function(deviceId, accountId, data, canUpdate) { - if (!deviceId) { - throw new Error("No deviceId given"); - } - if (!isValidDeviceId(deviceId)) { - throw new Error("Invalid deviceId given"); - } - if (!(data && data.secret)) { - throw new Error("No data or data.secret given"); - } - const secretHashed = createHash(data.secret); - return db.insert( - `INSERT INTO devices (id, secret_hashed, accountid) - VALUES ($1, $2, $3)`, - [deviceId, secretHashed || null, accountId || null] - ).then((inserted) => { - const userAbTests = abTests.updateAbTests({}, getForceAbTests()); - if (inserted) { - return userAbTests; - } - if (canUpdate) { - if (!data.secret) { - throw new Error("Must have secret if updating"); - } - return db.update( - `UPDATE devices - SET secret_hashed = $1 - WHERE id = $4`, - [secretHashed || null, deviceId] - ).then((rowCount) => { - if (rowCount) { - return userAbTests; - } - return false; - }); - } - return false; - }).catch((err) => { - mozlog.error("register-error", {err}); - return false; - }); -}; - -exports.setState = function(deviceId, state) { - return db.insert( - `INSERT INTO states (state, deviceid) - VALUES ($1, $2)`, - [state, deviceId] - ); -}; - -exports.checkState = function(deviceId, state) { - return db.del( - `DELETE FROM states WHERE state = $1 AND deviceid = $2`, - [state, deviceId] - ).then(rowCount => !!rowCount); -}; - - -exports.tradeCode = async function(code) { - const oAuthURI = `${config.fxa.oAuthServer}/token`; - try { - const resp = await fetch(oAuthURI, { - method: "POST", - body: JSON.stringify({ - code, - client_id: config.fxa.clientId, - client_secret: config.fxa.clientSecret, - }), - headers: { - "content-type": "application/json", - }, - }); - - if (!resp.ok) { - throw new Error(`${resp.status}: ${resp.statusText}.`); - } - - return await resp.json(); - } catch (err) { - // error with the /token endpoint - mozlog.warn("fxa-tradecode-failed", {err}); - throw errors.badToken(); - } -}; - -exports.disconnectDevice = function(deviceId) { - return db.update( - `UPDATE devices - SET accountId = null - WHERE id = $1`, - [deviceId] - ); -}; - -exports.fetchProfileData = async function(accessToken) { - const userInfoEndpoint = `${config.fxa.profileServer}/profile`; - - try { - const resp = await fetch(userInfoEndpoint, { - method: "GET", - headers: { - authorization: `Bearer ${accessToken}`, - }, - }); - - if (!resp.ok) { - throw new Error(`${resp.status}: ${resp.statusText}.`); - } - - return await resp.json(); - } catch (err) { - mozlog.warn("fxa-get-profile-failed", {err}); - throw errors.badProfile(); - } -}; - -exports.saveProfileData = function(accountId, avatarUrl, nickname, email) { - return db.update( - `UPDATE accounts - SET nickname = $1, avatarurl = $2, email = $3 - WHERE id = $4`, - [nickname || null, avatarUrl || null, email, accountId] - ); -}; - -exports.getAccountId = async function(accessToken) { - const profileURI = `${config.fxa.profileServer}/uid`; - try { - const resp = await fetch(profileURI, { - method: "GET", - headers: { - authorization: `Bearer ${accessToken}`, - }, - }); - - if (!resp.ok) { - throw new Error(`${resp.status}: ${resp.statusText}.`); - } - - return await resp.json(); - } catch (err) { - mozlog.warn("fxa-get-uid-failed", {err}); - throw errors.badProfile(); - } -}; - -exports.registerAccount = function(deviceId, accountId, accessToken) { - return db.transaction(client => { - return db.upsertWithClient( - client, - `INSERT INTO accounts (id, token) SELECT $1, $2`, - `UPDATE accounts SET token = $2 WHERE id = $1`, - [accountId, accessToken] - ).then(() => { - if (!deviceId) { - return null; - } - return db.queryWithClient( - client, - `UPDATE devices SET accountid = $2 WHERE id = $1`, - [deviceId, accountId] - ); - }); - }); -}; - -exports.retrieveAccount = function(deviceId) { - return db.select( - `SELECT accountid FROM devices WHERE id = $1`, - [deviceId] - ).then((rows) => { - if (!rows.length) { - return null; - } - if (rows[0].accountid) { - return rows[0].accountid; - } - return null; - }); -}; diff --git a/server/src/watchdog.js b/server/src/watchdog.js deleted file mode 100644 index 24a9bad60a..0000000000 --- a/server/src/watchdog.js +++ /dev/null @@ -1,337 +0,0 @@ -const config = require("./config").getProperties(); -const mozlog = require("./logging").mozlog("watchdog"); -const { captureRavenException } = require("./ravenclient"); -const db = require("./db"); -const { Shot } = require("./servershot"); -const util = require("util"); -const { URL } = require("url"); -const fetch = require("node-fetch"); -const Hawk = require("hawk"); -const FormData = require("form-data"); -const genUuid = require("nodify-uuid"); - -const isEnabled = config.watchdog.enable; -validateConfiguration(); - -// The following is based on -// https://product-details.mozilla.org/1.0/firefox_history_major_releases.json -// and the release calendar. We will temporarily use it to determine if the shot -// is from a browser that's in the release or esr channel, i.e. a major version -// that is older than or equal to the current release version. -const currentMajorVersion = 62; -const firefoxMajorReleases = { - 63: new Date("2018-10-23"), - 64: new Date("2018-12-11"), - 65: new Date("2019-01-29"), -}; - -function validateConfiguration() { - if (!isEnabled) { - return; - } - - let isConfigValid = true; - - if (!config.watchdog.id || !config.watchdog.key || !config.watchdog.algorithm) { - mozlog.warn("watchdog-invalid-config", {msg: "Watchdog credentials configuration values are missing."}); - isConfigValid = false; - } - - if (!config.watchdog.submissionUrl) { - mozlog.warn("watchdog-invalid-config", {msg: "Watchdog submission URL configuration value is missing."}); - isConfigValid = false; - } else { - try { - new URL(config.watchdog.submissionUrl); - } catch (e) { - mozlog.warn("watchdog-invalid-config", {msg: "Watchdog submission URL is not a valid URL.", err: e}); - isConfigValid = false; - } - } - - if (!isConfigValid) { - mozlog.info("watchdog-config-exit", {msg: "Watchdog is enabled but not properly configured."}); - process.exit(2); - } - -} - -let positiveEmailList; -if (config.watchdog.positiveEmail) { - positiveEmailList = config.watchdog.positiveEmail.split(";"); -} - -let intervalSize = config.watchdog.submissionInterval; -if (intervalSize <= 1) { - intervalSize = 1; -} -let odometer = 0; -function isAtInterval() { - if (intervalSize === 1) { - return true; - } - - const atInterval = odometer === 0; - odometer = (odometer + 1) % intervalSize; - return atInterval; -} - -/** - * This should be temporary! Here we check if we should submit the shot based - * on the update channel of the browser in which the shot was taken. - */ -function shouldExcludeShot(shot) { - if (!config.watchdog.excludeReleaseChannel) { - return false; - } - - // At the time of writing `firefoxChannel` is not avaialbe. - if (shot.firefoxChannel) { - return shot.firefoxChannel === "release" || shot.firefoxChannel === "esr"; - } - - if (shot.firefoxMajorVersion) { - if (shot.firefoxMajorVersion <= currentMajorVersion) { - return true; - } - - if (firefoxMajorReleases[shot.firefoxMajorVersion] - && new Date() >= firefoxMajorReleases[shot.firefoxMajorVersion]) { - return true; - } - } - - // Do not submit shots by default. Per clouserw. - return true; -} - -function shouldSubmitShot(shot) { - return isEnabled && isAtInterval() && !shouldExcludeShot(shot); -} - -function getSubmissionId() { - return db.select( - "SELECT nextval(pg_get_serial_sequence('watchdog_submissions', 'id')) AS new_id", - ).then(rows => { - if (rows.length) { - return rows[0].new_id; - } - throw new Error("Unable to retrieve a new Watchdog submission id."); - }); -} - -function getSubmission(id) { - return db.select( - "SELECT * FROM watchdog_submissions WHERE id = $1", [id] - ).then(rows => { - if (rows.length) { - return rows[0]; - } - const err = new Error("Unable to find a Watchdog submission."); - err.watchdogSubmissionId = String(id); - throw err; - }); -} - -const credentials = { - id: config.watchdog.id, - key: config.watchdog.key, - algorithm: config.watchdog.algorithm, -}; - -exports.submit = function(shot) { - if (!shouldSubmitShot(shot)) { - return; - } - - if (config.watchdog.devOnlyMatchHostname) { - try { - const url = new URL(shot.origin); - if (url.hostname !== config.watchdog.devOnlyMatchHostname) { - mozlog.debug("watchdog-debug", { msg: `Shot hostname does not match ${config.watchdog.devOnlyMatchHostname}.` }); - return; - } - } catch (e) { - mozlog.debug("watchdog-debug", { msg: `The shot's invalid hostname does not match ${config.watchdog.devOnlyMatchHostname}.` }); - return; - } - } - - const imageUrl = shot.getClip(shot.clipNames()[0]).image.url; - const imageId = imageUrl.split("/").pop(); - const form = new FormData(); - - // When this is called the shot has been successfully saved to the database, - // but the image data is not necessarily on S3 as the save to S3 is not - // awaited. Awaiting the S3 upload will affect the responsiveness of saving a - // shot with the addon. - // - // We'll give the S3 upload a head start and try a few times to fetch the - // image data. This is called for every shot saved, so let's keep it simple - // and minimal. - - const delay = function(waitInMs) { - return new Promise((resolve) => { - setTimeout(() => resolve(), waitInMs); - }); - }; - - const getRawBytesPromise = function(timeToWait, retry) { - return new Promise((resolve, reject) => { - delay(timeToWait) - .then(() => Shot.getRawBytesForClip(imageId)) - .then(obj => { - if (obj === null) { - const err = new Error("Shot image expired, blocked, or not found."); - err.imageId = String(imageId); - reject(err); - } else { - resolve(obj); - } - }) - .catch(e => { - if (!retry) { - reject(e); - } - resolve(null); - }); - }); - }; - - getRawBytesPromise(1000, true) - .then(bytes => bytes || getRawBytesPromise(1000, true)) - .then(bytes => bytes || getRawBytesPromise(1000)) - .then((obj) => { - form.append("image", obj.data, { - filename: imageId, - contentType: obj.contentType, - }); - - return getSubmissionId(); - }).then(submissionId => { - const uuid = util.promisify(genUuid.generate); - return uuid(genUuid.V_RANDOM).then(nonce => ({submissionId, nonce})); - }).then(({submissionId, nonce}) => { - const callbackUrl = `${shot.backend}/watchdog/${submissionId}?nonce=${nonce}`; - form.append("positive_uri", callbackUrl); - form.append("negative_uri", callbackUrl); - - if (positiveEmailList) { - for (const addr of positiveEmailList) { - form.append("positive_email[]", addr); - } - } - - // The shot id is included because there is no callback after manual - // verification of a positive match on Watchdog. The shot id is for looking - // up a shot on screenshots-admin post-verification. - form.append("notes", `Shot ID: ${shot.id}`); - - const req = {method: "POST", body: form}; - const authHeader = Hawk.client.header(config.watchdog.submissionUrl, req.method, {credentials}); - req.headers = Object.assign( - {Accept: "application/json", Authorization: authHeader.header}, - form.getHeaders()); - return fetch(config.watchdog.submissionUrl, req) - .then(res => { - if (res.ok) { - return res.json(); - } - - const err = new Error("Received error response from Watchdog."); - err.watchdogSubmissionId = String(submissionId); - err.responseStatus = res.status; - err.responseStatusText = res.statusText; - throw err; - }).then(respJson => ({submissionId, nonce, request_id: respJson.id})); - }).then(({submissionId, nonce, request_id}) => { - return db.insert( - `INSERT INTO watchdog_submissions (id, shot_id, request_id, nonce) - VALUES ($1, $2, $3, $4)`, - [submissionId, shot.id, request_id, nonce.toString()] - ); - }).catch(e => { - captureRavenException(e); - mozlog.error("watchdog-failed-submission", {err: e}); - }); -}; - -exports.handleResult = function(req) { - getSubmission(req.params.submissionId).then(record => { - if (record.request_id !== req.body.watchdog_id) { - const err = new Error("Received mismatching Watchdog ID in callback."); - err.watchdogSubmissionId = String(record.id); - throw err; - } - if (req.query.nonce !== record.nonce) { - const err = new Error("Received mismatching nonce in a Watchdog callback."); - err.watchdogSubmissionId = String(record.id); - throw err; - } - if (record.positive_result !== null) { - const err = new Error("Watchdog submission already has a result."); - err.watchdogSubmissionId = String(record.id); - throw err; - } - - // Check if there was an upstream error at PhotoDNA. - // We leave the result as null. - if (req.body.error) { - const err = new Error(`Watchdog submission encountered an error at PhotoDNA.`); - err.watchdogSubmissionId = String(record.id); - err.photodnaResponseStatus = req.body.response.Status; - throw err; - } - - if (req.body.positive) { - handlePositive(record); - } else { - handleNegative(record); - } - }).catch(e => { - captureRavenException(e); - mozlog.error("watchdog-failed-callback", {err: e}); - }); -}; - -function handleNegative(record) { - mozlog.debug("watchdog-negative-match", {msg: `Watchdog submission ${record.id} is a negative match.`}); - - if (config.watchdog.logsOnly) { - return null; - } - - return db.update("UPDATE watchdog_submissions SET positive_result = FALSE WHERE id = $1", [record.id]); -} - -function handlePositive(record) { - mozlog.info( - "watchdog-positive-match", { - msg: `Watchdog submission for shot ${record.shot_id} is a positive match.`, - watchdogId: record.request_id, - watchdogSubmissionId: record.id, - }); - - if (config.watchdog.logsOnly) { - return null; - } - - return db.transaction(client => { - return db.queryWithClient( - client, - `UPDATE data - SET expire_time = NULL, deleted = FALSE, block_type = 'watchdog' - WHERE id = $1`, - [record.shot_id] - ).then(() => db.queryWithClient( - client, - "UPDATE watchdog_submissions SET positive_result = TRUE WHERE id = $1", - [record.id] - )); - }).then(() => { - mozlog.info("watchdog-successful-commit", {msg: `Watchdog positive match ${record.id} successfully committed to the database.`}); - }).catch(err => { - mozlog.error("watchdog-failed-commit", {err: `Watchdog positive match ${record.id} not committed to the database: ${err}.`}); - throw err; - }); -} diff --git a/server/views-docs.md b/server/views-docs.md deleted file mode 100755 index a498da73e0..0000000000 --- a/server/views-docs.md +++ /dev/null @@ -1,159 +0,0 @@ -## Views - -This documents the structure-in-progress for handling views in Screenshots, and with isomorphic React rendering generally. - -### Goals - -We want: - -1. To keep the dependency graph separated out for the browser and the server. Things to be used in the browser should never depend on the server or even refer to it (so server-oriented code isn't bundled). Things to be used on the server should not import browser-oriented code. -2. Some code should be shared between server and browser. -3. We want to gracefully handle the *model* between server and browser. -4. Only the server needs to know how to *instantiate* the model. -5. Only the browser needs to know how to *update* the model (the server will simply reinstantiate). -6. The model should represent everything we need to know about rendering the page. - 7. Except for some transient states created for the purposes of user-input. - -### Components - -There are five components of a typical page: - -#### 1. The declaration (`page.js`): - -This is declarative, and represents the "page", essentially all the components listed below. It is usable from the browser and client. - -Must export `page` (an instance of `reactruntime.Page`) - -#### 2. The server model (`model.js`): - -This instantiates the model based on a request. The model is JSONable. It also implements data-oriented routines, such as page-specific database queries. - -This must export `createModel(req)`. This should look like: - -```javascript -exports.createModel = function (req) { - return db.doSomething().then((result) => - return { - someValue: result - title: "A page" - }; - }; -}; -``` - -Besides `title` nothing is required in the model. - -#### 3. The server controller (`server.js`): - -This handles routing and responding to the initial request. This instantiates the model (from `model.js`) and uses that to render the page. This also implements any API endpoints that are used by the browser to update data (though the actual updating typically will take place in `model.js`). - -This must export `app` (an Express application that will be mounted). - -#### 4. The view (`view.js`): - -This is shared between the server and the browser. It is a module that exports React components for the head and body. It has event handlers; these handlers should parse any input (e.g., extract the value of a form field), but to *do* anything they simply call `controller.onSomething(value)`. - -This must export `HeadFactory` and `BodyFactory` (see `reactruntime.HeadTemplate` for how these should work). - -#### 5. The browser controller (`controller.js`): - -This handles events, managing the model on the browser side, making requests to APIs, and generally all the logic in the browser. It effectively manages the model on the browser (there is not a separate module for this). - -This must *assign* `window.controller` (instead of exporting, like `window.controller = exports`), and must export `launch(model)`. The basic form of the code should be: - -```javascript -const page = require("./page").page; - -let model; - -exports.launch = function (m) { - model = m; - render(); -}; - -function render() { - page.render(model); -} - -exports.onSomething = function (value) { - model.something = value; - render(); -}; - -window.controller = exports; -``` - -### Helpers/glue - -To put these all together we have several modules: - -#### `reactruntime` - -This is used primarily in the browser, though it is also used on the server. - -##### `reactruntime.Page` - -This class is what you instantiate to get `page.page`. Currently it is fairly minimal: - -```javascript -exports.page = new Page({ - dir: __dirname -}); -``` - -Everything else is implied by the standard module names in the directory. - -##### `reactruntime.HeadTemplate` / `reactruntime.BodyTemplate` - -This is the component you should used in your own `view.HeadFactory`: - -```javascript -const {HeadTemplate, BodyTemplate} = require("../../reactruntime"); -class Head extends React.Component { - render() { - return ( - - - - - ); - } -} -class Body extends React.Component { - render() { - return ( - - Some markup - - ); - } -} - -exports.HeadFactory = React.createFactory(Head); -exports.BodyFactory = React.createFactory(Body); -``` - -#### `reactrender.render` - -This is used on the server side, like: - -```javascript -const reactrender = require("reactrender"); - -app.get("/something", function (req, res) { - const page = require("./page").page; - reactrender.render(req, res, page); -}); -``` - -This handles calling the model instantiation, instantiating the views, and gluing that all together into a page. - -It also sets up `this.props.staticLink` on the client and server. - -### Making - -The make process is kind of crude, mostly because how browserify fits in is pretty crude. A problem with respect to browserify is that `require()` with dynamic arguments does not work well (even if the module is actually available in the bundle). You'll note a superfluous require in `reactruntime` to work around this problem. - -Also each browserify bundle is independently enumerated and handled in the `Makefile`. - -I'm thinking of scanning for `server/src/pages/*/page.js` and generating Makefile statements from that, but that makes me somewhat sad. diff --git a/test/server/clientlib.py b/test/server/clientlib.py deleted file mode 100644 index b5a5e6715e..0000000000 --- a/test/server/clientlib.py +++ /dev/null @@ -1,258 +0,0 @@ -import os -import re -import contextlib -import requests -from urlparse import urljoin -import json -import uuid -import random -import time -from pglib import attach_device, get_device_id, get_account_cookie_detail - -example_images = {} -execfile(os.path.normpath(os.path.join(__file__, "../../../bin/load_test_exercise_images.py")), example_images) -example_images = example_images["example_images"] - - -class ScreenshotsBase(object): - - def __init__(self, backend="http://localhost:10080", hasAccount=None): - self.backend = backend - self.secret = make_uuid() - self.session = requests.Session() - self.session.headers.update({'Accept-Language': 'en-US'}) - self.hasAccount = hasAccount - if hasAccount: - self.accountId = make_random_id() - - def login(self, account_id): - # Logs the session in by first checking if a device is - # associated with account_id and updating session with account cookie - device_id = get_device_id(account_id) - if device_id: - account_info = get_account_cookie_detail(account_id) - self.session.cookies.update(account_info) - return device_id - - def _get_id_from_url(self, url): - assert url.startswith(self.backend) - id = url[len(self.backend):] - id = id.strip('/') - return id - - def read_shot(self, url): - # FIXME: should get at least the clip image subresource itself - resp = self.session.get(url) - resp.raise_for_status() - page = resp.text - clip_match = re.search(r']*src="([^"]+)"', page) - clip_url = clip_content = clip_content_type = None - if clip_match: - clip_url = clip_match.group(1) - if clip_url: - resp = self.session.get(clip_url) - clip_content = resp.content - clip_content_type = resp.headers['content-type'] - csrf_match = re.search(r'"csrfToken":"([^"]*)"', page) - csrf = None - if csrf_match: - csrf = csrf_match.group(1) - title_match = re.search(r'([^<]*)', page) - title = None - if title_match: - title = title_match.group(1) - download_match = re.search(r'"([^"]+?download=[^"]+)"', page) - download_url = None - if download_match: - download_url = download_match.group(1).replace("&", "&") - return { - "page": page, - "clip_url": clip_url, - "clip_content": clip_content, - "clip_content_type": clip_content_type, - "csrf": csrf, - "title": title, - "download_url": download_url, - } - - def delete_shot(self, url): - shot_id = self._get_id_from_url(url) - csrf = self.read_shot(url)["csrf"] - assert csrf, "No CSRF found" - resp = self.session.post( - self.backend + "/api/delete-shot", - {"id": shot_id, "_csrf": csrf}) - resp.raise_for_status() - - def set_expiration(self, url, seconds): - shot_id = self._get_id_from_url(url) - csrf = self.read_shot(url)["csrf"] - assert csrf, "No CSRF found" - resp = self.session.post( - self.backend + '/api/set-expiration', - {"id": shot_id, "expiration": str(seconds), "_csrf": csrf}) - resp.raise_for_status() - - def read_my_shots_json(self): - resp = self.session.get(urljoin(self.backend, "/shots?withdata=true&data=json")) - resp.raise_for_status() - return resp - - -class ScreenshotsClient(ScreenshotsBase): - def __init__(self, backend="http://localhost:10080", hasAccount=None): - ScreenshotsBase.__init__(self, backend="http://localhost:10080", hasAccount=hasAccount) - self.deviceInfo = make_device_info() - self.deviceId = make_uuid() - - def login(self): - resp = self.session.post( - urljoin(self.backend, "/api/login"), - data=dict(deviceId=self.deviceId, secret=self.secret, deviceInfo=json.dumps(self.deviceInfo))) - if resp.status_code == 404: - resp = self.session.post( - urljoin(self.backend, "/api/register"), - data=dict(deviceId=self.deviceId, secret=self.secret, deviceInfo=json.dumps(self.deviceInfo))) - if self.hasAccount: - account_info = attach_device(self.deviceId, self.accountId) - self.session.cookies.update(account_info) - - resp.raise_for_status() - return resp - - def delete_account(self): - page = self.session.get(self.backend + "/leave-screenshots/").text - csrf_match = re.search(r' /settings - # with set-cookie actually sets _csrf - # depends on the client - resp = user.get_uri(urljoin(user.backend, "/settings")) - assert resp.status_code == 200 - assert resp.cookies.get('_csrf', None) is None - - -def test_get_shot_sets_csrf_cookie(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1", image_index=0) - shot_id = urlsplit(shot_url).path.strip("/") - user.create_shot(shot_id=shot_id, docTitle="A_TEST_SITE_2", image_index=1) - - resp = user.session.get(shot_url) - resp.raise_for_status() - assert_httponly_csrf_cookie(user.session) - - -def test_get_my_shots_sets_csrf_cookie(): - with screenshots_session() as user: - user.read_my_shots() # raises on error - assert_httponly_csrf_cookie(user.session) - - -def test_delete_shot_with_valid_csrftoken_ok(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - user.delete_shot(shot_url) # reads and uses csrf token from shot page - - -def test_delete_shot_with_invalid_csrftoken_fails(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - shot_id = user._get_id_from_url(shot_url) - resp = user.session.post( - urljoin(user.backend, "/api/delete-shot"), - {"id": shot_id, "_csrf": "bad-csrf-token"}) - print(resp.text) - assert resp.status_code == 403 # Bad CSRF Token - - user.delete_shot(shot_url) # cleanup - - -def test_delete_shot_without_csrftoken_fails(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - shot_id = user._get_id_from_url(shot_url) - resp = user.session.post( - urljoin(user.backend, "/api/delete-shot"), - {"id": shot_id}) - print(resp.text) - assert resp.status_code == 403 # Bad CSRF Token - - user.delete_shot(shot_url) # cleanup - - -def test_shot_set_expiration_with_valid_csrftoken_ok(): - with screenshots_session(hasAccount=True) as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - user.set_expiration(shot_url, 290) # reads and uses csrf token from shot page - - user.delete_shot(shot_url) # cleanup - - -def test_shot_set_expiration_with_invalid_csrftoken_fails(): - with screenshots_session(hasAccount=True) as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - shot_id = user._get_id_from_url(shot_url) - resp = user.session.post( - urljoin(user.backend, "/api/set-expiration"), - {"id": shot_id, "expiration": "60", "_csrf": "bad-csrf-token"}) - print(resp.text) - assert resp.status_code == 403 # Bad CSRF Token - - user.delete_shot(shot_url) # cleanup - - -def test_shot_set_expiration_without_csrftoken_fails(): - with screenshots_session(hasAccount=True) as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - shot_id = user._get_id_from_url(shot_url) - resp = user.session.post( - urljoin(user.backend, "/api/set-expiration"), - {"id": shot_id, "expiration": "60"}) - print(resp.text) - assert resp.status_code == 403 # Bad CSRF Token - - user.delete_shot(shot_url) # cleanup - - -def test_shot_set_title_with_valid_csrftoken_ok(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - user.set_title(shot_url, "New Screenshot Title") # reads and uses csrf token from shot page - - user.delete_shot(shot_url) # cleanup - - -def test_shot_set_title_with_invalid_csrftoken_fails(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - shot_id = user._get_id_from_url(shot_url) - resp = user.session.post( - urljoin(urljoin(user.backend, "/api/set-title/"), shot_id), - {"id": shot_id, "title": "new title", "_csrf": "bad-csrf-token"}) - print(resp.text) - assert resp.status_code == 403 # Bad CSRF Token - - user.delete_shot(shot_url) # cleanup - - -def test_shot_set_title_without_csrftoken_fails(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - shot_id = user._get_id_from_url(shot_url) - resp = user.session.post( - urljoin(urljoin(user.backend, "/api/set-title/"), shot_id), - {"id": shot_id, "title": "new title"}) - print(resp.text) - assert resp.status_code == 403 # Bad CSRF Token - - user.delete_shot(shot_url) # cleanup - -# TODO: figure out why this takes a minute to run -# def test_shot_edit_with_valid_csrftoken_ok(): -# with screenshots_session() as user: -# shot_url = user.create_shot(docTitle="A_TEST_SITE_1") -# user.edit_shot(shot_url, dict(url="https://example.com/edited")) - -# user.delete_shot(shot_url) # cleanup - - -def test_shot_edit_with_invalid_csrftoken_fails(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - shot_id = user._get_id_from_url(shot_url) - - body = {"shotId": shot_id, "_csrf": "bad-csrf-token"} - body.update(dict(url="https://example.com/edited")) - resp = user.session.post( - urljoin(user.backend, '/api/save-edit'), - body) - print(resp.text) - assert resp.status_code == 403 # Bad CSRF Token - - user.delete_shot(shot_url) # cleanup - - -def test_shot_edit_without_csrftoken_fails(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - shot_id = user._get_id_from_url(shot_url) - - body = {"shotId": shot_id, "_csrf": "bad-csrf-token"} - body.update(dict(url="https://example.com/edited")) - resp = user.session.post( - urljoin(user.backend, '/api/save-edit'), - body) - print(resp.text) - assert resp.status_code == 403 # Bad CSRF Token - - user.delete_shot(shot_url) # cleanup - - -def test_disconnect_device_with_valid_csrftoken_ok(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1") - csrf = user.read_shot(shot_url)["csrf"] - - resp = user.session.post( - urljoin(user.backend, '/api/disconnect-device/'), - {"_csrf": csrf}) - print(resp.text) - assert resp.status_code == 200 # ok? - - user.delete_shot(shot_url) # cleanup - - -def test_disconnect_device_with_invalid_csrftoken_fails(): - with screenshots_session() as user: - resp = user.session.post( - urljoin(user.backend, '/api/disconnect-device/'), - {"_csrf": "bad-token"}) - print(resp.text) - assert resp.status_code == 403 # Bad CSRF Token - - -def test_disconnect_device_without_csrftoken_fails(): - with screenshots_session() as user: - resp = user.session.post( - urljoin(user.backend, '/api/disconnect-device/')) - print(resp.text) - assert resp.status_code == 403 # Bad CSRF Token - - -def test_login_with_invalid_headers(): - # might belong in test_auth.py instead - unauthed_user = ScreenshotsClient() - resp = unauthed_user.session.post( - urljoin(unauthed_user.backend, "/api/login"), - headers=dict(origin="https://localhost:8080"), - data=dict(secret=unauthed_user.secret, - deviceInfo=json.dumps(unauthed_user.deviceInfo))) - - print resp.text - assert resp.status_code == 403 # Invalid CSRF Headers - - -def test_register_with_invalid_headers(): - # might belong in test_auth.py instead - unauthed_user = ScreenshotsClient() - resp = unauthed_user.session.post( - urljoin(unauthed_user.backend, "/api/register"), - headers=dict(referer="https://localhost:8080/1Zv4srJfp50f5LaJ/localhost"), - data=dict(deviceId=unauthed_user.deviceId, - secret=unauthed_user.secret, - deviceInfo=json.dumps(unauthed_user.deviceInfo))) - - print resp.text - assert resp.status_code == 403 # Invalid CSRF Headers - - -if __name__ == "__main__": - test_leave_screenshots_with_valid_csrftoken_ok() - test_leave_screenshots_with_invalid_csrftoken_fails() - test_leave_screenshots_without_csrftoken_fails() - test_leave_screenshots_with_get_fails() - test_leave_screenshots_with_duplicate_csrf_cookies_fails() - test_leave_screenshots_clears_csrf_cookie() - test_get_settings_does_not_set_csrf_cookie() - test_get_shot_sets_csrf_cookie() - test_get_my_shots_sets_csrf_cookie() - test_delete_shot_with_valid_csrftoken_ok() - test_delete_shot_with_invalid_csrftoken_fails() - test_delete_shot_without_csrftoken_fails() - test_shot_set_expiration_with_valid_csrftoken_ok() - test_shot_set_expiration_with_invalid_csrftoken_fails() - test_shot_set_expiration_without_csrftoken_fails() - test_shot_set_title_with_valid_csrftoken_ok() - test_shot_set_title_with_invalid_csrftoken_fails() - test_shot_set_title_without_csrftoken_fails() - # test_shot_edit_with_valid_csrftoken_ok() - test_shot_edit_with_invalid_csrftoken_fails() - test_shot_edit_without_csrftoken_fails() - test_disconnect_device_with_valid_csrftoken_ok() - test_disconnect_device_with_invalid_csrftoken_fails() - test_disconnect_device_without_csrftoken_fails() - test_login_with_invalid_headers() - test_register_with_invalid_headers() diff --git a/test/server/test_file_management.py b/test/server/test_file_management.py deleted file mode 100644 index 26d9d11abd..0000000000 --- a/test/server/test_file_management.py +++ /dev/null @@ -1,242 +0,0 @@ -import os -import urllib -import clientlib -import time -import atexit -from sarge import Capture, run -import pytest -pytestmark = pytest.mark.slow - -SERVER_URL = "http://localhost:10180" - -tmp_dir = os.path.abspath(os.path.join(__file__, "../tmp")) -if not os.path.exists(tmp_dir): - os.makedirs(tmp_dir) -project_base = os.path.abspath(os.path.join(__file__, "../../..")) - -# This is where we do our "local" storage of S3 images: -data_path = os.path.join(project_base, "data") - - -def teardown_function(func): - show_server_output() - - -def make_session(hasAccount=None): - session = clientlib.ScreenshotsClient(SERVER_URL, hasAccount=hasAccount) - session.login() - return session - - -def test_s3_upload(): - restart_server() - session = make_session() - shot_url = session.create_shot() - page = session.read_shot(shot_url) - assert read_file(page["clip_url"]) is not None - assert read_file(page["clip_url"]) == get_url(page["clip_url"]) - - -def test_s3_expire(): - restart_server() - session = make_session(hasAccount=True) - shot_url = session.create_shot() - page = session.read_shot(shot_url) - session.set_expiration(shot_url, 1) - time.sleep(2) - expired_page = session.read_shot(shot_url) - # An expired page happens to be unparseable: - assert expired_page["clip_content"] is None - assert read_file(page["clip_url"]) is not None - get_url(page["clip_url"], expect=404) - get_url(shot_url, expect=200) - - -def test_s3_delete(): - restart_server() - session = make_session() - shot_url = session.create_shot() - page = session.read_shot(shot_url) - assert read_file(page["clip_url"]) is not None - session.delete_shot(shot_url) - get_url(shot_url, expect=404) - get_url(page["clip_url"], expect=404) - assert read_file(page["clip_url"]) is None - - -def test_s3_delete_after_expire(): - restart_server() - session = make_session(hasAccount=True) - shot_url = session.create_shot() - page = session.read_shot(shot_url) - session.set_expiration(shot_url, 1) - time.sleep(2) - assert read_file(page["clip_url"]) is not None - get_url(page["clip_url"], expect=404) - get_url(shot_url, expect=200) - session.delete_shot(shot_url) - get_url(shot_url, expect=404) - get_url(page["clip_url"], expect=404) - assert read_file(page["clip_url"]) is None - - -def test_s3_final_expire(): - restart_server(EXPIRED_RETENTION_TIME=1, CHECK_DELETED_INTERVAL="0.1") - session = make_session(hasAccount=True) - shot_url = session.create_shot() - page = session.read_shot(shot_url) - assert read_file(page["clip_url"]) is not None - session.set_expiration(shot_url, 1) - time.sleep(10) - get_url(page["clip_url"], expect=404) - get_url(shot_url, expect=404) - assert read_file(page["clip_url"]) is None - - -def test_s3_failed_delete(): - restart_server(EXPIRED_RETENTION_TIME=1, CHECK_DELETED_INTERVAL="0.1") - session = make_session(hasAccount=True) - shot_url = session.create_shot() - page = session.read_shot(shot_url) - assert read_file(page["clip_url"]) is not None - # By deleting the file, we will cause the expiring delete to fail: - delete_file(page["clip_url"]) - get_url(SERVER_URL + "/now-we-have-deleted-the-image") - assert read_file(page["clip_url"]) is None - session.set_expiration(shot_url, 1) - time.sleep(10) - get_url(page["clip_url"], expect=404) - get_url(shot_url, expect=404) - assert read_file(page["clip_url"]) is None - # Now we put the file back so that the next delete can succeed: - write_file(page["clip_url"], page["clip_content"]) - get_url(SERVER_URL + "/now-we-have-put-the-image-back") - time.sleep(10) - get_url(page["clip_url"], expect=404) - get_url(shot_url, expect=404) - assert read_file(page["clip_url"]) is None - - -# TODO: implement configurable periodic failure of the fake S3, and make sure -# things are resilient - -server = None -server_out = None -server_options = None - - -def restart_server(**extra_env): - global server, server_out, server_options - for key in extra_env: - extra_env[key] = str(extra_env[key]) - if server and server_options == extra_env: - print(" Server already started with correct options") - return - stop_server() - env = os.environ.copy() - env.update(extra_env) - env['PORT'] = '10180' - env['SITE_ORIGIN'] = 'localhost:10180' - env['CONTENT_ORIGIN'] = 'localhost:10180' - env['GA_ID'] = '' - env['NODE_ENV'] = 'production' - env['LOG_QUERY_LIMIT'] = '0' - env['ENABLE_WATCHDOG'] = 'false' - server_out = Capture() - env_print = ['%s=%s' % (name, value) for name, value in sorted(extra_env.items())] - if env_print: - env_print = ' (%s)' % ' '.join(env_print) - else: - env_print = '' - print(' Starting server%s' % env_print) - server = run('./bin/run-server --no-auto', cwd=project_base, env=env, stdout=server_out, async_=True) - server_options = extra_env - time.sleep(3) - text = [] - while True: - if server.commands[0].process and server.commands[0].poll(): - print(' Server exited with code %s' % server.commands[0].poll()) - text.extend(server_out.readlines()) - for line in text: - print(' %s' % line.rstrip()) - print(" %s" % ("-" * 60)) - raise Exception("Server didn't start") - line = server_out.readline() - if line: - text.append(line) - if 'Database is now at level' in line: - # Last log message before the server is running - break - if 'skip-db-down-patches' in line: - break - print(" Server started") - - -def show_server_output(): - print(" Server output: %s" % ("-" * 35)) - for line in server_out.readlines(): - print(" {}".format(line.rstrip())) - print(" %s" % ("-" * 50)) - - -def stop_server(): - global server, server_out - if server: - if not server.commands[0].process or server.commands[0].poll(): - # Server has already stopped - return - print(" Stopping server") - for command in server.commands: - if command.process and not command.poll(): - command.terminate() - for command in server.commands: - if command.process and not command.poll(): - command.kill() - server.wait() - print(" Server should be stopped") - server = None - server_out = None - - -atexit.register(stop_server) - - -def get_url(url, expect=None): - result = urllib.urlopen(url) - if expect and result.getcode() != expect: - raise Exception("GET {} returned status {}".format(url, result.getcode())) - return result.read() - - -def filename_for_clip_url(clip_url): - name = clip_url.split("/")[-1] - return os.path.join(data_path, name) - - -def read_file(clip_url): - filename = filename_for_clip_url(clip_url) - if not os.path.exists(filename): - return None - with open(filename, "rb") as fp: - return fp.read() - - -def delete_file(clip_url): - filename = filename_for_clip_url(clip_url) - os.unlink(filename) - - -def write_file(clip_url, content): - filename = filename_for_clip_url(clip_url) - with open(filename, "wb") as fp: - fp.write(content) - - -def show_server_output_on_failure(func): - def replacement(*args, **kw): - try: - return func(*args, **kw) - except: - show_server_output() - raise - return replacement diff --git a/test/server/test_image_validation.py b/test/server/test_image_validation.py deleted file mode 100644 index 3d478b3f24..0000000000 --- a/test/server/test_image_validation.py +++ /dev/null @@ -1,100 +0,0 @@ -from urlparse import urljoin -from clientlib import ( - make_example_shot, - make_random_id, - screenshots_session, - example_images -) -import random - -# Hack to make this predictable: -random.seed(0) - - -def user_setup(): - with screenshots_session() as user: - shot_id = make_random_id() + "/test.com" - shot_data = urljoin(user.backend, "data/" + shot_id) - shot_json = make_example_shot(user.deviceId) - return (shot_data, shot_json, user) - - -def test_invalid_png_data_image(): - image = example_images[0]['url'] - (shot_data, shot_json, user) = user_setup() - valid_header = "data:image/png;base64,iVBORw0KGgo" - invalid_header = 'data:image/png;base64,R0k' - assert valid_header in image - - clip_id = next(iter(shot_json['clips'])) - shot_json['clips'][clip_id]['image']['url'] = invalid_header - - resp = user.session.put(shot_data, json=shot_json,) - print(resp.text) - assert resp.status_code == 500 - - -def test_invalid_png_data_image_decoded(): - image = example_images[0]['url'] - (shot_data, shot_json, user) = user_setup() - assert "iVBORw0KGgo" in image - - invalid_data_image = 'data:image/png;base64,someIM4gEgo' - - clip_id = next(iter(shot_json['clips'])) - shot_json['clips'][clip_id]['image']['url'] = invalid_data_image - - resp = user.session.put(shot_data, json=shot_json,) - print(resp.text) - assert resp.status_code == 500 - - -def test_invalid_data_url(): - image = example_images[0]['url'] - (shot_data, shot_json, user) = user_setup() - assert "data:image/png;base64" in image - invalid_data_url = image.replace('data:image/png', 'data:image/foo') - - clip_id = next(iter(shot_json['clips'])) - shot_json['clips'][clip_id]['image']['url'] = invalid_data_url - - resp = user.session.put(shot_data, json=shot_json,) - print(resp.text) - assert resp.status_code == 500 - - -def test_invalid_jpeg_data_image(): - image = example_images[3]['url'] - (shot_data, shot_json, user) = user_setup() - valid_header = "data:image/jpeg;base64,/9j/2wBDAAQDAwQDAwQEAwQFBAQ" - invalid_header = "data:image/jpeg;base64,BAAQ" - assert valid_header in image - - clip_id = next(iter(shot_json['clips'])) - shot_json['clips'][clip_id]['image']['url'] = invalid_header - - resp = user.session.put(shot_data, json=shot_json,) - print(resp.text) - assert resp.status_code == 500 - - -def test_invalid_data_jpeg_image_decoded(): - image = example_images[3]['url'] - (shot_data, shot_json, user) = user_setup() - assert '/9j/2wBDAAQDAwQDAw' in image - invalid_data_image = 'data:image/jpeg;base64,someIM4gEt0Try' - - clip_id = next(iter(shot_json['clips'])) - shot_json['clips'][clip_id]['image']['url'] = invalid_data_image - - resp = user.session.put(shot_data, json=shot_json,) - print(resp.text) - assert resp.status_code == 500 - - -if __name__ == "__main__": - test_invalid_jpeg_data_image() - test_invalid_png_data_image() - test_invalid_png_data_image_decoded() - test_invalid_data_jpeg_image_decoded() - test_invalid_data_url() diff --git a/test/server/test_responses.py b/test/server/test_responses.py deleted file mode 100644 index 0dcecd738b..0000000000 --- a/test/server/test_responses.py +++ /dev/null @@ -1,134 +0,0 @@ -from clientlib import ScreenshotsClient, screenshots_session -import urlparse -from urlparse import urljoin -import random -import requests -from requests import HTTPError - - -# Hack to make this predictable: -random.seed(0) - - -def test_put_large_image(): - user = ScreenshotsClient() - user.login() - try: - try: - user.create_shot(pad_image_to_length=100 * 1000 * 1000) - except HTTPError, e: - if e.response.status_code != 413: - raise - finally: - user.delete_account() - - -def test_bad_id(): - user = ScreenshotsClient() - user.login() - try: - try: - user.create_shot(shot_id="!!!/test.com") - except HTTPError, e: - if e.response.status_code != 400: - raise - finally: - user.delete_account() - - -def test_settings_page(): - with screenshots_session() as user: - user.get_settings() # raises for http error - - -def test_settings_page_requires_auth(): - user = ScreenshotsClient() - - resp = requests.get(urljoin(user.backend, "/settings")) - assert resp.url == user.backend + "/" - - -def test_metrics_page(): - unauthed_user = ScreenshotsClient() - - resp = requests.get(urljoin(unauthed_user.backend, "/metrics")) - assert resp.status_code == 200 - - -def test_landing_page(): - unauthed_user = ScreenshotsClient() - - resp = unauthed_user.get_uri("/") - assert resp.status_code == 200 - - -def test_creating_page(): - with screenshots_session() as user: - shot_url = user.create_shot(docTitle="A_TEST_SITE_1", image_index=0) - shot_id = urlparse.urlsplit(shot_url).path.strip("/") - - resp = user.get_uri("/creating/" + shot_id) - assert resp.status_code == 200 - - unauthed_user = ScreenshotsClient() - - resp = requests.get(urljoin(unauthed_user.backend, "/creating/") + shot_id) - assert resp.status_code == 200 - - -def test_404_page(): - unauthed_user = ScreenshotsClient() - response = unauthed_user.get_uri("/404") - if response.status_code != 404: - response.raise_for_status() - - -def test_contribute_json(): - unauthed_user = ScreenshotsClient() - response = unauthed_user.get_uri("/contribute.json") - if response.status_code != 200: - response.raise_for_status() - - -def test_dunder_version(): - unauthed_user = ScreenshotsClient() - response = unauthed_user.get_uri("/__version__") - response.raise_for_status() - - -def test_heartbeat(): - unauthed_user = ScreenshotsClient() - response = unauthed_user.get_uri("/__heartbeat__") - response.raise_for_status() - - -def test_lbheartbeat(): - unauthed_user = ScreenshotsClient() - response = unauthed_user.get_uri("/__lbheartbeat__") - response.raise_for_status() - - -def test_my_shots_page(): - with screenshots_session() as user: - user.read_my_shots() - - # e.g. direct navigation to /shots in private window - unauthed_user = ScreenshotsClient() - response = unauthed_user.get_uri("/shots") - response.raise_for_status() - - -if __name__ == "__main__": - test_put_large_image() - test_bad_id() - test_settings_page() - test_settings_page_requires_auth() - test_metrics_page() - test_landing_page() - test_creating_page() - test_404_page() - test_contribute_json() - test_dunder_version() - test_heartbeat() - test_lbheartbeat() - test_my_shots_page() diff --git a/test/server/test_shot_put_auth.py b/test/server/test_shot_put_auth.py deleted file mode 100644 index 892a385cf1..0000000000 --- a/test/server/test_shot_put_auth.py +++ /dev/null @@ -1,51 +0,0 @@ -import urlparse -from clientlib import ScreenshotsClient -import random -import requests - -# Hack to make this predictable: -random.seed(0) - - -def test_put_auth(): - first_user = ScreenshotsClient() - second_user = ScreenshotsClient() - first_user.login() - second_user.login() - shot_url = first_user.create_shot(docTitle="A_TEST_SITE_1") - shot_id = urlparse.urlsplit(shot_url).path.strip("/") - shot_page = first_user.read_shot(shot_url) - print(first_user.read_shot(shot_url)["clip_url"], shot_page["clip_url"]) - assert first_user.read_shot(shot_url)["clip_content"] == shot_page["clip_content"] - assert "A_TEST_SITE_1" in shot_page["page"] - try: - second_user.create_shot(shot_id=shot_id, docTitle="A_TEST_SITE_2") - except requests.HTTPError as e: - if e.response.status_code != 403: - raise - else: - assert False, "Second attempt to upload should have failed" - second_shot_page = first_user.read_shot(shot_url) - assert "A_TEST_SITE_1" in second_shot_page["page"] - assert "A_TEST_SITE_2" not in second_shot_page["page"] - assert shot_page["clip_url"] == second_shot_page["clip_url"] - assert shot_page["clip_content"] == second_shot_page["clip_content"] - - -def test_update(): - user = ScreenshotsClient() - user.login() - shot_url = user.create_shot(docTitle="A_TEST_SITE_1", image_index=0) - shot_page = user.read_shot(shot_url) - assert "A_TEST_SITE_1" in shot_page["page"] - shot_id = urlparse.urlsplit(shot_url).path.strip("/") - user.create_shot(shot_id=shot_id, docTitle="A_TEST_SITE_2", image_index=1) - later_shot_page = user.read_shot(shot_url) - assert "A_TEST_SITE_2" in later_shot_page["page"] - assert later_shot_page["clip_content"] - assert later_shot_page["clip_content"] != shot_page["clip_content"] - assert later_shot_page["clip_url"] != shot_page["clip_url"] - - -if __name__ == "__main__": - test_put_auth() diff --git a/test/server/test_signatures.py b/test/server/test_signatures.py deleted file mode 100644 index d9fa556aaf..0000000000 --- a/test/server/test_signatures.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import print_function -from clientlib import ScreenshotsClient -import urllib - - -def test_download_key(): - user = ScreenshotsClient() - user.login() - shot_1_url = user.create_shot(docTitle="A_TEST_SITE_1") - shot_2_url = user.create_shot(docTitle="A_TEST_SITE_2") - shot_1_page = user.read_shot(shot_1_url) - shot_2_page = user.read_shot(shot_2_url) - shot_1_download_url = shot_1_page["download_url"] - shot_2_download_url = shot_2_page["download_url"] - resp = user.session.get(shot_1_download_url) - # This should normally work: - print("Normal download URL:", shot_1_download_url) - assert resp.headers["Content-Disposition"], "Should get a proper download response" - mixed_up = shot_1_download_url.split("?")[0] + "?" + shot_2_download_url.split("?")[1] - # Getting mixed_up should fail, since the signed download parameter comes from shot_2 - # but we're fetching the image from shot_1 - resp = user.session.get(mixed_up) - print("Mixed-up URL:", mixed_up) - print("Response:", resp) - print("Content-Disposition header:", resp.headers.get("Content-Disposition")) - assert not resp.headers.get("Content-Disposition"), "The signature shouldn't work" - - -def test_scopes(): - user = ScreenshotsClient() - user.login() - abtests = user.session.cookies["abtests"] - abtests_sig = user.session.cookies["abtests.sig"] - print(abtests, abtests_sig) - shot = user.create_shot(docTitle="A_TEST_SITE") - page = user.read_shot(shot) - download_url = page["download_url"] - resp = user.session.get(download_url) - assert resp.headers.get("Content-Disposition") - mixed_up = "%s?download=%s&sig=%s" % ( - download_url.split("?")[0], - urllib.quote(abtests), - urllib.quote(abtests_sig), - ) - resp = user.session.get(mixed_up) - assert not resp.headers.get("Content-Disposition") - - -if __name__ == "__main__": - test_download_key() - test_scopes() diff --git a/test/server/unit/l10n-test.js b/test/server/unit/l10n-test.js deleted file mode 100644 index 38abff8c32..0000000000 --- a/test/server/unit/l10n-test.js +++ /dev/null @@ -1,61 +0,0 @@ -const assert = require("assert"); -const l10n = require("../../../server/src/l10n.js"); - -const localeData = { - "al-GO": "abc = 123\n", - "bb-MO": "abc = 321\nsoccer = football\n", - "cb-gb": "abc = ABC\n", - "en-US": "abc = abc\n", - "he": "abc = abc\n", -}; - -/* globals describe, it */ - -describe("l10n", () => { - before(() => { - return l10n.init(localeData); - }); - describe("getUserLocales", () => { - it("should fall back to en-US if requested language has no localization", () => { - const locales = l10n.getUserLocales(["yo-LO"]); - assert.ok(locales.includes("en-US")); - }); - it("should fall back to en-US if requested language is missing", () => { - const locales = l10n.getUserLocales([]); - assert.ok(locales.includes("en-US")); - }); - it("should include default en-US locale if requested locales exist", () => { - const locales = l10n.getUserLocales(["al-GO", "bb-MO"]); - assert.ok(locales.includes("en-US")); - }); - }); - describe("getText", () => { - it("should return the first available formatted message for the given L10n ID", () => { - const getText = l10n.getText(["al-GO", "bb-MO"]); - assert.equal(getText("abc"), "123"); - assert.equal(getText("soccer"), "football"); - }); - it("should return an empty string when a L10n ID is not found", () => { - const getText = l10n.getText(["al-GO", "bb-MO"]); - assert.equal(getText("xyz"), ""); - }); - }); - describe("getString", () => { - it("should return the L10n strings of available locales", () => { - const given = l10n.getStrings(["no-PE", "bb-MO"]); - assert.equal(given["bb-MO"], localeData["bb-MO"]); - }); - it("should always return the default en-US L10n string", () => { - const given = l10n.getStrings(["no-PE", "go-TO"]); - assert.deepEqual(given, {"en-US": localeData["en-US"]}); - }); - }); - describe("getIsRtl", () => { - it("should be truthy for he, ar, fa, ur", () => { - assert(l10n.getIsRtl(["he-IL", "en-US"])); - }); - it("should be falsy for other locales", () => { - assert(!l10n.getIsRtl(["en-US", "he-il"])); - }); - }); -}); diff --git a/test/server/unit/middleware/l10n-test.js b/test/server/unit/middleware/l10n-test.js deleted file mode 100644 index 21842d629d..0000000000 --- a/test/server/unit/middleware/l10n-test.js +++ /dev/null @@ -1,21 +0,0 @@ -const assert = require("assert"); -const l10n = require("../../../../server/src/middleware/l10n.js"); - -/* globals describe, it */ - -describe("l10n middleware", () => { - describe("getLanguage function (Accept-Language header parsing)", () => { - it('should return ["en-US"] if Accept-Language header is missing', () => { - const mockRequest = { headers: {} }; - const results = l10n.getLanguages(mockRequest); - assert(results.length === 1); - assert.equal("en-US", results[0]); - }); - it('should return ["en-US"] if Accept-Language header value is "*"', () => { - const mockRequest = { headers: { "accept-language": "*" }}; - const results = l10n.getLanguages(mockRequest); - assert(results.length === 1); - assert.equal("en-US", results[0]); - }); - }); -}); diff --git a/test/server/unit/pages/homepage/model-test.js b/test/server/unit/pages/homepage/model-test.js deleted file mode 100644 index ff367d39fb..0000000000 --- a/test/server/unit/pages/homepage/model-test.js +++ /dev/null @@ -1,41 +0,0 @@ -const assert = require("assert"); -const { getFirefoxVersion, isMobile } = require("../../../../../server/src/pages/homepage/model.js"); - -/* globals describe, it */ - -describe("homepage model", () => { - describe("getFirefoxVersion User Agent string check", () => { - it('should return "57" for Desktop Firefox 57 on Mac', () => { - const ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:57.0) Gecko/20100101 Firefox/57.0"; - assert.equal(57, getFirefoxVersion(ua)); - }); - it("should return null for Chrome 60.0.3112.113 on Mac", () => { - const ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"; - assert.equal(null, getFirefoxVersion(ua)); - }); - it("should return null for Edge 40.15063.0.0 on Win 10", () => { - const ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063"; - assert.equal(null, getFirefoxVersion(ua)); - }); - it("should return null for IE 11 on Win 10", () => { - const ua = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"; - assert.equal(null, getFirefoxVersion(ua)); - }); - }); - describe("isMobile User Agent string check", () => { - it("should return false for Desktop Firefox 57", () => { - const ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:57.0) Gecko/20100101 Firefox/57.0"; - assert.equal(false, isMobile(ua)); - }); - it("should return true for Phone Fennec", () => { - // from https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox#Android_(version_41_and_above) - const ua = "Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0"; - assert.equal(true, isMobile(ua)); - }); - it("should return true for Tablet Fennec", () => { - // from https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox#Android_(version_41_and_above) - const ua = "Mozilla/5.0 (Android 4.4; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0"; - assert.equal(true, isMobile(ua)); - }); - }); -}); diff --git a/test/test-ab-test.js b/test/test-ab-test.js deleted file mode 100644 index 95d08355fa..0000000000 --- a/test/test-ab-test.js +++ /dev/null @@ -1,108 +0,0 @@ -const assert = require("assert"); -const abTests = require("../server/src/ab-tests.js"); - -describe("Test Screenshots", function() { - - before(() => { - abTests.setAllTestsForTesting({ - simpleTest: { - gaField: "cd3", - description: "Test without conflicts", - version: 1, - exclude: [], - options: [ - { - name: "bright", - probability: 0.3, - }, - { - name: "dark", - probability: 0.3, - }, - ], - }, - breakEverythingTest: { - gaField: "cd4", - shotField: "cd5", - description: "Test with conflicts", - version: 2, - exclude: ["*"], - options: [ - { - name: "fireworks", - probability: 0.1, - }, - { - name: "strobe", - probability: 0.1, - }, - ], - }, - }); - abTests.setRandomSequenceForTesting([]); - }); - - after(() => { - abTests.setAllTestsForTesting(undefined); - abTests.setRandomSequenceForTesting(undefined); - }); - - it("should set all to exclude when low probability", () => { - abTests.setRandomSequenceForTesting([0.9, 0.9]); - const tests = abTests.updateAbTests({}); - assert.deepEqual(tests, { - simpleTest: {value: "exclude", gaField: "cd3", version: 1}, - breakEverythingTest: {value: "exclude", gaField: "cd4", shotField: "cd5", version: 2}, - }); - }); - - it("should set some to control instead of a test", () => { - abTests.setRandomSequenceForTesting([0.1, 0.1]); - const tests = abTests.updateAbTests({}); - assert.deepEqual(tests, { - simpleTest: {value: "control", gaField: "cd3", version: 1}, - breakEverythingTest: {value: "exclude", gaField: "cd4", shotField: "cd5", version: 2}, - }); - }); - - - it("should not overwrite existing values", () => { - const tests = abTests.updateAbTests({ - simpleTest: {value: "control", gaField: "cd3", version: 1}, - breakEverythingTest: {value: "control", gaField: "cd4", shotField: "cd5", version: 2}, - }); - assert.deepEqual(tests, { - simpleTest: {value: "control", gaField: "cd3", version: 1}, - breakEverythingTest: {value: "control", gaField: "cd4", shotField: "cd5", version: 2}, - }); - }); - - it("should exclude the second test when the first is selected", () => { - let tests = abTests.updateAbTests({ - simpleTest: {value: "bright", gaField: "cd3", version: 1}, - }); - assert.deepEqual(tests, { - simpleTest: {value: "bright", gaField: "cd3", version: 1}, - breakEverythingTest: {value: "exclude", gaField: "cd4", shotField: "cd5", version: 2}, - }); - abTests.setRandomSequenceForTesting([0.35, 0.75]); - tests = abTests.updateAbTests({}); - assert.deepEqual(tests, { - simpleTest: {value: "dark", gaField: "cd3", version: 1}, - breakEverythingTest: {value: "exclude", gaField: "cd4", shotField: "cd5", version: 2}, - }); - }); - - it("should try to take someone out of exclude when version is bumped", () => { - abTests.setRandomSequenceForTesting([0.15, 0.75]); - const tests = abTests.updateAbTests({ - simpleTest: {value: "exclude", gaField: "cd3", version: 1}, - breakEverythingTest: {value: "exclude", gaField: "cd4", shotField: "cd5", version: 1}, - }); - assert.deepEqual(tests, { - simpleTest: {value: "exclude", gaField: "cd3", version: 1}, - breakEverythingTest: {value: "strobe", gaField: "cd4", shotField: "cd5", version: 2}, - }); - }); - -}); From a36b73434429362900c9f6e3978de6f1daaed19a Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Tue, 19 Mar 2019 18:46:04 -0500 Subject: [PATCH 02/15] Start removing miscellaneous bits and build bits --- Makefile | 143 +- bin/_run-docker | 8 - bin/build-docker-image | 33 - bin/build-scripts/bundle_dependencies | 71 - bin/pg_vars | 23 - bin/run-server | 79 - bin/test-request | 53 - docs/docker.md | 34 - docs/performance-testing.md | 17 - docs/server-release.md | 28 - docs/takedown.md | 41 - docs/testing-the-api.md | 167 - docs/watchdog.md | 73 - package-lock.json | 15278 ++++++------------- webextension/background/README.md | 1 - webextension/background/analytics.js | 239 +- webextension/background/auth.js | 220 - webextension/background/deviceInfo.js | 34 - webextension/background/startBackground.js | 2 - webextension/buildSettings.js.template | 1 - 20 files changed, 5015 insertions(+), 11530 deletions(-) delete mode 100755 bin/_run-docker delete mode 100755 bin/build-docker-image delete mode 100755 bin/build-scripts/bundle_dependencies delete mode 100755 bin/pg_vars delete mode 100755 bin/run-server delete mode 100755 bin/test-request delete mode 100644 docs/docker.md delete mode 100644 docs/performance-testing.md delete mode 100644 docs/server-release.md delete mode 100644 docs/takedown.md delete mode 100644 docs/testing-the-api.md delete mode 100644 docs/watchdog.md delete mode 100644 webextension/background/auth.js delete mode 100644 webextension/background/deviceInfo.js diff --git a/Makefile b/Makefile index 2ecb21eb37..a84c6b440d 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,8 @@ PATH := ./node_modules/.bin:./bin/:$(PATH) SHELL := /bin/bash -BABEL := babel --retain-lines RSYNC := rsync --archive VENV := .venv .DEFAULT_GOAL := help -# Sets $(SCREENSHOTS_BACKEND) to http://localhost:10080 only if it isn't set -SCREENSHOTS_BACKEND ?= http://localhost:10080 # Here we have source/dest variables for many files and their destinations; # we use these each to enumerate categories of source files, and translate @@ -15,21 +12,12 @@ SCREENSHOTS_BACKEND ?= http://localhost:10080 shared_source := $(wildcard shared/*.js) shared_server_dest := $(shared_source:%.js=build/%.js) -# static/js only gets copied to the server -static_js_source := $(wildcard static/js/*.js) -static_js_dest := $(static_js_source:%.js=build/server/%.js) - -server_source := $(shell find server/src -name '*.js') -server_dest := $(server_source:server/src/%.js=build/server/%.js) - # Also scss gets put into two locations: sass_source := $(wildcard static/css/*.scss) -sass_server_dest := $(sass_source:%.scss=build/server/%.css) $(sass_source:%.scss=build/server/%.ltr.css) $(sass_source:%.scss=build/server/%.rtl.css) partials_source := $(wildcard static/css/partials/*.scss) # And static images get placed somewhat eclectically: imgs_source := $(wildcard static/img/*) -imgs_server_dest := $(imgs_source:%=build/server/%) raven_source := $(shell node -e 'console.log(require.resolve("raven-js/dist/raven.js"))') @@ -39,60 +27,12 @@ l10n_dest := $(l10n_source:%/webextension.properties=webextension/_locales/%/mes ## General transforms: # These cover standard ways of building files given a source -# Need to put these two rules before the later general rule, so that we don't -# run babel on vendor libraries or the homepage libraries: -build/server/static/homepage/%.js: static/homepage/%.js - @mkdir -p $(@D) - cp $< $@ - -build/server/static/js/%.js: build/static/js/%.js - @mkdir -p $(@D) - cp $< $@ - -build/%.js: %.js - @mkdir -p $(@D) - $(BABEL) $< > $@ - -build/server/%.js: server/src/%.js - @mkdir -p $(@D) - $(BABEL) $< > $@ - -build/%.css: %.scss $(partials_source) - @mkdir -p $(@D) - node-sass $< $@ - %.ltr.css: %.css postcss $< -o $@ --config .postcss/ltr %.rtl.css: %.css postcss $< -o $@ --config .postcss/rtl -## Static files to be copied: - -build/%.png: %.png - @mkdir -p $(@D) - cp $< $@ - -build/%.css: %.css - @mkdir -p $(@D) - cp $< $@ - -build/%.svg: %.svg - @mkdir -p $(@D) - ./node_modules/.bin/svgo -q -i $< -o $@ - -build/%.sql: %.sql - @mkdir -p $(@D) - cp $< $@ - -build/%.ttf: %.ttf - @mkdir -p $(@D) - cp $< $@ - -build/%.html: %.html - @mkdir -p $(@D) - cp $< $@ - .PHONY: addon addon: npm set_backend set_sentry webextension/manifest.json addon_locales webextension/build/selection.js webextension/build/shot.js webextension/build/thumbnailGenerator.js webextension/build/inlineSelectionCss.js webextension/build/raven.js webextension/build/onboardingCss.js webextension/build/onboardingHtml.js webextension/build/buildSettings.js @@ -161,85 +101,14 @@ webextension/build/raven.js: $(raven_source) @mkdir -p $(@D) cp $< $@ -## Server related rules: - -# Copy shared files in from static/: -build/server/static/css/%.css: build/static/css/%.css - @mkdir -p $(@D) - cp $< $@ - -build/server/static/img/%: build/static/img/% - @mkdir -p $(@D) - cp $< $@ - -build/server/package.json: package.json - @mkdir -p $(@D) - cp $< $@ - -shot_dependencies := $(shell ./bin/build-scripts/bundle_dependencies shot getdeps "$(server_dest)") -build/server/static/js/shot-bundle.js: $(shot_dependencies) - ./bin/build-scripts/bundle_dependencies shot build ./build/server/pages/shot/controller.js - -homepage_dependencies := $(shell ./bin/build-scripts/bundle_dependencies homepage getdeps "$(server_dest)") -build/server/static/js/homepage-bundle.js: $(homepage_dependencies) - ./bin/build-scripts/bundle_dependencies homepage build ./build/server/pages/homepage/controller.js - -shotindex_dependencies := $(shell ./bin/build-scripts/bundle_dependencies shotindex getdeps "$(server_dest)") -build/server/static/js/shotindex-bundle.js: $(shotindex_dependencies) - ./bin/build-scripts/bundle_dependencies shotindex build ./build/server/pages/shotindex/controller.js - -leave_dependencies := $(shell ./bin/build-scripts/bundle_dependencies leave getdeps "$(server_dest)") -build/server/static/js/leave-bundle.js: $(leave_dependencies) - ./bin/build-scripts/bundle_dependencies leave build ./build/server/pages/leave-screenshots/controller.js - -creating_dependencies := $(shell ./bin/build-scripts/bundle_dependencies creating getdeps "$(server_dest)") -build/server/static/js/creating-bundle.js: $(creating_dependencies) - ./bin/build-scripts/bundle_dependencies creating build ./build/server/pages/creating/controller.js - -settings_dependencies := $(shell ./bin/build-scripts/bundle_dependencies settings getdeps "$(server_dest)") -build/server/static/js/settings-bundle.js: $(settings_dependencies) - ./bin/build-scripts/bundle_dependencies settings build ./build/server/pages/settings/controller.js - - -# The intention here is to only write build-time when something else needs -# to be regenerated, but for some reason this gets rewritten every time -# anyway: -build/server/build-time.js: homepage $(server_dest) $(shared_server_dest) $(sass_server_dest) $(imgs_server_dest) $(static_js_dest) $(patsubst server/db-patches/%,build/server/db-patches/%,$(wildcard server/db-patches/*)) - @mkdir -p $(@D) - ./bin/build-scripts/write_build_time.py > build/server/build-time.js - -# Convert all the server.ftl files into build/server/static/locales/[locale].js -build/server/static/locales: $(wildcard locales/**/server.ftl) - @mkdir -p $@ - ./bin/build-scripts/ftl-to-js.js $@ $^ - -.PHONY: server -server: npm build/server/build-time.js build/server/package.json build/server/static/js/shot-bundle.js build/server/static/js/homepage-bundle.js build/server/static/js/shotindex-bundle.js build/server/static/js/leave-bundle.js build/server/static/js/creating-bundle.js build/server/static/js/settings-bundle.js build/server/static/locales - -## Homepage related rules: - -build/server/static/homepage/%: static/homepage/% - @mkdir -p $(@D) - cp $< $@ - -.PHONY: homepage -homepage: $(patsubst static/homepage/%,build/server/static/homepage/%,$(shell find static/homepage -type f ! -name index.html)) - ## npm rule .PHONY: npm npm: build/.npm-install.log -build/.backend.txt: set_backend - -.PHONY: set_backend -set_backend: - @echo "Setting backend to ${SCREENSHOTS_BACKEND}" - ./bin/build-scripts/set_file build/.backend.txt $(SCREENSHOTS_BACKEND) - webextension/build/buildSettings.js: set_build_settings -.PHONY: set_build_settings +.PHONY: set_sentry set_sentry: @if [[ -z "$(SCREENSHOTS_SENTRY)" ]] ; then echo "No default Sentry" ; fi @if [[ -n "$(SCREENSHOTS_SENTRY)" ]] ; then echo "Setting default Sentry ${SCREENSHOTS_SENTRY}" ; fi @@ -256,11 +125,11 @@ build/.npm-install.log: package.json package-lock.json .SECONDARY: .PHONY: all -all: addon server +all: addon .PHONY: clean clean: - rm -rf build/ webextension/build/ webextension/manifest.json webextension/_locales/ + rm -rf webextension/build/ webextension/manifest.json webextension/_locales/ .PHONY: distclean distclean: clean @@ -269,14 +138,12 @@ distclean: clean .PHONY: help help: - @echo "Makes the addon and server" + @echo "Makes the addon" @echo "Commands:" @echo " make addon" @echo " make/update the addon directly in webextension/ (built files in webextension/build/)" - @echo " make server" - @echo " make the server in build/server/" @echo " make all" - @echo " equivalent to make server addon" + @echo " equivalent to make addon" @echo " make clean" @echo " rm -rf build/ webextension/build" @echo " make zip" diff --git a/bin/_run-docker b/bin/_run-docker deleted file mode 100755 index 0c94698d49..0000000000 --- a/bin/_run-docker +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -export USE_S3=true -export USE_VIRTUAL_HOSTS=true - -export PATH="/app/node_modules/.bin:$PATH" - -cd /app && node -e 'require("babel-polyfill"); require("./build/server/server");' diff --git a/bin/build-docker-image b/bin/build-docker-image deleted file mode 100755 index 6095f95620..0000000000 --- a/bin/build-docker-image +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -eu - -export NODE_ENV=${NODE_ENV:-production} - -cd "$(dirname ${BASH_SOURCE[0]})/.." - -if [[ $# = 0 ]] ; then - echo "Usage: $0 dockerhubusername [version]" - echo " builds the Screenshots docker image" - echo " Determines version from package.json" - echo " tags and uploads it as [dockerhubusername]/screenshots:[version]" - echo " version is read from package.json if not provided" - exit 4 -fi - -if [[ -n "${2:-}" ]] ; then - version="$2" -else - version="$(node -e 'console.log(require("./package.json").version)')" -fi - -make server - -xpi="build/screenshots.xpi" -if [[ ! -e "$xpi" ]] ; then - make signed_xpi -fi - -echo "Creating docker image $1/screenshots:$version" -docker build --pull -t $1/screenshots:"$version" . -docker push $1/screenshots:"$version" diff --git a/bin/build-scripts/bundle_dependencies b/bin/build-scripts/bundle_dependencies deleted file mode 100755 index 7139737108..0000000000 --- a/bin/build-scripts/bundle_dependencies +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env bash - -set -e - -PATH="./node_modules/.bin/:$PATH" -project_name="$1" -shift -cmd="$1" -shift - -depfile() { - echo "./build/dependency-cache/${project_name}-dependencies.txt" -} - -getdeps() { - file="$(depfile)" - if [[ -e $file ]] ; then - # Test that all the files actually exist... - for filename in $(cat $file) ; do - if [[ ! -e $filename ]] ; then - echo "$@" - return - fi - done - cat < $file - else - echo "$@" - fi -} - -build() { - dest="build/server/static/js/${project_name}-bundle.js" - mkdir -p "$(dirname "$(depfile)")" - echo -n "Building $(basename $dest): deps... " - browserify --list -e "$@" | sed "s!$(pwd)/!!g" | grep -v build-time > "$(depfile)" - if egrep -qv "^(build|node_modules)/" "$(depfile)" ; then - echo - echo "error: $@ or its deps import files outside build/ or node_modules/:" - egrep -v "^(build|node_modules)/" "$(depfile)" - echo "failed." - exit 2 - fi - echo -n "bundle... " - NODE_ENV="${NODE_ENV:-production}" browserify \ - -g [ envify --NODE_ENV $NODE_ENV ] \ - $( [[ -z "$NO_UGLIFY" ]] && printf %s '-g uglifyify' ) \ - -e "$@" > "$dest" - - if [[ -z "$NO_UGLIFY" ]] ; then - echo -n "minimizing... " - uglifyjs --compress --mangle -o "$dest" "$dest" - fi - echo "done." -} - -case "$cmd" in - -h|--help|help|"") - echo "This is a build script for the Makefile" - exit 2 - ;; - getdeps) - getdeps "$@" - ;; - build) - build "$@" - ;; - *) - echo "Unknown command: $cmd" - exit 2 - ;; -esac diff --git a/bin/pg_vars b/bin/pg_vars deleted file mode 100755 index fdce177a94..0000000000 --- a/bin/pg_vars +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env node - -const config = require("../server/src/config").getProperties(); - -function writevar(name, value) { - process.stdout.write(name+"='" + value.replace(/'/g, "'\\''") + "'\n"); -} - -if (config.db.user) { - writevar("PGUSER", config.db.user); -} - -if (config.db.host) { - var parts = config.db.host.split(":"); - if (parts[0]) { - writevar("PGHOST", parts[0]); - } - if (parts[1]) { - writevar("PGPORT", parts[1]); - } -} - -writevar("PGDATABASE", config.db.dbname); diff --git a/bin/run-server b/bin/run-server deleted file mode 100755 index ad72f03dee..0000000000 --- a/bin/run-server +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env bash - -set -e -bin="$(dirname ${BASH_SOURCE[0]})" -cd $bin/.. -if [[ -z "$NODE_ENV" ]] ; then - export NODE_ENV=dev -fi -PATH="node_modules/.bin:$PATH" - -if [[ ! -e "node_modules/.bin/nodemon" ]] ; then - echo "Installing node packages..." - npm install -fi - -run () { - if [[ -n "$restart" ]] ; then - notify "Firefox Screenshots server build started." - fi - if [ -d build ] ; then - # This is to remove empty files that might have resulted from a syntax error: - find build/ -size 0 -exec rm {} \; - fi - make server || (notify "Firefox Screenshots server build FAILED" ; exit 2) - if [[ -n "$restart" ]] ; then - notify "Firefox Screenshots server build finished." - fi - exec node -e 'require("babel-polyfill"); require("./build/server/server");' -} - -notify () { - msg="$1" - which growlnotify > /dev/null && growlnotify -m "$msg" || echo "$msg" -} - - -help () { - echo "Usage: $(basename $0) [--no-auto]" - echo " Run the server" - echo " --no-auto" - echo " Do not look for changes to the server and rebuild/restart" -} - - -no_auto= -restart= - -while [ -n "$1" ] ; do - case "$1" in - help|-h|--help) - help - exit - ;; - --no-auto) - no_auto=1 - shift - ;; - --restart) - # Hidden option for use by nodemon - restart=1 - no_auto=1 - shift - ;; - *) - help - exit 2 - ;; - esac -done - -if [[ -z "$no_auto" ]] ; then - nodemon \ - -w server -w static -w shared \ - -w Makefile \ - -e .js,.scss,.css,.png,.svg,.ttf,.sql,.sh \ - --exec bash $0 -- --restart -else - run -fi diff --git a/bin/test-request b/bin/test-request deleted file mode 100755 index 4c065e76dc..0000000000 --- a/bin/test-request +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env bash - -set -e - -base="$(dirname $BASH_SOURCE)" - -make_id () { - echo "$(date +'%Y%m%dT%H%M%S')" -} - -device_id="testdevice-$(make_id)" -secret="secret$(make_id)" - -endpoint=http://localhost:10080 -cookiejar="${base}/cookie-jar.txt" - -curl -X POST \ - --cookie-jar $cookiejar \ - --data-urlencode 'deviceInfo={\"platform\":\"test\"}' \ - --data-urlencode "deviceId=${device_id}" \ - --data-urlencode "secret=${secret}" \ - --data-urlencode "reason=install" \ - "$endpoint/api/register" - -echo " -Logged in with deviceId ${device_id}" - -case "$1" in - put) - shift - docname="d$(make_id)/test.com" - doc="$1" - shift - doc="$(python -c ' -import sys, json -doc = json.loads(sys.argv[1]) -doc.setdefault("deviceId", sys.argv[2]) -doc.setdefault("url", "http://test.com") -print json.dumps(doc) -' "$doc" "$device_id")" - url="$endpoint/data/$docname" - echo "Sending document: ${doc}" - echo " to: $url" - curl --cookie $cookiejar -X PUT --header 'Content-Type: application/json' -d "$doc" -D - "$url" - ;; - *) - echo "Unknown option: $*" - echo "To use:" - echo " $(basename $0) put '{document}'" - ;; -esac - -echo diff --git a/docs/docker.md b/docs/docker.md deleted file mode 100644 index e858a762f2..0000000000 --- a/docs/docker.md +++ /dev/null @@ -1,34 +0,0 @@ -**Note:** Most of what is described in these instructions is implemented in the `./bin/release-version` script. - -To create the docker image, first run: - - make server - make signed_xpi - -Then, manually sign the xpi (in the build directory) using the AMO website, download the signed copy, replace the unsigned copy, and use: - - bin/build-docker-image [dockerhubusername] - -build-docker-image will build the image, tag it as [dockerhubusername]/screenshots:latest, and push it to dockerhub. - -When you run docker, you should use --net=host and pass the following parameters in the environment: - - RDS_USERNAME - the username for your postgres database - RDS_PASSWORD - the password for your postgres database - RDS_HOSTNAME - the hostname of your postgres database - SITE_ORIGIN - the publicly visible domain name for the main site - CONTENT_ORIGIN - the publicly visible domain name for the content site - USE_S3 - true to use s3 to store images, otherwise they will be stored locally in a directory named "data" - S3_BUCKET_NAME - the name of the s3 bucket to store images in - GA_ID - the google analytics id - SENTRY_DSN - the sentry dsn url to use for logging errors - SENTRY_PUBLIC_DSN - the sentry public dsn url to use for logging errors from content and the addon - -Example command line: - - docker run --net=host -e 'RDS_USERNAME=screenshots' -e 'RDS_PASSWORD=********' \ - -e 'RDS_HOSTNAME=screenshots-dev.czvvrkdqhklf.us-east-1.rds.amazonaws.com' \ - -e 'SITE_ORIGIN=screenshots.dev.mozaws.net' \ - -e 'CONTENT_ORIGIN=screenshotsusercontent.dev.mozaws.net' \ - -e 'USE_S3=true' -e 'S3_BUCKET_NAME=pageshot-images-bucket' -e 'GA_ID=********' \ - -e 'SENTRY_DSN=********' -e 'SENTRY_PUBLIC_DSN=********' mozilla/screenshots diff --git a/docs/performance-testing.md b/docs/performance-testing.md deleted file mode 100644 index c4fd3a6553..0000000000 --- a/docs/performance-testing.md +++ /dev/null @@ -1,17 +0,0 @@ -# Performance Testing - -Notes and advice on testing... - -To get your local database filled up with a lot of data, use the `load_test_exercise.py` script, like: - -```sh -$ ./.venv/bin/python ./bin/load_test_exercise.py -q --little-image --create=50 --read-shot=0 --read-my-shots=0 --search=0 --times 100 --new-account http://localhost:10080 -``` - -Or: - -```sh -$ npm run fill_database -- --times 100 -``` - -The argument to `--times` gives the number of user accounts to create. Each account will have 50 images (`--create=50`). `--little-image` uses the smallest image, since locally it's not meaningful for performance to have large files. diff --git a/docs/server-release.md b/docs/server-release.md deleted file mode 100644 index 4b3adaa6cb..0000000000 --- a/docs/server-release.md +++ /dev/null @@ -1,28 +0,0 @@ -# Server release How-To - -To release the server: - -- [ ] Bump the version in `package.json` -- [ ] Generate a new changelog with: - - `./bin/generate-commit-log --write recent` -- [ ] Commit version change and changelog -- [ ] Tag with `git tag VERSION` -- [ ] Push version and tags, `git push && git push --tags` -- [ ] Merge to `server-prod`: - - Temporarily [edit the branch protection rules](https://github.com/mozilla-services/screenshots/settings/branch_protection_rules/2048091) to turn off protection on `server-prod` (by renaming the branch pattern) - - `git push -f origin master:server-prod` - - Re-enable the branch protection - - This will trigger a deploy to stage. A deploy will take about 30 minutes. - - View the CI build of [server-prod](https://circleci.com/gh/mozilla-services/screenshots/tree/server-prod) - - IRC will get updates (no update until deploy happens) - - [`https://screenshots.stage.mozaws.net/__version__`](https://screenshots.stage.mozaws.net/__version__) will show the status - - Look at [CircleCI](https://circleci.com/gh/mozilla-services/screenshots) for a `server-prod` build - - Look at [DockerHub](https://hub.docker.com/r/mozilla/screenshots/tags/) for tagged Docker builds (this is what actually triggers the stage deployment) -- [ ] Ping our ops contact on IRC to deploy to prod - - As of Q3 2018, primary is oremj, secondary is miles - - [`https://screenshots.firefox.com/__version__`](https://screenshots.firefox.com/__version__) will show the status - - IRC will get updates - -Note if someone needs to re-deploy the last stage deployment (e.g., some dependent resource has been updated), then going to the [CircleCI server-prod builds](https://circleci.com/gh/mozilla-services/screenshots/tree/server-prod), finding the latest build, and "rebuilding" it should trigger a redeployment of stage. - -To view production deploys, see [this query](http://logs.glob.uno/?a=search&c=mozilla%23screenshots&q=deployed+to+prod&se=) diff --git a/docs/takedown.md b/docs/takedown.md deleted file mode 100644 index 9140508e04..0000000000 --- a/docs/takedown.md +++ /dev/null @@ -1,41 +0,0 @@ -## Take-down process - -In cases of a DMCA notice, or other abuse yet to be determined, a shot has to be removed from the service. - -Currently the only way to remove a shot is to execute SQL on the server. Typically only operations staff has access to do this. - -Given a shot ID, which should look like `29f8d8asd93/example.com` (that is, *not* including any domain name, and no leading `/`), the SQL is: - -```sql -UPDATE data -SET block_type = 'dmca' -WHERE id = '29f8d8asd93/example.com' -``` - -To undo a block: - -```sql -UPDATE data -SET block_type = 'none' -WHERE id = '29f8d8asd93/example.com' -``` - -In the future we might identify other categories of blocked content, but currently the only kind is `'dmca'`. - -For a non-owner the link should now return a 404; for the owner the link will give a notification. - -### Getting a shot ID from an image URL - -You may get a report for a URL, instead of an image. The image ID is a UUID *with* extension. So for instance, for a URL `https://screenshots.firefoxusercontent.com/images/36333d2b-f158-468d-8113-38f18c3ede9a.png` the ID is `36333d2b-f158-468d-8113-38f18c3ede9a.png` - -To get the shot ID, execute: - -```sql -SELECT shotid FROM images WHERE id = '36333d2b-f158-468d-8113-38f18c3ede9a.png' -``` - -If the image row had been deleted for some ways, it is possible to find the accompanying shot, but requires a full table scan (this may be very slow!): - -```sql -SELECT id FROM data WHERE value LIKE '%36333d2b-f158-468d-8113-38f18c3ede9a.png%'; -``` diff --git a/docs/testing-the-api.md b/docs/testing-the-api.md deleted file mode 100644 index cc8c90eeb8..0000000000 --- a/docs/testing-the-api.md +++ /dev/null @@ -1,167 +0,0 @@ -# Testing the API - -Some notes on testing the REST API of the server. - -Notable endpoints... - -## deviceInfo - -In several cases we use `deviceInfo`, which is an object that looks like: - -```json -{ - "addonVersion": "0.1.201510222202", - "platform": "darwin", - "architecture": "x86_64", - "version": "45.0a1", - "build": "20151105030433", - "appName": "Firefox", - "platformVersion": "45.0a1", - "appVendor": "Mozilla" -} -``` - -In most cases only `addonVersion` is actually required. - -## Authentication - -`POST /api/register` - -Body parameters (form encoded), `deviceId`, `secret`, `nickname` (optional), `avatarurl` (optional) - -Returns 401 if user already exists. Returns 200 on success, and sets session authentication cookie. - -`POST /api/login` - -Body parameters (form encoded): `deviceId`, `secret`, `deviceInfo` (JSON string) - -Returns 404 if no user by that id, 401 if the login failed, and returns 200 on success. - -Like /api/register, it sets the session authentication cookie. - -`POST /leave-screenshots/leave` - -Authenticated. Deletes entire account. Uses session token to determine who to delete. - -## Utilities - -`GET /redirect?to={url}` - -Not authenticated. Causes a redirect to the given URL, with an interstitial page. Takes optional `&from=` parameter that identifies the kind of page it came from (for metrics only). - -`POST /events` - -Authenticated, adds a Google Analytics event. Takes URL encoded parameters: `event`, `action`, and `label`. - -## Handling shots - -`PUT /data/{random_id}/{domain}` - -Authenticated. Creates or updates a shot. Takes a JSON body. Looks like: - -```json -{ - "deviceId": "anonf54641fa-ea19-3648-ba07-10c98d13726e", - "url": "https://github.com/mozilla-services/screenshots/issues/1237", - "docTitle": "Screenshots erases everything in my clipboard · Issue #1237 · mozilla-services/pageshot", - "createdDate": 1468983767525, - "images": [ - { - "url": "https://cloud.githubusercontent.com/assets/557895/16748439/efdbf0a0-4778-11e6-9a33-d1043238addf.png", - "dimensions": { - "x": 582, - "y": 383 - }, - "title": null, - "alt": "my_shots" - } - ], - "siteName": "GitHub", - "documentSize": { - "width": 1127, - "height": 2086 - }, - "thumbnail": "data:...", - "clips": { - "cplocgk9m1nc": { - "createdDate": 1468983771992, - "sortOrder": 100, - "image": { - "url": "data:...", - "captureType": "selection", - "text": "Steps to reproduce:\nInstall Screenshots add-on.\nCopy some text into your clipboard.\n\"Shot\" a page and then try and paste your step 2 clipboard contents somewhere.\nActual results:\nYour clipboard contents from step 2 are erased by step 3.\nExpected results:", - "location": { - "top": 329, - "left": 308, - "bottom": 616, - "right": 718, - "topLeftElement": "#psid-456", - "topLeftOffset": { - "x": 169.5, - "y": 2.8000030517578125, - "height": 324.6500244140625, - "width": 694 - }, - "bottomRightElement": "#psid-468", - "bottomRightOffset": { - "x": 564.5, - "y": 22.149993896484375, - "height": 42, - "width": 664 - } - }, - "dimensions": { - "x": 410, - "y": 287 - } - } - } - } -} -``` - -Then you get a response back that converts the `data:...` URLs to other URLs, like: - -```json -[ - {"updatedThumbnailUrl": "new url"}, - {"updateClipUrl": - { - "clipId": "cplocgk9m1nc", - "url": "new url" - } - } -] -``` - -`GET /data/{random_id}/{domain}` - -Not authenticated. Gets the JSON back. - -`POST /api/delete-shot` - -Authenticated. Takes only one parameter, `id` (the `"{random_id}/{domain}"`) - -`POST /api/set-expiration` - -Authenticated. Takes URL encoded parameters, `id` and `expiration` (milliseconds) - -`GET /images/{id}` - -Not authenticated. Gets a saved S3 image. Typically the `PUT` request will return images that point here. - -`GET /{random_id}/{domain}` - -Not authenticated. Gets the HTML page for a shot. - -`GET /shots` - -Authenticated. Gets HTML for shot index. - -`GET /shots?q={query}` - -Authenticated. Gets HTML for shot index, but with search results. - -`GET /shots?q={query}&data=json` - -Gets the JSON for the shot index. diff --git a/docs/watchdog.md b/docs/watchdog.md deleted file mode 100644 index fdbbe9dfc5..0000000000 --- a/docs/watchdog.md +++ /dev/null @@ -1,73 +0,0 @@ -# Screenshots-Watchdog Integration - -## Watchdog - -[Watchdog](https://github.com/mozilla/watchdog-proxy/) is a proxy service that send images to Microsoft's PhotoDNA service. It is used by the Screenshots server. - -The shot images are submitted to Watchdog on their initial uploads and on edit saves. - -## Set It Up - -In order to use Watchdog, Screenshots needs to obtain a user ID and a key from Watchdog. The required configuration values are: - -Config | Environment Variable | Default Value | Notes -------- | -------------------- | ------------- | ----- -Enabled | `ENABLE_WATCHDOG` | true | Even though the default is `true`, [`.env.dev`](https://github.com/mozilla-services/screenshots/blob/master/.env.dev) set it to `false`. -User ID | `WATCHDOG_ID` | | A user id from Watchdog. It is used for authentication. -User Key | `WATCHDOG_KEY` | | The key for the above user id. -Hash Algorithm | `WATCHDOG_AUTH_HASH_ALGORITHM` | sha256 | Algorithm for HMACs in [Hawk](https://github.com/hueniverse/hawk) authentication -Submission URL | `WATCHDOG_SUBMISSION_URL` | | A full URL to the API endpoint where Watchdog is accepting requests from its consumers. It should end with `/accept`. - -**Important!** If Watchdog is enabled, but missing any required configuration values or receives an invalid URL for the submission URL, it will stop the Screenshots server from starting. - -Other configuration values: - -Config | Environment Variable | Default Value | Notes -------- | -------------------- | ------------- | ----- -Positive Email | WATCHDOG_POSITIVE_EMAIL | | An optional, semicolon delimited, list of email addresses to receive notifications of positive matches. -Submission Interval | WATCHDOG_SUBMISSION_INTERVAL | 1 | How often a shot image is sent to Watchdog. E.g. 1 is every shot and 10 is every 10th shot. -Exclude Release Channel | WATCHDOG_EXCLUDE_RELEASE_CHANNEL | true | [Temporary.](https://github.com/mozilla-services/screenshots/issues/4920) When this is set to true, the Firefox major version number from the shot's useragent string is compared to scheduled release dates up to Firefox version 65. If the major version of Firefox used is before its release date, then the shot is sent to Watchdog. -Logs Only | WATCHDOG_LOGS_ONLY | true | [Temporary.](https://github.com/mozilla-services/screenshots/issues/4936) When this is true, Screenshots will only log the results; it will not mark a shot as positive or negative. -Dev Only Hostname | WATCHDOG_DEV_MATCH_HOSTNAME | | This is for test environments where Watchdog itself does not actually use PhotoDNA, but rather return a positive ~10% of the time. If this is set, the shot is sent to Watchdog only when the shot source URL's hostname matches the configuration value. E.g. if it's set to "www.w3schools.com", then only shots taken on www.w3schools.com will be submitted. - -## Handling Callbacks - -### Positive - -Upon a positive match callback, a shot will - - never expire - - have the block type of `watchdog` - -That means the shot will not be wiped by the deleted shot cleaning job and it will not be viewable. - -### Negative - -The negative result is recorded, which does not have any effects on the shot. - -### PhotoDNA Error Response - -The third possbility in a Watchdog callback is an upstream error at PhotoDNA. This will be logged and the result is not marked positive or negative. There are mutliple potential causes for such an error, originating from Screenshots or Watchdog. ([See `Status` in the response table](https://developer.microsoftmoderator.com/docs/services/57c7426e2703740ec4c9f4c3/operations/57c7426f27037407c8cc69e6) the list of errors from PhotoDNA.) - -## Technical Details and Notes - -### Code - -All of the logic resides in `server/src/watchdog.js`. It's called from `server/src/server.js` in a couple places. The route for the callback endpoint is also in `server/src/server.js`. - -### Database - -For every request sent to Watchdog, a record is inserted into `watchdog_submissions`. The record(s) for a shot is deleted when the shot is removed during the deleted shot cleaning job. - -### Validating Callbacks - -When Screenshots sends a request to Watchdog, it includes a nonce in the callback urls. This nonce is then used to validate the callback request from Watchdog. - -### Multi-Concurrent-Submissions - -Given the rate limited, queueing nature of Watchdog, it is possible to have multiple submissions in-flight for a given edited shot. A request is sent to Watchdog on every image save in the shot editor. However, since Watchdog does not offer a way to cancel a submission, Screenshots cannot stop the processing of submissions for the original shot or previous edits. - -In the event of _different_ results are returned for the same shot, the positive result takes "precedence", as a negative result is essentially a no-op on the shot. Note that Watchdog itself keeps copies of the images, so even if the latest result for a shot is negative, the image for a previous positive match can be found in Watchdog. - -### Shot ID - -In addition to the image and other required fields, the shot ID is included in the "notes" field of the request to Watchdog. It is to help Watchdog administrators to trace back a shot in Screenshots. diff --git a/package-lock.json b/package-lock.json index e29f953199..ccab672076 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "firefox-screenshots", - "version": "37.0.0", + "version": "38.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -12,14 +12,6 @@ "requires": { "core-js": "^2.5.7", "regenerator-runtime": "^0.11.1" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } } }, "@babel/register": { @@ -37,22 +29,10 @@ "source-map-support": "^0.5.9" }, "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -73,7 +53,7 @@ "dependencies": { "colors": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", "dev": true } @@ -91,7 +71,7 @@ "dependencies": { "es6-promise": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=", "dev": true } @@ -114,9 +94,15 @@ "dev": true }, "@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "version": "11.11.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.3.tgz", + "integrity": "sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg==", + "dev": true + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, "@yarnpkg/lockfile": { @@ -131,78 +117,24 @@ "integrity": "sha1-QVQYpSbTP+MddLTe+jyDbUhewgM=", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - } + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "acorn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", - "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", "dev": true }, - "acorn-globals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", - "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, "acorn-jsx": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", "dev": true }, - "acorn-node": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", - "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", - "dev": true, - "requires": { - "acorn": "^6.0.2", - "acorn-dynamic-import": "^4.0.0", - "acorn-walk": "^6.1.0", - "xtend": "^4.0.1" - } - }, - "acorn-walk": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz", - "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg==" - }, "adbkit": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/adbkit/-/adbkit-2.11.0.tgz", @@ -220,18 +152,24 @@ "dependencies": { "bluebird": { "version": "2.9.34", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz", "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=", "dev": true }, - "split": { - "version": "0.3.3", - "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "through": "2" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -252,7 +190,7 @@ "dependencies": { "async": { "version": "0.2.10", - "resolved": "http://registry.npmjs.org/async/-/async-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", "dev": true } @@ -304,66 +242,12 @@ "yauzl": "2.9.2" }, "dependencies": { - "ajv": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", - "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "eslint": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.0.1.tgz", @@ -423,131 +307,6 @@ } } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fluent-syntax": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/fluent-syntax/-/fluent-syntax-0.10.0.tgz", - "integrity": "sha512-6qRhwQXDTgJjS9DW3IiXZWzUMUPqNPzqh+bZZyUOr6t8xYwkIe+5JONYZuvfvbOUk65paAno0kd8s8kUD2ptNA==", - "dev": true - }, - "fsevents": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.1.tgz", - "integrity": "sha512-p+CXqK/iLvDESUWdn3NA3JVO9HxdfI+iXx8xR3DqWgKZvQNiEVpAyUQo0lmwz8rqksb4xaGerG291xuwwhX2kA==", - "dev": true, - "optional": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "postcss": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.12.tgz", - "integrity": "sha512-VTxN8+cqf0uRJ/4ngbDTdFgEaNeuF24mV17tmZrTnjOWoS4TNT3BkX0OKaASYU8itH+j0EHlCcxaNp+QmKMuvQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -556,31 +315,14 @@ "requires": { "ansi-regex": "^3.0.0" } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, "adm-zip": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==" + "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "dev": true }, "agent-base": { "version": "4.2.1", @@ -595,6 +337,7 @@ "version": "6.7.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -603,9 +346,9 @@ } }, "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", "dev": true }, "ajv-merge-patch": { @@ -628,25 +371,31 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, "requires": { "string-width": "^2.0.0" } }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "ansicolors": { "version": "0.3.2", @@ -655,24 +404,21 @@ "dev": true }, "any-promise": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", - "integrity": "sha1-gwtoCqflbzNFHUsEnzvYBESY7ic=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" } }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -683,6 +429,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.0.1.tgz", "integrity": "sha1-qv/Q/aPgPHfuRRaaeBtNm+Xz8l8=", + "dev": true, "requires": { "archiver-utils": "^1.0.0", "async": "^2.0.0", @@ -694,25 +441,11 @@ "zip-stream": "^1.0.0" }, "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "requires": { - "lodash": "^4.17.10" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - } - } - }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -727,6 +460,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -737,6 +471,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, "requires": { "glob": "^7.0.0", "graceful-fs": "^4.1.0", @@ -748,8 +483,9 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -764,6 +500,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -788,7 +525,7 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -812,11 +549,6 @@ } } }, - "argh": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/argh/-/argh-0.1.4.tgz", - "integrity": "sha1-PrTWEpc/xrbcbvM49W91nyrFw6Y=" - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -829,17 +561,20 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true }, "array-differ": { "version": "1.0.0", @@ -847,15 +582,11 @@ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", "dev": true }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, "array-filter": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true }, "array-find-index": { "version": "1.0.2", @@ -863,11 +594,6 @@ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, "array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", @@ -887,12 +613,14 @@ "array-map": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true }, "array-reduce": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true }, "array-union": { "version": "1.0.2", @@ -912,7 +640,8 @@ "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true }, "arrify": { "version": "1.0.1", @@ -923,78 +652,50 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "dev": true, "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } + "safer-buffer": "~2.1.0" } }, "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true }, "ast-types": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.7.tgz", - "integrity": "sha512-2mP3TwtkY/aTv5X3ZsMpNAbOnyoC/aMJwJSoaELPkHId0nSQgFcnU4dRW3isxiz7+zBexk0ym3WNVjMiQBnJSw==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.2.tgz", + "integrity": "sha512-8c83xDLJM/dLDyXNLiR6afRRm4dPKN6KAnKqytRK3DBJul9lA+atxdQkNDkSVPdTqea5HiRq3lnnOIZ0MBpvdg==", "dev": true }, "async": { - "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } }, "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.2.tgz", + "integrity": "sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg==", + "dev": true }, "async-foreach": { "version": "0.1.3", @@ -1002,20 +703,17 @@ "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", "dev": true }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true }, "audit-filter": { "version": "0.3.0", @@ -1026,211 +724,17 @@ "docopt": "^0.6.2" } }, - "aws-sdk": { - "version": "2.388.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.388.0.tgz", - "integrity": "sha512-2yycFVn90H61R3vbE+4Yqn8AEOS88oOE1wUsm6aUhsk+i/Y707a85C166gKuE3+if4y8IS5qqQJiX+HUtF0KNw==", - "requires": { - "buffer": "4.9.1", - "events": "1.1.1", - "ieee754": "1.1.8", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - } - }, "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "b64": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/b64/-/b64-4.1.2.tgz", - "integrity": "sha512-+GUspBxlH3CJaxMUGUE1EBoWM6RKgWiYwUDal0qdf8m3ArnXNN1KzKVo5HOnE/FSq4HHyWf3TlHLsZI8PKQgrQ==", - "requires": { - "hoek": "6.x.x" - } - }, - "babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "chokidar": "^1.6.1", - "commander": "^2.11.0", - "convert-source-map": "^1.5.0", - "fs-readdir-recursive": "^1.0.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "output-file-sync": "^1.1.2", - "path-is-absolute": "^1.0.1", - "slash": "^1.0.0", - "source-map": "^0.5.6", - "v8flags": "^2.1.1" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "optional": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } - } + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, "babel-code-frame": { "version": "6.26.0", @@ -1243,3497 +747,1436 @@ "js-tokens": "^3.0.2" }, "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "json5": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "babel-polyfill": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.16.0.tgz", + "integrity": "sha1-LUUCHfh+JqN0ttTRqcZZZNF/JCI=", "dev": true, "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "babel-runtime": "^6.9.1", + "core-js": "^2.4.0", + "regenerator-runtime": "^0.9.5" }, "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "regenerator-runtime": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", + "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=", "dev": true } } }, - "babel-helper-builder-react-jsx": { + "babel-runtime": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "tweetnacl": "^0.14.3" } }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" } }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "binary-extensions": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", + "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", + "dev": true }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" }, "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "inherits": "~2.0.0" } }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "bluebird": { + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.6.tgz", + "integrity": "sha1-AdqNgh2HgT0ViWfnQ9X+bGLPjA8=", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" + "hoek": "2.x.x" } }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" } }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } } } }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", + "dev": true }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "bunyan": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", "dev": true, "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "dtrace-provider": "~0.8", + "moment": "^2.10.6", + "mv": "~2", + "safe-json-stringify": "~1" } }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "callsites": "^0.2.0" } }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } } }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", "dev": true, "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "traverse": ">=0.3.0 <0.4" } }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" } }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "chokidar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", + "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" }, "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "dev": true, + "optional": true, "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "batch-processor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz", - "integrity": "sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, - "binary-extensions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==" - }, - "bl": { - "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.4.6", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-3.4.6.tgz", - "integrity": "sha1-AdqNgh2HgT0ViWfnQ9X+bGLPjA8=", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boom": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/boom/-/boom-7.2.2.tgz", - "integrity": "sha512-IFUbOa8PS7xqmhIjpeStwT3d09hGkNYQ6aj2iELSTxcVs2u0aKn1NzhkdUQSzsRg1FVkj3uit3I6mXQCBixw+A==", - "requires": { - "hoek": "6.x.x" - } - }, - "bounce": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bounce/-/bounce-1.2.2.tgz", - "integrity": "sha512-1LPcXg3fkGVhjdA/P3DcR5cDktKEYtDpruJv9Nhmy36RoYaoxZfC82Zr2JmS3vysDJKqMtP0qJw3/P6iisTASg==", - "requires": { - "boom": "7.x.x", - "hoek": "6.x.x" - } - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - } - }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", - "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - }, - "dependencies": { - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - } - } - }, - "btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" - }, - "buffer": { - "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-writer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz", - "integrity": "sha1-Iqk2kB4wKa/NdUfrRIfOtpejvwg=" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bunyan": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", - "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", - "dev": true, - "requires": { - "dtrace-provider": "~0.8", - "moment": "^2.10.6", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cached-iterable": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cached-iterable/-/cached-iterable-0.2.1.tgz", - "integrity": "sha512-8zAVjMjdn/S/QXJaOnqsko0+ZJzXT2Dum2u9TMGg5YR9fxONPrUjuO9VYqnb1AoldXeYVAcNJLgT5Q8WaIJSgA==" - }, - "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", - "dev": true - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" - }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - } - } - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-deep": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", - "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "is-plain-object": "^2.0.1", - "kind-of": "^3.2.2", - "shallow-clone": "^0.1.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz", - "integrity": "sha512-5wfTTO8E2/ja4jFSxePXlG5nRu5bBtL/r1HCIpJW/lzT6yDtKl0u0Z4o/Vpz32IpKmBn7HerheEZQgA9N2DarQ==", - "dev": true, - "requires": { - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "columnify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", - "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", - "dev": true, - "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - } - } - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "convict": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/convict/-/convict-4.4.1.tgz", - "integrity": "sha512-celpR4hOWWwb/S8azhzgQwDon6muAJlNe2LTLeOGyoSgH390TsaqoieAe9BLbAv7+9wNfG7DTA2q3IfFp2viKw==", - "requires": { - "depd": "1.1.2", - "json5": "1.0.1", - "lodash.clonedeep": "4.5.0", - "moment": "2.22.2", - "validator": "10.8.0", - "yargs-parser": "11.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "yargs-parser": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.0.0.tgz", - "integrity": "sha512-dvsafRjM45h79WOTvS/dP35Sb31SlGAKz6tFjI97kGC4MJFBuzTZY6TTYHrz0QSMQdkyd8Y+RsOMLr+JY0nPFQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookies": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz", - "integrity": "sha512-+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==", - "requires": { - "depd": "~1.1.2", - "keygrip": "~1.0.3" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.2.tgz", - "integrity": "sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "requires": { - "buffer": "^5.1.0" - }, - "dependencies": { - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - } - } - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-react-class": { - "version": "15.6.3", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", - "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", - "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "crx-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/crx-parser/-/crx-parser-0.1.2.tgz", - "integrity": "sha1-fu7tnt3JXiLBiTguNGJARKiaWm0=", - "dev": true - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, - "cryptiles": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.3.tgz", - "integrity": "sha512-gT9nyTMSUC1JnziQpPbxKGBbUg8VL7Zn2NB4E1cJYvuXdElHrwxrV9bmltZGDzet45zSDGyYceueke1TjynGzw==", - "requires": { - "boom": "7.x.x" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "csrf": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.0.6.tgz", - "integrity": "sha1-thEg3c7q/JHnbtUxO7XAsmZ7cQo=", - "requires": { - "rndm": "1.2.0", - "tsscmp": "1.0.5", - "uid-safe": "2.1.4" - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-tree": { - "version": "1.0.0-alpha.28", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", - "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", - "dev": true, - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - }, - "css-url-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", - "dev": true - }, - "css-what": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", - "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", - "dev": true - }, - "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "dev": true, - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - } - } - }, - "cssom": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", - "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==" - }, - "cssstyle": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", - "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", - "requires": { - "cssom": "0.3.x" - } - }, - "csurf": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.9.0.tgz", - "integrity": "sha1-SdLGkl/87Ht95VlZfBU/pTM2QTM=", - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "csrf": "~3.0.3", - "http-errors": "~1.5.0" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "d": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "data-uri-to-buffer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.0.tgz", - "integrity": "sha512-YbKCNLPPP4inc0E5If4OaalBc7gpaM2MRv77Pv2VThVComLKfbGYtJcdDCViDyp1Wd4SebhHLz94vp91zbK6bw==", - "dev": true, - "requires": { - "@types/node": "^8.0.7" - }, - "dependencies": { - "@types/node": { - "version": "8.10.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.39.tgz", - "integrity": "sha512-rE7fktr02J8ybFf6eysife+WF+L4sAHWzw09DgdCebEu+qDwMvv4zl6Bc+825ttGZP73kCKxa3dhJOoGJ8+5mA==", - "dev": true - } - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dbug": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/dbug/-/dbug-0.4.2.tgz", - "integrity": "sha1-MrSzEF6IYQQ6b5rHVdgOVC02WzE=" - }, - "debounce": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.1.0.tgz", - "integrity": "sha512-ZQVKfRVlwRfD150ndzEK8M90ABT+Y/JQKs4Y7U4MXdpuoUkkrr4DwKbVux3YjylA5bUMUj0Nc3pMxPJX6N2QQQ==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-zip": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz", - "integrity": "sha1-rjvLfjTGWHmt/nfhnDD4ZgK0vbA=", - "requires": { - "binary": "^0.3.0", - "graceful-fs": "^4.1.3", - "mkpath": "^0.1.0", - "nopt": "^3.0.1", - "q": "^1.1.2", - "readable-stream": "^1.1.8", - "touch": "0.0.3" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "deepcopy": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/deepcopy/-/deepcopy-0.6.3.tgz", - "integrity": "sha1-Y0eA8vhlardxr4+oQx7RzO5Vx7A=" - }, - "deepmerge": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.1.0.tgz", - "integrity": "sha512-/TnecbwXEdycfbsM2++O3eGiatEFHjjNciHEwJclM+T5Kd94qD1AP+2elP/Mq0L5b9VZJao5znR01Mz6eX8Seg==", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - }, - "dependencies": { - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", - "dev": true, - "requires": { - "ast-types": "0.x.x", - "escodegen": "1.x.x", - "esprima": "3.x.x" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "dependency-graph": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.0.tgz", - "integrity": "sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ==", - "dev": true - }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "desandro-matches-selector": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/desandro-matches-selector/-/desandro-matches-selector-2.0.2.tgz", - "integrity": "sha1-cXvu1NwT59jzdi9wem1YpndCGOE=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detective": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", - "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - } - } - }, - "dispensary": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/dispensary/-/dispensary-0.28.0.tgz", - "integrity": "sha512-ebXAFZCIysReUMweqUVxz4pv8DxWwSknaPupL540KG+Rd4cvsskP+48hx4sQrREYamiXtf6cZ3RWfPZBJ55tHQ==", - "dev": true, - "requires": { - "array-from": "~2.1.1", - "async": "~2.6.0", - "natural-compare-lite": "~1.4.0", - "pino": "~5.10.6", - "request": "~2.88.0", - "sha.js": "~2.4.4", - "source-map-support": "~0.5.4", - "yargs": "~12.0.1" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - } - } - }, - "dockerfile-ast": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.0.12.tgz", - "integrity": "sha512-cIV8oXkAxpIuN5XgG0TGg07nLDgrj4olkfrdT77OTA3VypscsYHBUg/FjHxW9K3oA+CyH4Th/qtoMgTVpzSobw==", - "dev": true, - "requires": { - "vscode-languageserver-types": "^3.5.0" - } - }, - "docopt": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", - "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", - "dev": true - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.2.1.tgz", - "integrity": "sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "requires": { - "is-obj": "^1.0.0" - } - }, - "dtrace-provider": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz", - "integrity": "sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.10.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true } } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", - "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { + "chownr": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "element-resize-detector": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.1.14.tgz", - "integrity": "sha1-rwZKCmGKggrVcKlcXuxbd74BKME=", - "requires": { - "batch-processor": "^1.0.0" - } - }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "email-validator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, - "envc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/envc/-/envc-2.5.0.tgz", - "integrity": "sha1-AWZKCQLTzdZfyTkI9wCRINcfmFw=", - "requires": { - "params": "^0.1.1" - } - }, - "envify": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", - "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", - "dev": true, - "requires": { - "esprima": "^4.0.0", - "through": "~2.3.4" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.46", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", - "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "es6-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.0.0.tgz", - "integrity": "sha1-8JTHBB9mJZm7EnINoFnWucf/D0A=" - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true }, - "escodegen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", - "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } } } }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "restore-cursor": "^2.0.0" } }, - "eslint": { - "version": "4.19.1", - "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", + "string-width": "^2.1.1", "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" + "wrap-ansi": "^2.0.0" }, "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "color-convert": "^1.9.0" + "ansi-regex": "^3.0.0" } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-deep": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", + "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.1", + "kind-of": "^3.2.2", + "shallow-clone": "^0.1.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "is-buffer": "^1.1.5" } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "columnify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", + "dev": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "ms": "^2.1.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "safe-buffer": "~5.1.0" } - }, - "espree": { - "version": "3.5.4", - "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "safe-buffer": "~5.1.0" } - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "strip-ansi": { + } + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" + }, + "dependencies": { + "parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } } } }, - "eslint-plugin-mozilla": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-mozilla/-/eslint-plugin-mozilla-1.0.4.tgz", - "integrity": "sha512-fft+kbWH7zwAgJpakLz+lkMGvbjPH0jy/LI0CHMMdRt91x/Lv/z1poE7zWAGL4Z2CFpRjyl9+/lu9bV1zXI0YA==", + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", "dev": true, "requires": { - "htmlparser2": "3.9.2", - "ini-parser": "0.0.2", - "sax": "1.2.4" + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" }, "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -4744,13 +2187,7 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + } }, "string_decoder": { "version": "1.1.1", @@ -4763,1544 +2200,1934 @@ } } }, - "eslint-plugin-no-unsafe-innerhtml": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsafe-innerhtml/-/eslint-plugin-no-unsafe-innerhtml-1.0.16.tgz", - "integrity": "sha1-fQKHjI6b95FriINtWsEitC8VGTI=", + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "eslint": "^3.7.1" + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crx-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/crx-parser/-/crx-parser-0.1.2.tgz", + "integrity": "sha1-fu7tnt3JXiLBiTguNGJARKiaWm0=", + "dev": true + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.28", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", + "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", + "dev": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" }, "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + } + } + }, + "css-url-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", + "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", + "dev": true + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "csso": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.29" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", "dev": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" } }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true - }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.0.tgz", + "integrity": "sha512-YbKCNLPPP4inc0E5If4OaalBc7gpaM2MRv77Pv2VThVComLKfbGYtJcdDCViDyp1Wd4SebhHLz94vp91zbK6bw==", + "dev": true, + "requires": { + "@types/node": "^8.0.7" + }, + "dependencies": { + "@types/node": { + "version": "8.10.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.44.tgz", + "integrity": "sha512-HY3SK7egERHGUfY8p6ztXIEQWcIPHouYhCGcLAPQin7gE2G/fALFz+epnMwcxKUS6aKqTVoAFdi+t1llQd3xcw==", + "dev": true + } + } + }, + "debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.1.0.tgz", + "integrity": "sha512-ZQVKfRVlwRfD150ndzEK8M90ABT+Y/JQKs4Y7U4MXdpuoUkkrr4DwKbVux3YjylA5bUMUj0Nc3pMxPJX6N2QQQ==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-zip": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz", + "integrity": "sha1-rjvLfjTGWHmt/nfhnDD4ZgK0vbA=", + "dev": true, + "requires": { + "binary": "^0.3.0", + "graceful-fs": "^4.1.3", + "mkpath": "^0.1.0", + "nopt": "^3.0.1", + "q": "^1.1.2", + "readable-stream": "^1.1.8", + "touch": "0.0.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", - "dev": true, - "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.5.2", - "debug": "^2.1.1", - "doctrine": "^2.0.0", - "escope": "^3.6.0", - "espree": "^3.4.0", - "esquery": "^1.0.0", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.14.0", - "ignore": "^3.2.0", - "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", - "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", - "strip-json-comments": "~2.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" - } - }, - "espree": { - "version": "3.5.4", - "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true - }, - "inquirer": { - "version": "0.12.0", - "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + } + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepcopy": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/deepcopy/-/deepcopy-0.6.3.tgz", + "integrity": "sha1-Y0eA8vhlardxr4+oQx7RzO5Vx7A=", + "dev": true + }, + "deepmerge": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.1.0.tgz", + "integrity": "sha512-/TnecbwXEdycfbsM2++O3eGiatEFHjjNciHEwJclM+T5Kd94qD1AP+2elP/Mq0L5b9VZJao5znR01Mz6eX8Seg==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" + "kind-of": "^6.0.0" } }, - "is-fullwidth-code-point": { + "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "kind-of": "^6.0.0" } }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + } + } + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.0.tgz", + "integrity": "sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ==", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "once": "^1.3.0" + "pify": "^3.0.0" } }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + } + } + }, + "dispensary": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/dispensary/-/dispensary-0.28.0.tgz", + "integrity": "sha512-ebXAFZCIysReUMweqUVxz4pv8DxWwSknaPupL540KG+Rd4cvsskP+48hx4sQrREYamiXtf6cZ3RWfPZBJ55tHQ==", + "dev": true, + "requires": { + "array-from": "~2.1.1", + "async": "~2.6.0", + "natural-compare-lite": "~1.4.0", + "pino": "~5.10.6", + "request": "~2.88.0", + "sha.js": "~2.4.4", + "source-map-support": "~0.5.4", + "yargs": "~12.0.1" + } + }, + "dockerfile-ast": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.0.12.tgz", + "integrity": "sha512-cIV8oXkAxpIuN5XgG0TGg07nLDgrj4olkfrdT77OTA3VypscsYHBUg/FjHxW9K3oA+CyH4Th/qtoMgTVpzSobw==", + "dev": true, + "requires": { + "vscode-languageserver-types": "^3.5.0" + } + }, + "docopt": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", + "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dtrace-provider": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz", + "integrity": "sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.10.0" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "table": { - "version": "3.8.3", - "resolved": "http://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "safe-buffer": "~5.1.0" } } } }, - "eslint-plugin-no-unsanitized": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-3.0.2.tgz", - "integrity": "sha512-JnwpoH8Sv4QOjrTDutENBHzSnyYtspdjtglYtqUtAHe6f6LLKqykJle+UwFPg23GGwt5hI3amS9CRDezW8GAww==", + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, - "eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "email-validator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", + "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", "dev": true }, - "eslint-plugin-react": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "envify": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", + "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", + "dev": true, + "requires": { + "esprima": "^4.0.0", + "through": "~2.3.4" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.49", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz", + "integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.0.0.tgz", + "integrity": "sha1-8JTHBB9mJZm7EnINoFnWucf/D0A=", + "dev": true + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "es6-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", "dev": true }, - "espree": { + "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", - "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "es6-promise": "^4.0.3" } }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "estraverse": "^4.0.0" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "estraverse": "^4.1.0" + "d": "1", + "es5-ext": "~0.10.14" } }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { + "es6-weak-map": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, - "ev-emitter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-1.1.1.tgz", - "integrity": "sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q==" + "escodegen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + } } }, - "event-to-promise": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.8.0.tgz", - "integrity": "sha1-S4TxF3K28l93Uvx02XFTGsb1tiY=", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "eslint-plugin-mozilla": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-mozilla/-/eslint-plugin-mozilla-1.0.4.tgz", + "integrity": "sha512-fft+kbWH7zwAgJpakLz+lkMGvbjPH0jy/LI0CHMMdRt91x/Lv/z1poE7zWAGL4Z2CFpRjyl9+/lu9bV1zXI0YA==", "dev": true, "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "htmlparser2": "3.9.2", + "ini-parser": "0.0.2", + "sax": "1.2.4" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { - "is-extendable": "^0.1.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" } } } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "eslint-plugin-no-unsafe-innerhtml": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsafe-innerhtml/-/eslint-plugin-no-unsafe-innerhtml-1.0.16.tgz", + "integrity": "sha1-fQKHjI6b95FriINtWsEitC8VGTI=", "dev": true, - "optional": true, "requires": { - "fill-range": "^2.1.0" + "eslint": "^3.7.1" }, "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, - "optional": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } } }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, - "optional": true, "requires": { - "kind-of": "^3.0.2" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "optional": true, "requires": { - "isarray": "1.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, - "optional": true, "requires": { - "is-buffer": "^1.1.5" + "restore-cursor": "^1.0.1" } - } - } - }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, "requires": { - "is-extendable": "^0.1.0" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, "requires": { - "kind-of": "^6.0.0" + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" } }, - "is-data-descriptor": { + "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, "requires": { - "kind-of": "^6.0.0" + "number-is-nan": "^1.0.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", - "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", - "dev": true - }, - "fast-json-patch": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.0.7.tgz", - "integrity": "sha512-DQeoEyPYxdTtfmB3yDlxkLyKTdbJ6ABfFGcMynDqjvGhPYLto/pZyb/dG2Nyd/n9CArjEWN9ZST++AFmgzgbGw==", - "dev": true, - "requires": { - "deep-equal": "^1.0.1" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fast-redact": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-1.4.2.tgz", - "integrity": "sha512-ttC8IgelNvYqb9RBC+rirgUCVPtPVonfdeRdsHBcBx3kzQat1DafbUKAEhLo5GnvuBqda+Xe1BvblecPpQkZ2Q==", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", - "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==", - "dev": true - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - } - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, "requires": { - "is-extendable": "^0.1.0" + "once": "^1.3.0" } - } - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "firefox-profile": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-0.4.0.tgz", - "integrity": "sha1-hEaME8CaZfzzaoN+baq1lW5LqtE=", - "requires": { - "adm-zip": "~0.4.x", - "archiver": "~1.0.0", - "async": "~1.5.2", - "fs-extra": "~0.30.0", - "ini": "~1.3.3", - "jetpack-id": "1.0.0", - "lazystream": "~1.0.0", - "lodash": "~4.12.0", - "minimist": "^1.1.1", - "node-uuid": "~1.4.7", - "xml2js": "~0.4.4" - }, - "dependencies": { - "jetpack-id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jetpack-id/-/jetpack-id-1.0.0.tgz", - "integrity": "sha1-LPn7rkbYB0/Ba33gBxyO/rykc6Y=" }, - "lodash": { - "version": "4.12.0", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz", - "integrity": "sha1-K9bcRqBA9Z5obJcu0h2T3FkFMlg=" + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - } - } - }, - "first-chunk-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", - "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } } } }, - "fizzy-ui-utils": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fizzy-ui-utils/-/fizzy-ui-utils-2.0.7.tgz", - "integrity": "sha512-CZXDVXQ1If3/r8s0T+v+qVeMshhfcuq0rqIFgJnrtd+Bu8GmDmqMjntjUePypVtjHXKJ6V4sw9zeyox34n9aCg==", - "requires": { - "desandro-matches-selector": "^2.0.0" - } - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" - } - }, - "flatstr": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.9.tgz", - "integrity": "sha512-qFlJnOBWDfIaunF54/lBqNKmXOI0HqNhu+mHkLmbaBXlS71PUd9OjFOdyevHt/aHoHB1+eW7eKHgRKOG5aHSpw==", + "eslint-plugin-no-unsanitized": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-3.0.2.tgz", + "integrity": "sha512-JnwpoH8Sv4QOjrTDutENBHzSnyYtspdjtglYtqUtAHe6f6LLKqykJle+UwFPg23GGwt5hI3amS9CRDezW8GAww==", "dev": true }, - "fluent": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/fluent/-/fluent-0.9.1.tgz", - "integrity": "sha512-RCxPOgGzNm70GXaKaexZEcGVvuc/sOrNTELs2yZpwN4BwXpOn7Zbsrt74uzg8qsT2IrlMDTyQsso1xsPG8TV4g==" + "eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "dev": true }, - "fluent-intl-polyfill": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fluent-intl-polyfill/-/fluent-intl-polyfill-0.1.0.tgz", - "integrity": "sha1-ETOUSrJHeINHOZVZaIPg05z4hc8=", + "eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "dev": true, "requires": { - "intl-pluralrules": "github:projectfluent/IntlPluralRules#94cb0fa1c23ad943bc5aafef43cea132fa51d68b" - }, - "dependencies": { - "intl-pluralrules": { - "version": "github:projectfluent/IntlPluralRules#94cb0fa1c23ad943bc5aafef43cea132fa51d68b", - "from": "github:projectfluent/IntlPluralRules#94cb0fa1c23ad943bc5aafef43cea132fa51d68b" - } + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" } }, - "fluent-langneg": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fluent-langneg/-/fluent-langneg-0.1.0.tgz", - "integrity": "sha512-SzRtXNaIcCyRabIpcv+AQd0gn+tXv1wfDDvej3wtBo1/XV0iDnCw5XzbARRRmZMW+IEg+Q26jup6vYgnDam4dg==" - }, - "fluent-react": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fluent-react/-/fluent-react-0.8.2.tgz", - "integrity": "sha512-skrSplr8nQRk68ZKQ36YAQ1RkMLxCIfXdp5KCpj+KKbXpDY19U+vKKrgrz87kG/UEDXKC8ucorK/D3QslDbXOg==", + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, "requires": { - "cached-iterable": "^0.2.1", - "fluent-sequence": "^0.2.0", - "prop-types": "^15.6.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "fluent-sequence": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/fluent-sequence/-/fluent-sequence-0.2.0.tgz", - "integrity": "sha512-t8fc4rHvzO9Yk8otP8LkTqWo6mzjdemooQcnHlDrNzrYAnwsSbVFIlthnkzK2pLsRnO9Ybmw4lXOYUx+fAIyJw==" - }, - "fluent-syntax": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/fluent-syntax/-/fluent-syntax-0.7.0.tgz", - "integrity": "sha512-T0iqfhC40jrs3aDjYOKgzIQjjhsH2Fa6LnXB6naPv0ymW3DeYMUFa89y9aLKMpi1P9nl2vEimK7blx4tVnUWBg==", + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", "dev": true }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "espree": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", + "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", "dev": true, "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, "requires": { - "map-cache": "^0.2.2" + "estraverse": "^4.0.0" } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "front-matter": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.1.2.tgz", - "integrity": "sha1-91mDufL0E75ljJPf172M5AePXNs=", + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "js-yaml": "^3.4.6" + "estraverse": "^4.1.0" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, - "fs-promise": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-0.3.1.tgz", - "integrity": "sha1-vzQFA2jyTW3J38ZoirXOrY+GhCo=", + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, "requires": { - "any-promise": "~0.1.0" + "d": "1", + "es5-ext": "~0.10.14" } }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "event-to-promise": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.8.0.tgz", + "integrity": "sha1-S4TxF3K28l93Uvx02XFTGsb1tiY=", "dev": true }, - "fs.realpath": { + "execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "optional": true, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, "debug": { "version": "2.6.9", - "bundled": true, - "optional": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "optional": true, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "is-descriptor": "^0.1.0" } }, - "has-unicode": { + "extend-shallow": { "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { - "minimist": "0.0.8" + "is-extendable": "^0.1.0" } }, "ms": { "version": "2.0.0", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "optional": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "is-plain-object": "^2.0.4" } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "is-descriptor": "^1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { - "wrappy": "1" + "is-extendable": "^0.1.0" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "kind-of": "^6.0.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "optional": true, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } + "kind-of": "^6.0.0" } }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "optional": true, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "optional": true, + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-glob": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", + "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", + "dev": true + }, + "fast-json-patch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.0.7.tgz", + "integrity": "sha512-DQeoEyPYxdTtfmB3yDlxkLyKTdbJ6ABfFGcMynDqjvGhPYLto/pZyb/dG2Nyd/n9CArjEWN9ZST++AFmgzgbGw==", + "dev": true, + "requires": { + "deep-equal": "^1.0.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-redact": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-1.4.4.tgz", + "integrity": "sha512-QOQZ8sDDQPZMJ6x6zlm6hLZ2cjPDqfN3R/AYnAbM+yy8VNPvOnVXdUF/E/xbMv7g44c1krhWuzgjH2u0V5Vhsg==", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", + "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==", + "dev": true + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { - "glob": "^7.0.5" + "is-extendable": "^0.1.0" } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "firefox-profile": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-0.4.0.tgz", + "integrity": "sha1-hEaME8CaZfzzaoN+baq1lW5LqtE=", + "dev": true, + "requires": { + "adm-zip": "~0.4.x", + "archiver": "~1.0.0", + "async": "~1.5.2", + "fs-extra": "~0.30.0", + "ini": "~1.3.3", + "jetpack-id": "1.0.0", + "lazystream": "~1.0.0", + "lodash": "~4.12.0", + "minimist": "^1.1.1", + "node-uuid": "~1.4.7", + "xml2js": "~0.4.4" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "optional": true + "jetpack-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jetpack-id/-/jetpack-id-1.0.0.tgz", + "integrity": "sha1-LPn7rkbYB0/Ba33gBxyO/rykc6Y=", + "dev": true }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true + "lodash": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz", + "integrity": "sha1-K9bcRqBA9Z5obJcu0h2T3FkFMlg=", + "dev": true }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true }, - "string-width": { - "version": "1.0.2", - "bundled": true, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true + } + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { "version": "1.1.1", - "bundled": true, - "optional": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true } } }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "flatstr": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.9.tgz", + "integrity": "sha512-qFlJnOBWDfIaunF54/lBqNKmXOI0HqNhu+mHkLmbaBXlS71PUd9OjFOdyevHt/aHoHB1+eW7eKHgRKOG5aHSpw==", + "dev": true + }, + "fluent-syntax": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/fluent-syntax/-/fluent-syntax-0.10.0.tgz", + "integrity": "sha512-6qRhwQXDTgJjS9DW3IiXZWzUMUPqNPzqh+bZZyUOr6t8xYwkIe+5JONYZuvfvbOUk65paAno0kd8s8kUD2ptNA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "front-matter": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.1.2.tgz", + "integrity": "sha1-91mDufL0E75ljJPf172M5AePXNs=", + "dev": true, + "requires": { + "js-yaml": "^3.4.6" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "fs-promise": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-0.3.1.tgz", + "integrity": "sha1-vzQFA2jyTW3J38ZoirXOrY+GhCo=", + "dev": true, + "requires": { + "any-promise": "~0.1.0" + }, + "dependencies": { + "any-promise": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", + "integrity": "sha1-gwtoCqflbzNFHUsEnzvYBESY7ic=", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.1.tgz", + "integrity": "sha512-p+CXqK/iLvDESUWdn3NA3JVO9HxdfI+iXx8xR3DqWgKZvQNiEVpAyUQo0lmwz8rqksb4xaGerG291xuwwhX2kA==", + "dev": true, + "optional": true + }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", @@ -6323,6 +4150,30 @@ "xregexp": "2.0.0" }, "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, "xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", @@ -6358,17 +4209,36 @@ "winreg": "0.0.12" }, "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "isexe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", + "dev": true + }, "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "when": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", - "integrity": "sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=", - "dev": true + "which": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.4.tgz", + "integrity": "sha1-FVf5YIBgTlsRs1meufRbUKnv1yI=", + "dev": true, + "requires": { + "is-absolute": "^0.1.7", + "isexe": "^1.1.1" + } } } }, @@ -6400,104 +4270,43 @@ "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "geckodriver": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-1.14.1.tgz", - "integrity": "sha512-4Lia4i5MGd7aLbgHXKAxjWxZ/HqwqX9fr7HfHLKKqRvF3jNzbO/FxnLUfcRKgdMSHXunRfgi/OxfdkHPMyUhnA==", - "dev": true, - "requires": { - "adm-zip": "0.4.11", - "bluebird": "3.4.6", - "got": "5.6.0", - "https-proxy-agent": "2.2.1", - "tar": "4.0.2" - }, - "dependencies": { - "got": { - "version": "5.6.0", - "resolved": "http://registry.npmjs.org/got/-/got-5.6.0.tgz", - "integrity": "sha1-ux1+4WO3gIK7yOuDbz85UATqb78=", - "dev": true, - "requires": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-plain-obj": "^1.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^2.0.0", - "unzip-response": "^1.0.0", - "url-parse-lax": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } - }, - "timed-out": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", - "dev": true - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true } } }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "geckodriver": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-1.14.1.tgz", + "integrity": "sha512-4Lia4i5MGd7aLbgHXKAxjWxZ/HqwqX9fr7HfHLKKqRvF3jNzbO/FxnLUfcRKgdMSHXunRfgi/OxfdkHPMyUhnA==", + "dev": true, + "requires": { + "adm-zip": "0.4.11", + "bluebird": "3.4.6", + "got": "5.6.0", + "https-proxy-agent": "2.2.1", + "tar": "4.0.2" + } + }, "generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, "requires": { "is-property": "^1.0.2" } @@ -6506,32 +4315,17 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, "requires": { "is-property": "^1.0.0" } }, - "generic-pool": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.3.tgz", - "integrity": "sha1-eAw29p360FpaBF3Te+etyhGk9v8=" - }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, - "get-size": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/get-size/-/get-size-2.0.3.tgz", - "integrity": "sha512-lXNzT/h/dTjTxRbm9BXb+SGxxzkm97h/PCIKtlN/CBCxxmkkIVV21udumMS93MuVTDX583gqc94v3RjuHmI+2Q==" - }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -6539,9 +4333,13 @@ "dev": true }, "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, "get-uri": { "version": "2.0.3", @@ -6565,53 +4363,22 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "readable-stream": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", - "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "gettext-parser": { @@ -6636,7 +4403,7 @@ "dependencies": { "graceful-fs": { "version": "4.1.11", - "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, @@ -6657,6 +4424,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6664,60 +4432,13 @@ "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } } }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -6727,6 +4448,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, "requires": { "is-extglob": "^2.1.0" } @@ -6743,34 +4465,36 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, "requires": { "ini": "^1.3.4" } }, "globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", "dev": true }, "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", "dev": true, "requires": { "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" }, "dependencies": { "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } @@ -6784,14 +4508,6 @@ "glob": "~7.1.1", "lodash": "~4.17.10", "minimatch": "~3.0.2" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "gonzales-pe-sl": { @@ -6805,39 +4521,79 @@ "dependencies": { "minimist": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", "dev": true } } }, "got": { - "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", + "integrity": "sha1-ux1+4WO3gIK7yOuDbz85UATqb78=", + "dev": true, "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-plain-obj": "^1.0.0", "is-redirect": "^1.0.0", "is-retry-allowed": "^1.0.0", "is-stream": "^1.0.0", "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^2.0.0", + "unzip-response": "^1.0.0", "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", + "dev": true + } } }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true }, "graphlib": { "version": "2.1.7", @@ -6846,14 +4602,6 @@ "dev": true, "requires": { "lodash": "^4.17.5" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "growl": { @@ -6877,6 +4625,12 @@ "xtend": "~2.1.1" }, "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, "xtend": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", @@ -6888,73 +4642,20 @@ } } }, - "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", - "dev": true, - "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true, - "optional": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - } - } - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, "has": { @@ -6970,6 +4671,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6983,7 +4685,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-symbols": { "version": "1.0.0", @@ -7001,6 +4704,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -7011,6 +4715,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -7020,6 +4725,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7033,38 +4739,26 @@ "dev": true, "requires": { "async": "~1.5" - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } } }, "hawk": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-7.0.10.tgz", - "integrity": "sha512-3RWF4SXN9CdZ1VDAe6Pn3Rd0tC3Lw+GV+esX5oKCrXoScZK3Ri6dl5Wt986M/hlzU+GuapTGiB0rBhGeRIBQsw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, "requires": { - "b64": "4.x.x", - "boom": "7.x.x", - "cryptiles": "4.x.x", - "hoek": "6.x.x", - "sntp": "3.x.x" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "he": { @@ -7073,21 +4767,11 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "hoek": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.0.2.tgz", - "integrity": "sha512-0RGPLkyxpsMJVj/iOCaJaIWFEch988eUicJJpRiQ+Or1CMvBXcoZPlSx9FhreDWw4hxMYy8xgTEdlsYQDTnxWA==" + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true }, "home-or-tmp": { "version": "3.0.0", @@ -7101,70 +4785,30 @@ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, "htmlparser2": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", - "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { - "domelementtype": "^1.3.0", + "domelementtype": "^1.3.1", "domhandler": "^2.3.0", "domutils": "^1.5.1", "entities": "^1.1.1", "inherits": "^2.0.1", - "readable-stream": "^3.0.6" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "readable-stream": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", - "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "readable-stream": "^3.1.1" } }, "http-errors": { - "version": "1.5.1", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", - "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, "requires": { + "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.0.2", - "statuses": ">= 1.3.1 < 2" + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" } }, "http-proxy-agent": { @@ -7185,25 +4829,26 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { - "assert-plus": "^0.2.0", + "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "https-proxy-agent": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", @@ -7212,37 +4857,22 @@ "requires": { "agent-base": "^4.1.0", "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true }, "ignore": { "version": "3.3.10", @@ -7253,15 +4883,8 @@ "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" - }, - "imagesloaded": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/imagesloaded/-/imagesloaded-4.1.4.tgz", - "integrity": "sha512-ltiBVcYpc/TYTF5nolkMNsnREHW+ICvfQ3Yla2Sgr71YFwQ86bDwV9hgpFhFtrGPuwEx5+LqOHIrdXBdoWwwsA==", - "requires": { - "ev-emitter": "^1.0.0" - } + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true }, "immediate": { "version": "3.0.6", @@ -7298,12 +4921,14 @@ "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "in-publish": { "version": "2.0.0", @@ -7324,6 +4949,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -7332,12 +4958,14 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true }, "ini-parser": { "version": "0.0.2", @@ -7345,18 +4973,9 @@ "integrity": "sha1-+kF4flZ3Y7P/Zdel2alO23QHh+8=", "dev": true }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, "inquirer": { "version": "5.2.0", - "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { @@ -7381,26 +5000,6 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -7409,64 +5008,15 @@ "requires": { "ansi-regex": "^3.0.0" } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, - "insert-module-globals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", - "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - } - }, - "intel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/intel/-/intel-1.2.0.tgz", - "integrity": "sha1-EdEUfraz9Fgr31M3s31UFYTp5B4=", - "requires": { - "chalk": "^1.1.0", - "dbug": "~0.4.2", - "stack-trace": "~0.0.9", - "strftime": "~0.10.0", - "symbol": "~0.3.1", - "utcstring": "~0.1.0" - } - }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", @@ -7479,15 +5029,11 @@ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" - }, "is-absolute": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", + "dev": true, "requires": { "is-relative": "^0.1.0" } @@ -7496,6 +5042,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -7504,6 +5051,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7520,6 +5068,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, "requires": { "binary-extensions": "^1.0.0" } @@ -7529,15 +5078,6 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -7548,6 +5088,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, "requires": { "ci-info": "^1.5.0" } @@ -7556,6 +5097,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -7564,6 +5106,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7580,6 +5123,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -7589,7 +5133,8 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -7599,620 +5144,247 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "optional": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "optional": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-mergeable-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-mergeable-object/-/is-mergeable-object-1.1.0.tgz", - "integrity": "sha512-JfyDDwUdtS4yHCgUpxOyKB9dnfZ0gecufxB0eytX6BmSXSE+8dbxDGt+V7CNRIRJ9sYFV/WQt2KJG6hNob2sBw==", - "dev": true - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==" - }, - "is-my-json-valid": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", - "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "optional": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "optional": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=" - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, - "is-symbol": { + "is-finite": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "number-is-nan": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } }, - "is-wsl": { + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-mergeable-object": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "resolved": "https://registry.npmjs.org/is-mergeable-object/-/is-mergeable-object-1.1.0.tgz", + "integrity": "sha512-JfyDDwUdtS4yHCgUpxOyKB9dnfZ0gecufxB0eytX6BmSXSE+8dbxDGt+V7CNRIRJ9sYFV/WQt2KJG6hNob2sBw==", "dev": true }, - "isarray": { + "is-my-ip-valid": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isemail": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", - "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" - }, - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "is-my-json-valid": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", + "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", + "dev": true, "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - }, - "dependencies": { - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - } + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true }, - "istanbul-middleware": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/istanbul-middleware/-/istanbul-middleware-0.2.2.tgz", - "integrity": "sha1-g8TBPBKOGg1qFHeSORrzwVqKuOA=", - "dev": true, - "requires": { - "archiver": "0.14.x", - "body-parser": "~1.12.3", - "express": "4.x", - "istanbul": "0.4.x" - }, - "dependencies": { - "archiver": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.14.4.tgz", - "integrity": "sha1-W53bn17hzu8hy487Ag5iQOy0MVw=", - "dev": true, - "requires": { - "async": "~0.9.0", - "buffer-crc32": "~0.2.1", - "glob": "~4.3.0", - "lazystream": "~0.1.0", - "lodash": "~3.2.0", - "readable-stream": "~1.0.26", - "tar-stream": "~1.1.0", - "zip-stream": "~0.5.0" - } - }, - "async": { - "version": "0.9.2", - "resolved": "http://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - }, - "bl": { - "version": "0.9.5", - "resolved": "http://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "dev": true, - "requires": { - "readable-stream": "~1.0.26" - } - }, - "body-parser": { - "version": "1.12.4", - "resolved": "http://registry.npmjs.org/body-parser/-/body-parser-1.12.4.tgz", - "integrity": "sha1-CQcAxLoohiqFIO83g5X97l9hwik=", - "dev": true, - "requires": { - "bytes": "1.0.0", - "content-type": "~1.0.1", - "debug": "~2.2.0", - "depd": "~1.0.1", - "iconv-lite": "0.4.8", - "on-finished": "~2.2.1", - "qs": "2.4.2", - "raw-body": "~2.0.1", - "type-is": "~1.6.2" - } - }, - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", - "dev": true - }, - "compress-commons": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-0.2.9.tgz", - "integrity": "sha1-Qi2SdDDAGr0GzUVbbfwEy0z4ADw=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.1", - "crc32-stream": "~0.3.1", - "node-int64": "~0.3.0", - "readable-stream": "~1.0.26" - } - }, - "crc32-stream": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.3.4.tgz", - "integrity": "sha1-c7wltF+sHbZjIjGnv86JJ+nwZVI=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.1", - "readable-stream": "~1.0.24" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "depd": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=", - "dev": true - }, - "ee-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz", - "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=", - "dev": true - }, - "glob": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz", - "integrity": "sha1-gPuwjKVA8jiszl0R0em8QedRc9M=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - } - }, - "iconv-lite": { - "version": "0.4.8", - "resolved": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.8.tgz", - "integrity": "sha1-xgGadZXyzvynAuq2lKAQvNkpjSA=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "lazystream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", - "integrity": "sha1-GyXWPHcqTCDwpe0KnXf0hLbhaSA=", - "dev": true, - "requires": { - "readable-stream": "~1.0.2" - } - }, - "lodash": { - "version": "3.2.0", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.2.0.tgz", - "integrity": "sha1-S/UKMkP5rrC6xBpV09WZBnWkYvs=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "on-finished": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz", - "integrity": "sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk=", - "dev": true, - "requires": { - "ee-first": "1.1.0" - } - }, - "qs": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.4.2.tgz", - "integrity": "sha1-9854jld33wtQENp/fE5zujJHD1o=", - "dev": true - }, - "raw-body": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.0.2.tgz", - "integrity": "sha1-osL5jIUxzumcY9jSOLfel7tln8o=", - "dev": true, - "requires": { - "bytes": "2.1.0", - "iconv-lite": "0.4.8" - }, - "dependencies": { - "bytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", - "integrity": "sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q=", - "dev": true - } - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "tar-stream": { - "version": "1.1.5", - "resolved": "http://registry.npmjs.org/tar-stream/-/tar-stream-1.1.5.tgz", - "integrity": "sha1-vpIYwTDCACnhB7D5Z/sj3gV50Tw=", - "dev": true, - "requires": { - "bl": "^0.9.0", - "end-of-stream": "^1.0.0", - "readable-stream": "~1.0.33", - "xtend": "^4.0.0" - } - }, - "zip-stream": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.5.2.tgz", - "integrity": "sha1-Mty8UG0Nq00hNyYlvX66rDwv/1Y=", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "compress-commons": "~0.2.0", - "lodash": "~3.2.0", - "readable-stream": "~1.0.26" + "is-buffer": "^1.1.5" } } } }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-relative": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", + "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isemail": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, "jed": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz", @@ -8222,52 +5394,45 @@ "jetpack-id": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/jetpack-id/-/jetpack-id-0.0.4.tgz", - "integrity": "sha1-b8NaOUpK6hkIIKLOfyPSu1NRKps=" + "integrity": "sha1-b8NaOUpK6hkIIKLOfyPSu1NRKps=", + "dev": true }, "jetpack-validation": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/jetpack-validation/-/jetpack-validation-0.0.7.tgz", "integrity": "sha1-VBgGWwKa89t3gvxTd11SpjP7BLo=", + "dev": true, "requires": { "jetpack-id": "0.0.4", "resolve": "^0.7.1", "semver": "^5.3.0" }, "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "resolve": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", + "integrity": "sha1-OVqe+ehz+/4SvRRAi9kbuTYAPWk=", + "dev": true } } }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, "joi": { "version": "6.10.1", - "resolved": "http://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", + "dev": true, "requires": { "hoek": "2.x.x", "isemail": "1.x.x", "moment": "2.x.x", "topo": "1.x.x" - }, - "dependencies": { - "hoek": { - "version": "2.16.3", - "resolved": "http://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - } } }, "jpm": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jpm/-/jpm-1.3.1.tgz", "integrity": "sha1-QwyYGT6HaS+czXL2yzSOryJN/hU=", + "dev": true, "requires": { "commander": "2.9.0", "decompress-zip": "0.3.0", @@ -8297,10 +5462,20 @@ "zip-dir": "1.0.2" }, "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, "fx-runner": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/fx-runner/-/fx-runner-1.0.5.tgz", "integrity": "sha1-cTUZrKdZioMZ4D+hEQuJuX7xBj8=", + "dev": true, "requires": { "commander": "2.9.0", "fs-promise": "0.3.1", @@ -8314,36 +5489,74 @@ "dependencies": { "lodash": { "version": "3.10.1", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true }, "when": { "version": "3.7.7", "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", - "integrity": "sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=" + "integrity": "sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=", + "dev": true } } }, + "isexe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", + "dev": true + }, + "lodash": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.11.1.tgz", + "integrity": "sha1-oyEG644uyOgsJBYRQUdzyd8V+Lw=", + "dev": true + }, + "minimatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", + "integrity": "sha1-DzmKcwDqRB6cNIyD2Yq4ydv5xAo=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, "object-assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=" + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true }, - "xml2js": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.16.tgz", - "integrity": "sha1-+C/M0vlUDX4Km12sFj50cRlcnbM=", + "semver": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=", + "dev": true + }, + "tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", + "dev": true, "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "^4.1.0" + "os-tmpdir": "~1.0.1" } }, - "xmlbuilder": { - "version": "4.2.1", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", - "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", + "when": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.2.tgz", + "integrity": "sha1-Br7RKW3zoL/YP38xxeHXeb2X6ug=", + "dev": true + }, + "which": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.4.tgz", + "integrity": "sha1-FVf5YIBgTlsRs1meufRbUKnv1yI=", + "dev": true, "requires": { - "lodash": "^4.0.0" + "is-absolute": "^0.1.7", + "isexe": "^1.1.1" } } } @@ -8351,12 +5564,13 @@ "jpm-core": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/jpm-core/-/jpm-core-0.0.11.tgz", - "integrity": "sha1-iJBNeAh6rcbp8igl3LNKZ88uOsc=" + "integrity": "sha1-iJBNeAh6rcbp8igl3LNKZ88uOsc=", + "dev": true }, "js-base64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", - "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "dev": true }, "js-select": { @@ -8377,20 +5591,16 @@ } } }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=" - }, "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", + "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -8406,155 +5616,9 @@ } }, "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.1.0.tgz", - "integrity": "sha512-C2Kp0qNuopw0smXFaHeayvharqF3kkcNqlcIlSX71+3XrsOFwkEPLt/9f5JksMmaul2JZYIQuY+WTpqHpQQcLg==", - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.0.9", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - } - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, "json-merge-patch": { @@ -8575,12 +5639,14 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify": { "version": "1.0.1", @@ -8600,20 +5666,14 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "jsonfile": { "version": "2.4.0", - "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -8621,28 +5681,26 @@ "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, "jsonpointer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true }, "jsontoxml": { "version": "0.0.11", - "resolved": "http://registry.npmjs.org/jsontoxml/-/jsontoxml-0.0.11.tgz", - "integrity": "sha1-Nzq1sgcL43N6X7PjL9G3uBhwyqQ=" + "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-0.0.11.tgz", + "integrity": "sha1-Nzq1sgcL43N6X7PjL9G3uBhwyqQ=", + "dev": true }, "jsonwebtoken": { "version": "7.1.9", - "resolved": "http://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.1.9.tgz", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.1.9.tgz", "integrity": "sha1-hHgE5SWL7FqUmajcSl56O64I1Yo=", + "dev": true, "requires": { "joi": "^6.10.1", "jws": "^3.1.3", @@ -8654,7 +5712,8 @@ "ms": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", - "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=" + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", + "dev": true } } }, @@ -8662,18 +5721,12 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "jsx-ast-utils": { @@ -8689,43 +5742,43 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.4.0.tgz", "integrity": "sha1-SHqTt2w7/6bLCFzWHrk06r4tKU8=", + "dev": true, "requires": { "pako": "~0.2.5" } }, "jwa": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", - "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, "requires": { "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.10", + "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "jws": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", - "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, "requires": { - "jwa": "^1.1.5", + "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } }, - "keygrip": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", - "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==" - }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true }, "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, "requires": { "graceful-fs": "^4.1.9" } @@ -8736,29 +5789,11 @@ "integrity": "sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==", "dev": true }, - "labeled-stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", - "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "isarray": "^2.0.4", - "stream-splicer": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", - "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", - "dev": true - } - } - }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, "requires": { "package-json": "^4.0.0" } @@ -8773,14 +5808,16 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, "requires": { "readable-stream": "^2.0.5" }, "dependencies": { "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8795,6 +5832,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -8814,15 +5852,16 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, "requires": { "immediate": "~3.0.5" @@ -8830,7 +5869,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -8841,12 +5880,6 @@ "strip-bom": "^2.0.0" }, "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", @@ -8859,19 +5892,20 @@ } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "lodash": { - "version": "4.11.1", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-4.11.1.tgz", - "integrity": "sha1-oyEG644uyOgsJBYRQUdzyd8V+Lw=" + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true }, "lodash.assign": { "version": "4.2.0", @@ -8900,12 +5934,8 @@ "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true }, "lodash.flatten": { "version": "4.4.0", @@ -8961,12 +5991,6 @@ "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", "dev": true }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, "lodash.mergewith": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", @@ -8976,7 +6000,8 @@ "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "dev": true }, "lodash.set": { "version": "4.3.2", @@ -8987,7 +6012,8 @@ "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true }, "log-symbols": { "version": "2.2.0", @@ -8996,43 +6022,13 @@ "dev": true, "requires": { "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } @@ -9050,12 +6046,14 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -9071,14 +6069,23 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, "requires": { "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "map-age-cleaner": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", - "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" @@ -9087,7 +6094,8 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true }, "map-obj": { "version": "1.0.1", @@ -9099,26 +6107,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, "requires": { "object-visit": "^1.0.0" } }, - "masonry-layout": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/masonry-layout/-/masonry-layout-4.2.2.tgz", - "integrity": "sha512-iGtAlrpHNyxaR19CvKC3npnEcAwszXoyJiI8ARV2ePi7fmYhIud25MHK8Zx4P0LCC4d3TNO9+rFa1KoK1OEOaA==", - "requires": { - "get-size": "^2.0.2", - "outlayer": "^2.1.0" - } - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true, - "optional": true - }, "md5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", @@ -9129,17 +6122,6 @@ "is-buffer": "~1.1.1" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "mdn-browser-compat-data": { "version": "0.0.63", "resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-0.0.63.tgz", @@ -9155,20 +6137,15 @@ "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", "dev": true }, - "media-typer": { - "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.2.0.tgz", + "integrity": "sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" } }, "memorystream": { @@ -9179,7 +6156,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -9200,18 +6177,20 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, "merge": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true }, "merge2": { "version": "1.2.3", @@ -9219,15 +6198,11 @@ "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", "dev": true }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -9244,32 +6219,25 @@ "to-regex": "^3.0.2" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "dev": true }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "~1.38.0" } }, "mimeparse": { @@ -9279,35 +6247,25 @@ "dev": true }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz", + "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==", "dev": true }, "minimatch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", - "integrity": "sha1-DzmKcwDqRB6cNIyD2Yq4ydv5xAo=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { - "brace-expansion": "^1.0.0" + "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "minipass": { "version": "2.3.5", @@ -9320,17 +6278,17 @@ }, "dependencies": { "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true } } }, "minizlib": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.1.tgz", - "integrity": "sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, "requires": { "minipass": "^2.2.1" @@ -9340,6 +6298,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -9349,6 +6308,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -9375,28 +6335,18 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } } }, "mkpath": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", - "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=" - }, - "mobile-detect": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/mobile-detect/-/mobile-detect-1.4.3.tgz", - "integrity": "sha512-UaahPNLllQsstHOEHAmVnTHCMQrAS9eL5Qgdi50QrYz6UgGk+Xziz2udz2GN6NYcyODcPLnasC7a7s6R2DjiaQ==" + "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=", + "dev": true }, "mocha": { "version": "5.2.0", @@ -9419,7 +6369,7 @@ "dependencies": { "commander": { "version": "2.15.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -9446,14 +6396,11 @@ "path-is-absolute": "^1.0.0" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "supports-color": { "version": "5.4.0", @@ -9466,119 +6413,29 @@ } } }, - "module-deps": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz", - "integrity": "sha512-NPs5N511VD1rrVJihSso/LiBShRbJALYBKzDW91uZYy7BpjnO4bGnZL3HjZ9yKcFdZUWwaYjDz9zxbuP7vKMuQ==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.0.2", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" - }, - "morgan": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", - "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", - "requires": { - "basic-auth": "~2.0.0", - "debug": "2.6.9", - "depd": "~1.1.2", - "on-finished": "~2.3.0", - "on-headers": "~1.0.1" - } + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true }, "mozilla-toolkit-versioning": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/mozilla-toolkit-versioning/-/mozilla-toolkit-versioning-0.0.2.tgz", - "integrity": "sha1-kFkOBdSN/cNbY6ItAjOmyufCd/8=" + "integrity": "sha1-kFkOBdSN/cNbY6ItAjOmyufCd/8=", + "dev": true }, "mozilla-version-comparator": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/mozilla-version-comparator/-/mozilla-version-comparator-1.0.2.tgz", - "integrity": "sha1-+Gcx5wwV0f9esojRO0240eYF9/w=" - }, - "mozlog": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mozlog/-/mozlog-2.2.0.tgz", - "integrity": "sha1-Rwk8XHEuKBDecnCYMFFk0SyK6SM=", - "requires": { - "intel": "^1.0.0", - "merge": "^1.2.0" - } + "integrity": "sha1-+Gcx5wwV0f9esojRO0240eYF9/w=", + "dev": true }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.1.tgz", - "integrity": "sha512-zzOLNRxzszwd+61JFuAo0fxdQfvku12aNJgnla0AQ+hHxFmfc/B7jBVuPr5Rmvu46Jze/iJrFpSOsD7afO8SDw==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^0.2.11", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.1", - "on-finished": "^2.3.0", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true }, "multimatch": { "version": "2.1.0", @@ -9595,7 +6452,8 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true }, "mv": { "version": "2.1.1", @@ -9625,7 +6483,7 @@ }, "rimraf": { "version": "2.4.5", - "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", "dev": true, "optional": true, @@ -9639,28 +6497,24 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.4.0.tgz", "integrity": "sha1-mHupYk2JOVOIw3y0dB4sr03ROxo=", + "dev": true, "requires": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" - }, - "dependencies": { - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - } } }, "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.1.tgz", + "integrity": "sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==", + "dev": true }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -9699,6 +6553,12 @@ "yargs": "^3.19.0" }, "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", @@ -9748,7 +6608,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -9774,7 +6634,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "dev": true, "requires": { @@ -9791,7 +6651,7 @@ }, "ncp": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", "dev": true, "optional": true @@ -9807,18 +6667,22 @@ "sax": "^1.2.4" }, "dependencies": { - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + } }, "neo-async": { "version": "2.6.0", @@ -9834,7 +6698,7 @@ }, "next-tick": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, @@ -9844,11 +6708,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-fetch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", - "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" - }, "node-forge": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", @@ -9875,94 +6734,15 @@ "which": "1" }, "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, "semver": { "version": "5.3.0", - "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true }, "tar": { "version": "2.2.1", - "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { @@ -9970,34 +6750,9 @@ "fstream": "^1.0.2", "inherits": "2" } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } } } }, - "node-int64": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.3.3.tgz", - "integrity": "sha1-LW5rLs5d6FiLQ9iNG8QbJs0fqE0=", - "dev": true - }, "node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", @@ -10014,29 +6769,6 @@ "semver": "^5.4.1", "shellwords": "^0.1.1", "which": "^1.3.0" - }, - "dependencies": { - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "node-sass": { @@ -10066,23 +6798,24 @@ "true-case-path": "^1.0.2" }, "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } }, "cross-spawn": { "version": "3.0.1", @@ -10094,123 +6827,31 @@ "which": "^1.2.9" } }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "isexe": { + "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, - "node-statsd": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/node-statsd/-/node-statsd-0.1.1.tgz", - "integrity": "sha1-J6WTSHY9CvegN6wqAx/vPwUQE9M=" - }, "node-status-codes": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", "dev": true }, "node-watch": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.3.4.tgz", - "integrity": "sha1-dV9k71+K1Ky1uv0sTn9PtqjbAhQ=" + "integrity": "sha1-dV9k71+K1Ky1uv0sTn9PtqjbAhQ=", + "dev": true }, "nodemon": { "version": "1.18.9", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.9.tgz", "integrity": "sha512-oj/eEVTEI47pzYAjGkpcNw0xYwTl4XSTUQv2NPQI6PpN3b75PhpuYk3Vb3U80xHCyM2Jm+1j68ULHXl4OR3Afw==", + "dev": true, "requires": { "chokidar": "^2.0.4", "debug": "^3.1.0", @@ -10224,63 +6865,26 @@ "update-notifier": "^2.5.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, "nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, "requires": { "abbrev": "1" } }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, "requires": { "nopt": "~1.0.10" } } } }, - "nodify-uuid": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/nodify-uuid/-/nodify-uuid-0.0.1.tgz", - "integrity": "sha1-3Ik5JHfhwkr+umRkOMY2H1USrWg=" - }, "nomnom": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", @@ -10299,7 +6903,7 @@ }, "chalk": { "version": "0.4.0", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { @@ -10310,7 +6914,7 @@ }, "strip-ansi": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", "dev": true } @@ -10320,18 +6924,19 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, "requires": { "abbrev": "1" } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } @@ -10340,6 +6945,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -10361,45 +6967,6 @@ "string.prototype.padend": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -10412,15 +6979,6 @@ "strip-bom": "^3.0.0" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -10440,6 +6998,12 @@ "pify": "^3.0.0" } }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -10450,30 +7014,6 @@ "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -10481,6 +7021,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, "requires": { "path-key": "^2.0.0" } @@ -10512,25 +7053,23 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "nwsapi": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", - "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==" - }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -10541,6 +7080,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -10549,6 +7089,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -10556,14 +7097,16 @@ } }, "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", + "dev": true }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, "requires": { "isobject": "^3.0.0" } @@ -10573,71 +7116,37 @@ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "optional": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "optional": true, - "requires": { - "for-in": "^1.0.1" - } - } + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, "requires": { "isobject": "^3.0.1" } }, "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -10649,12 +7158,21 @@ "dev": true, "requires": { "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } } }, "open": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", - "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=" + "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", + "dev": true }, "opn": { "version": "5.3.0", @@ -10665,34 +7183,11 @@ "is-wsl": "^1.1.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", @@ -10702,12 +7197,6 @@ "wordwrap": "~1.0.0" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -10715,65 +7204,14 @@ "dev": true }, "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "^0.10.0", + "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "os-name": { @@ -10789,12 +7227,14 @@ "os-shim": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=" + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", + "dev": true }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "osenv": { "version": "0.1.5", @@ -10806,27 +7246,6 @@ "os-tmpdir": "^1.0.0" } }, - "outlayer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/outlayer/-/outlayer-2.1.1.tgz", - "integrity": "sha1-KYY7beEOpdrf/8rfoNcokHOH6aI=", - "requires": { - "ev-emitter": "^1.0.0", - "fizzy-ui-utils": "^2.0.0", - "get-size": "^2.0.2" - } - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -10836,36 +7255,37 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", "dev": true }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.0.0" } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.1.0.tgz", + "integrity": "sha512-H2RyIJ7+A3rjkwKC2l5GGtU4H1vkxKCAGsWasNVd0Set+6i4znxbWy6/j16YDPJDWxhsgZiKAstMEP8wCdSpjA==", "dev": true }, "pac-proxy-agent": { @@ -10882,23 +7302,6 @@ "pac-resolver": "^3.0.0", "raw-body": "^2.2.0", "socks-proxy-agent": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "pac-resolver": { @@ -10918,84 +7321,53 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, "requires": { "got": "^6.7.1", "registry-auth-token": "^3.0.1", "registry-url": "^3.0.3", "semver": "^5.1.0" - } - }, - "packet-reader": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-0.3.1.tgz", - "integrity": "sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc=" - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" - }, - "params": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/params/-/params-0.1.1.tgz", - "integrity": "sha1-i0hkqn5QVXUgm6MvlLBNpJOhAjQ=", - "requires": { - "type-detect": "~0.1.2" - } - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" }, "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, - "optional": true, "requires": { - "is-extglob": "^1.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true } } }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -11006,19 +7378,19 @@ } }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true }, "path": { "version": "0.12.7", @@ -11030,16 +7402,11 @@ "util": "^0.10.3" } }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true }, "path-exists": { "version": "3.0.0", @@ -11050,17 +7417,20 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, "path-parse": { "version": "1.0.6", @@ -11068,17 +7438,6 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -11088,27 +7447,6 @@ "graceful-fs": "^4.1.2", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" } }, "pend": { @@ -11120,100 +7458,8 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pg": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/pg/-/pg-6.2.5.tgz", - "integrity": "sha1-zT5NnYJSUtHhe/Ve/U8XEPt7zSI=", - "requires": { - "buffer-writer": "1.0.1", - "js-string-escape": "1.0.1", - "packet-reader": "0.3.1", - "pg-connection-string": "0.1.3", - "pg-pool": "1.*", - "pg-types": "1.*", - "pgpass": "1.x", - "semver": "4.3.2" - }, - "dependencies": { - "semver": { - "version": "4.3.2", - "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.2.tgz", - "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" - } - } - }, - "pg-connection-string": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", - "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" - }, - "pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" - }, - "pg-patcher": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/pg-patcher/-/pg-patcher-0.4.0.tgz", - "integrity": "sha1-M87l+9M/Js15rI45Vyvan787WM8=", - "requires": { - "argh": "~0.1.1", - "async": "~0.2.9", - "xtend": "~2.1.1" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "http://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "pg-pool": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-1.8.0.tgz", - "integrity": "sha1-9+xzgkw3oD8Hb1G/33DjQBR8Tzc=", - "requires": { - "generic-pool": "2.4.3", - "object-assign": "4.1.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=" - } - } - }, - "pg-types": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.13.0.tgz", - "integrity": "sha512-lfKli0Gkl/+za/+b6lzENajczwZHc7D5kiUCZfgm914jipD2kIOIvEkAhZ8GrW3/TUoP9w8FHjwpPObBye5KQQ==", - "requires": { - "pg-int8": "1.0.1", - "postgres-array": "~1.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.0", - "postgres-interval": "^1.1.0" - } - }, - "pgpass": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", - "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", - "requires": { - "split": "^1.0.0" - } + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "pidtree": { "version": "0.3.0", @@ -11222,19 +7468,22 @@ "dev": true }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, "requires": { "pinkie": "^2.0.0" } @@ -11260,9 +7509,9 @@ "dev": true }, "pirates": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.0.tgz", - "integrity": "sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, "requires": { "node-modules-regexp": "^1.0.0" @@ -11275,6 +7524,51 @@ "dev": true, "requires": { "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } } }, "pluralize": { @@ -11283,14 +7577,9 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, "po2json": { "version": "0.4.5", - "resolved": "http://registry.npmjs.org/po2json/-/po2json-0.4.5.tgz", + "resolved": "https://registry.npmjs.org/po2json/-/po2json-0.4.5.tgz", "integrity": "sha1-R7spUtoy1Yob4vJWpZjuvAt0URg=", "dev": true, "requires": { @@ -11308,54 +7597,37 @@ "minimist": "^1.2.0", "properties-parser": "^0.3.1", "q-io": "^1.13.2" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } } }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true }, "postcss": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", - "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.12.tgz", + "integrity": "sha512-VTxN8+cqf0uRJ/4ngbDTdFgEaNeuF24mV17tmZrTnjOWoS4TNT3BkX0OKaASYU8itH+j0EHlCcxaNp+QmKMuvQ==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "source-map": "^0.6.1", - "supports-color": "^5.5.0" + "supports-color": "^6.1.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -11383,26 +7655,6 @@ "yargs": "^12.0.1" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -11420,21 +7672,6 @@ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -11443,15 +7680,6 @@ "requires": { "graceful-fs": "^4.1.6" } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -11484,125 +7712,26 @@ "lodash": "^4.17.11", "log-symbols": "^2.2.0", "postcss": "^7.0.7" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "postcss": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.11.tgz", - "integrity": "sha512-9AXb//5UcjeOEof9T+yPw3XTa5SL207ZOIC/lHYP4mbUTEh4M0rDAQekQpVANCZdwQwKhBtFZCk3i3h3h2hdWg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postgres-array": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.3.tgz", - "integrity": "sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ==" - }, - "postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" - }, - "postgres-date": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.3.tgz", - "integrity": "sha1-4tiXAu/bJY/52c7g/pG9BpdSV6g=" - }, - "postgres-interval": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.1.2.tgz", - "integrity": "sha512-fC3xNHeTskCxL1dC8KOtxXt7YeFmlbTYtn7ul8MkVERuTmf7pI4DrkAxcw3kh1fQ9uz4wQmd03a1mRiXUZChfQ==", - "requires": { - "xtend": "^4.0.0" } }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": true + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true }, "pretty-hrtime": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, "probe-image-size": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-4.0.0.tgz", @@ -11617,115 +7746,11 @@ "stream-parser": "~0.3.1" }, "dependencies": { - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "deepmerge": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } } } }, @@ -11738,18 +7763,20 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true }, "progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, "requires": { "asap": "~2.0.3" } @@ -11758,17 +7785,20 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", + "dev": true, "requires": { "read": "1" } }, "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" } }, "properties-parser": { @@ -11780,18 +7810,9 @@ "string.prototype.codepointat": "^0.2.0" } }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" - } - }, "proxy-agent": { "version": "2.3.1", - "resolved": "http://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", "dev": true, "requires": { @@ -11803,23 +7824,6 @@ "pac-proxy-agent": "^2.0.1", "proxy-from-env": "^1.0.0", "socks-proxy-agent": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "proxy-from-env": { @@ -11831,31 +7835,20 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true }, "pstree.remy": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.6.tgz", - "integrity": "sha512-NdF35+QsqD7EgNEI5mkI/X+UwaxVEbQaz9f4IooEmMUv6ZPmlTQYGjBPJGgrlzNdjSvIy4MWMg6Q6vCgBO2K+w==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } + "integrity": "sha512-NdF35+QsqD7EgNEI5mkI/X+UwaxVEbQaz9f4IooEmMUv6ZPmlTQYGjBPJGgrlzNdjSvIy4MWMg6Q6vCgBO2K+w==", + "dev": true }, "pump": { "version": "3.0.0", @@ -11870,12 +7863,14 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true }, "q-io": { "version": "1.13.6", @@ -11891,94 +7886,25 @@ "url2": "^0.0.0" }, "dependencies": { - "qs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", - "integrity": "sha1-GbV/8k3CqZzh+L32r82ln472H4g=", - "dev": true - } - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.2.0.tgz", - "integrity": "sha512-5wupExkIt8RYL4h/FE+WTg3JHk62e6fFPWtAZA9J5IWK1PfTfKkMS93HBUHcFpeYi9KsY5pFbh+ldvEyaz5MyA==", - "requires": { - "decode-uri-component": "^0.2.0", - "strict-uri-encode": "^2.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "quick-format-unescaped": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.1.tgz", - "integrity": "sha512-Tnk4iJQ8x3V8ml3x9sLIf4tSDaVB9OJY/5gOrnxgK63CXKphhn8oYOPI4tqnXPQcZ3tCv7GFjeoYY5h6UAvuzg==", - "dev": true - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "optional": true + "qs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "integrity": "sha1-GbV/8k3CqZzh+L32r82ln472H4g=", + "dev": true } } }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "quick-format-unescaped": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.2.tgz", + "integrity": "sha512-FXTaCkwvpIlkdKeGDNgcq07SXWS383noQUuZjvdE1QcTt+eLuqof6/BDiEPqB59FWLie/l91+HtlJSw7iCViSA==", + "dev": true }, "raven": { "version": "2.6.4", @@ -12001,6 +7927,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, "requires": { "bytes": "3.0.0", "http-errors": "1.6.3", @@ -12008,21 +7935,14 @@ "unpipe": "1.0.0" }, "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "safer-buffer": ">= 2.1.2 < 3" } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" } } }, @@ -12030,59 +7950,33 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "16.6.3", - "resolved": "https://registry.npmjs.org/react/-/react-16.6.3.tgz", - "integrity": "sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.11.2" - } - }, - "react-dom": { - "version": "16.6.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.3.tgz", - "integrity": "sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.11.2" - } - }, - "react-masonry-component": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/react-masonry-component/-/react-masonry-component-6.2.1.tgz", - "integrity": "sha512-xoNdw/gOp0nkCXqvF8QDcRInFEVtbCBzT8QbxmRnCEzsOgDKtKlG/x6SoxXWivPCxdyr1PGdyngiA7TsqANHKA==", - "requires": { - "create-react-class": "^15.6.2", - "element-resize-detector": "^1.1.9", - "imagesloaded": "^4.0.0", - "lodash": "^4.17.4", - "masonry-layout": "^4.2.0", - "prop-types": "^15.5.8" }, "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, + "react-is": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", + "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==", + "dev": true + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, "requires": { "mute-stream": "~0.0.4" } @@ -12099,7 +7993,7 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -12130,49 +8024,6 @@ "dev": true, "requires": { "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "read-pkg": { @@ -12218,27 +8069,21 @@ } }, "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz", + "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -12247,8 +8092,9 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -12263,6 +8109,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -12304,17 +8151,6 @@ "dev": true, "requires": { "resolve": "^1.1.6" - }, - "dependencies": { - "resolve": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", - "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } } }, "recursive-readdir": { @@ -12324,17 +8160,6 @@ "dev": true, "requires": { "minimatch": "3.0.4" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } } }, "redent": { @@ -12347,42 +8172,17 @@ "strip-indent": "^1.0.1" } }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, "regenerator-runtime": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", - "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "optional": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -12399,25 +8199,15 @@ }, "regexpp": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", "dev": true }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, "registry-auth-token": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, "requires": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" @@ -12427,31 +8217,9 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "requires": { - "rc": "^1.0.1" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } + "rc": "^1.0.1" } }, "relaxed-json": { @@ -12462,22 +8230,52 @@ "requires": { "chalk": "^1.0.0", "commander": "^2.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } } }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "repeating": { "version": "2.0.1", @@ -12489,144 +8287,31 @@ } }, "request": { - "version": "2.75.0", - "resolved": "http://registry.npmjs.org/request/-/request-2.75.0.tgz", - "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "bl": "~1.1.2", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.0.0", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "node-uuid": "~1.4.7", - "oauth-sign": "~0.8.1", - "qs": "~6.2.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1" - }, - "dependencies": { - "bl": { - "version": "1.1.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "requires": { - "readable-stream": "~2.0.5" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "http://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.x.x" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "http://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.x.x" - } - }, - "form-data": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", - "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.11" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "http://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "http://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=" - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "http://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.x.x" - } - } - } - }, - "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", - "requires": { - "lodash": "^4.13.1" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - } - } - }, - "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", - "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, "require-directory": { @@ -12658,9 +8343,13 @@ } }, "resolve": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", - "integrity": "sha1-OVqe+ehz+/4SvRRAi9kbuTYAPWk=" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } }, "resolve-from": { "version": "1.0.1", @@ -12671,7 +8360,8 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true }, "restore-cursor": { "version": "2.0.0", @@ -12686,30 +8376,17 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rndm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", - "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" + "glob": "^7.1.3" + } }, "run-async": { "version": "2.3.0", @@ -12747,7 +8424,8 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safe-json-stringify": { "version": "1.2.0", @@ -12758,8 +8436,9 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, "requires": { "ret": "~0.1.10" } @@ -12767,7 +8446,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "sass-graph": { "version": "2.2.4", @@ -12830,7 +8510,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -12922,7 +8602,7 @@ }, "acorn-jsx": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { @@ -12931,7 +8611,7 @@ "dependencies": { "acorn": { "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true } @@ -12955,10 +8635,29 @@ }, "ansi-escapes": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", "dev": true }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, "cli-cursor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", @@ -12968,6 +8667,15 @@ "restore-cursor": "^1.0.1" } }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -12980,7 +8688,7 @@ }, "eslint": { "version": "2.13.1", - "resolved": "http://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", "dev": true, "requires": { @@ -13021,7 +8729,7 @@ }, "espree": { "version": "3.5.4", - "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { @@ -13068,7 +8776,7 @@ }, "inquirer": { "version": "0.12.0", - "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "requires": { @@ -13105,9 +8813,15 @@ "graceful-fs": "^4.1.6" } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "onetime": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, @@ -13119,7 +8833,7 @@ }, "progress": { "version": "1.1.8", - "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, @@ -13150,7 +8864,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -13171,9 +8885,15 @@ "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, "table": { "version": "3.8.3", - "resolved": "http://registry.npmjs.org/table/-/table-3.8.3.tgz", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { @@ -13221,26 +8941,10 @@ } }, "sax": { - "version": "1.2.1", - "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "saxes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.4.tgz", - "integrity": "sha512-GVZmLJnkS4Vl8Pe9o4nc5ALZ615VOVxCmea8Cs0l+8GZw3RQ5XGOSUomIUfuZuk4Todo44v4y+HY1EATkDDiZg==", - "requires": { - "xmlchars": "^1.3.1" - } - }, - "scheduler": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.11.2.tgz", - "integrity": "sha512-+WCP3s3wOaW4S7C1tl3TEXp4l9lJn0ZK8G3W3WKRWmw77Z2cIFUW2MiNTMHn5sCjxN+t7N43HAOOgMjyAg5hlg==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true }, "scss-tokenizer": { "version": "0.2.3", @@ -13281,57 +8985,48 @@ "xml2js": "^0.4.17" }, "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true - }, - "es6-promise": { - "version": "3.0.2", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "dev": true - }, "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.0.tgz", + "integrity": "sha512-4WjbsaEtBK/DHeDZOPiPw5nzSGLDEDDreFRDEgnoMwmknPjTqa+23XuYFk6NiGbeiAeZCctiQ/X/z0lQBmDVOQ==", "dev": true, "requires": { - "core-js": "~2.3.0", - "es6-promise": "~3.0.2", - "lie": "~3.1.0", + "lie": "~3.3.0", "pako": "~1.0.2", - "readable-stream": "~2.0.6" + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" } }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", "dev": true }, "readable-stream": { - "version": "2.0.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "tmp": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", @@ -13340,86 +9035,57 @@ "requires": { "os-tmpdir": "~1.0.1" } + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true } } }, "semver": { - "version": "5.1.0", - "resolved": "http://registry.npmjs.org/semver/-/semver-5.1.0.tgz", - "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=" + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, "requires": { "semver": "^5.0.3" } }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -13431,25 +9097,22 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, "setprototypeof": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", - "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -13471,120 +9134,278 @@ "dependencies": { "kind-of": { "version": "2.0.1", - "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", "dev": true, "requires": { - "is-buffer": "^1.0.2" + "is-buffer": "^1.0.2" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "sign-addon": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-0.2.0.tgz", + "integrity": "sha1-yNogt6/nGdQnFBQiJiUjWNW2BOk=", + "dev": true, + "requires": { + "babel-polyfill": "6.16.0", + "deepcopy": "0.6.3", + "es6-error": "4.0.0", + "es6-promisify": "5.0.0", + "jsonwebtoken": "7.1.9", + "mz": "2.4.0", + "request": "2.75.0", + "source-map-support": "0.4.3", + "stream-to-promise": "2.2.0", + "when": "3.7.7" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "bl": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", + "dev": true, + "requires": { + "readable-stream": "~2.0.5" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "form-data": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", + "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.11" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" } - } - } - }, - "shasum": { - "version": "1.0.2", - "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "requires": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - }, - "dependencies": { - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + }, + "request": { + "version": "2.75.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", + "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", "dev": true, "requires": { - "jsonify": "~0.0.0" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "bl": "~1.1.2", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.0.0", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.1", + "qs": "~6.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1" } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "sign-addon": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-0.2.0.tgz", - "integrity": "sha1-yNogt6/nGdQnFBQiJiUjWNW2BOk=", - "requires": { - "babel-polyfill": "6.16.0", - "deepcopy": "0.6.3", - "es6-error": "4.0.0", - "es6-promisify": "5.0.0", - "jsonwebtoken": "7.1.9", - "mz": "2.4.0", - "request": "2.75.0", - "source-map-support": "0.4.3", - "stream-to-promise": "2.2.0", - "when": "3.7.7" - }, - "dependencies": { - "babel-polyfill": { - "version": "6.16.0", - "resolved": "http://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.16.0.tgz", - "integrity": "sha1-LUUCHfh+JqN0ttTRqcZZZNF/JCI=", + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.3.tgz", + "integrity": "sha1-aTyDg9Q4mkVpSGmHwhl0TfxgFoU=", + "dev": true, "requires": { - "babel-runtime": "^6.9.1", - "core-js": "^2.4.0", - "regenerator-runtime": "^0.9.5" + "source-map": "^0.5.3" } }, - "when": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", - "integrity": "sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=" + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true } } }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "slash": { @@ -13612,6 +9433,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -13623,10 +9445,20 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -13635,9 +9467,22 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -13645,6 +9490,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -13655,6 +9501,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -13663,6 +9510,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -13671,6 +9519,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -13679,6 +9528,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -13691,6 +9541,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, "requires": { "kind-of": "^3.2.0" }, @@ -13699,6 +9550,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -13706,14 +9558,12 @@ } }, "sntp": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-3.0.2.tgz", - "integrity": "sha512-MCAPpBPFjNp1fwDVCLSRuWuH9gONtb2R+lS1esC6Mp8lP6jy60FVUtP/Qr0jBvcWAVbhzx06y1b6ptXiy32dug==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, "requires": { - "boom": "7.x.x", - "bounce": "1.x.x", - "hoek": "6.x.x", - "teamwork": "3.x.x" + "hoek": "2.x.x" } }, "snyk": { @@ -13766,35 +9616,6 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", @@ -13817,40 +9638,16 @@ "through": "^2.3.6" } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -13865,15 +9662,6 @@ "requires": { "ansi-regex": "^3.0.0" } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -13886,29 +9674,6 @@ "debug": "^3.1.0", "lodash": "^4.17.5", "nconf": "^0.10.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "snyk-docker-plugin": { @@ -13920,23 +9685,6 @@ "debug": "^3", "dockerfile-ast": "0.0.12", "tslib": "^1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "snyk-go-plugin": { @@ -13948,17 +9696,6 @@ "graphlib": "^2.1.1", "tmp": "0.0.33", "toml": "^2.3.2" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } } }, "snyk-gradle-plugin": { @@ -13978,23 +9715,6 @@ "requires": { "debug": "^3.1.0", "hosted-git-info": "^2.7.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "snyk-mvn-plugin": { @@ -14023,16 +9743,10 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -14047,83 +9761,69 @@ "integrity": "sha512-3qIndzkxCxiaGvAwMkqChbChGdwhNePPyfi0WjhC/nJGwecqU3Fb/NeTW7lgyT+xoq/dFnzW0DgBJ4+AyNA2gA==", "dev": true, "requires": { - "debug": "^3.1.0", - "jszip": "^3.1.5", - "lodash": "^4.17.10", - "xml2js": "^0.4.17" - }, - "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "es6-promise": { - "version": "3.0.2", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "dev": true - }, + "debug": "^3.1.0", + "jszip": "^3.1.5", + "lodash": "^4.17.10", + "xml2js": "^0.4.17" + }, + "dependencies": { "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.0.tgz", + "integrity": "sha512-4WjbsaEtBK/DHeDZOPiPw5nzSGLDEDDreFRDEgnoMwmknPjTqa+23XuYFk6NiGbeiAeZCctiQ/X/z0lQBmDVOQ==", "dev": true, "requires": { - "core-js": "~2.3.0", - "es6-promise": "~3.0.2", - "lie": "~3.1.0", + "lie": "~3.3.0", "pako": "~1.0.2", - "readable-stream": "~2.0.6" + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, "pako": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", - "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", "dev": true }, "readable-stream": { - "version": "2.0.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true } } }, @@ -14136,29 +9836,6 @@ "debug": "^3.1.0", "lodash": "^4.17.5", "path": "0.12.7" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "snyk-policy": { @@ -14176,29 +9853,6 @@ "snyk-resolve": "^1.0.1", "snyk-try-require": "^1.3.1", "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } } }, "snyk-python-plugin": { @@ -14208,17 +9862,6 @@ "dev": true, "requires": { "tmp": "0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } } }, "snyk-resolve": { @@ -14229,23 +9872,6 @@ "requires": { "debug": "^3.1.0", "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "snyk-resolve-deps": { @@ -14269,29 +9895,6 @@ "snyk-tree": "^1.0.0", "snyk-try-require": "^1.1.1", "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } } }, "snyk-sbt-plugin": { @@ -14319,23 +9922,6 @@ "lodash.clonedeep": "^4.3.0", "lru-cache": "^4.0.0", "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "socks": { @@ -14368,14 +9954,16 @@ } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -14385,31 +9973,35 @@ } }, "source-map-support": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.3.tgz", - "integrity": "sha1-aTyDg9Q4mkVpSGmHwhl0TfxgFoU=", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, "requires": { - "source-map": "^0.5.3" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true }, "spawn-sync": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "dev": true, "requires": { "concat-stream": "^1.4.7", "os-shim": "^0.1.2" } }, "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -14433,15 +10025,16 @@ } }, "spdx-license-ids": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, "requires": { "through": "2" } @@ -14450,6 +10043,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -14461,9 +10055,10 @@ "dev": true }, "sshpk": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", - "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -14474,13 +10069,6 @@ "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "stable": { @@ -14498,6 +10086,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -14507,6 +10096,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -14516,7 +10106,8 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true }, "stdout-stream": { "version": "1.4.1", @@ -14529,123 +10120,7 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -14676,41 +10151,22 @@ "dev": true, "requires": { "debug": "2" - } - }, - "stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" }, "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "ms": "2.0.0" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -14718,36 +10174,27 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=", + "dev": true, "requires": { "any-promise": "^1.1.0" - }, - "dependencies": { - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - } } }, "stream-to-promise": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-to-promise/-/stream-to-promise-2.2.0.tgz", "integrity": "sha1-se2y4cjLESidG1A8CNPyrvUeZQ8=", + "dev": true, "requires": { "any-promise": "~1.3.0", "end-of-stream": "~1.1.0", "stream-to-array": "~2.3.0" }, "dependencies": { - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, "end-of-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", "integrity": "sha1-6TUyWLqpEIll78QcsO+K3i88+wc=", + "dev": true, "requires": { "once": "~1.3.0" } @@ -14756,31 +10203,18 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, "requires": { "wrappy": "1" } } } }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "strftime": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", - "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=" - }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -14789,12 +10223,14 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -14832,19 +10268,25 @@ } }, "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } }, "stringstream": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -14876,8 +10318,9 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true }, "strip-indent": { "version": "1.0.1", @@ -14891,22 +10334,18 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "minimist": "^1.1.0" + "has-flag": "^3.0.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, "svgo": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.1.1.tgz", @@ -14950,43 +10389,18 @@ "dom-serializer": "0", "domelementtype": "1" } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true } } }, - "symbol": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.3.1.tgz", - "integrity": "sha1-tvmpANSWpX8CQI8iGYwQndoGMEE=" - }, "symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", "dev": true }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" - }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "requires": { - "acorn-node": "^1.2.0" - } - }, "table": { "version": "4.0.3", - "resolved": "http://registry.npmjs.org/table/-/table-4.0.3.tgz", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "requires": { @@ -14996,43 +10410,6 @@ "lodash": "^4.17.4", "slice-ansi": "1.0.0", "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "tar": { @@ -15049,9 +10426,9 @@ }, "dependencies": { "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true } } @@ -15060,6 +10437,7 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, "requires": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -15072,8 +10450,9 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15088,17 +10467,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } } } }, - "teamwork": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/teamwork/-/teamwork-3.0.3.tgz", - "integrity": "sha512-OCB56z+G70iA1A1OFoT+51TPzfcgN0ks75uN3yhxA+EU66WTz2BevNDK4YzMqfaL5tuAvxy4iFUn35/u8pxMaQ==" - }, "temp-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", @@ -15119,42 +10494,42 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "^0.7.0" - } - }, - "terser": { - "version": "3.10.11", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.10.11.tgz", - "integrity": "sha512-iruZ7j14oBbRYJC5cP0/vTU7YOWjN+J1ZskEGoF78tFzXdkK2hbCL/3TRZN8XB+MuvFhvOHMp7WkOCBO4VEL5g==", "dev": true, "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1", - "source-map-support": "~0.5.6" + "execa": "^0.7.0" }, "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true } } }, @@ -15177,61 +10552,25 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dev": true, "requires": { "any-promise": "^1.0.0" - }, - "dependencies": { - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - } } }, "thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, "requires": { "thenify": ">= 3.1.0 < 4" } }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.4.tgz", - "integrity": "sha512-q030OX7royN1Bo549nYMOpKwiGJIzUppv10IgB6ALN6DiJ/XgsRIehiz18x5RWCA3+s4G6ovKqtzgU+pYhjvvg==", - "dev": true, - "requires": { - "readable-stream": "2 || 3", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.0.6.tgz", - "integrity": "sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "thunkify": { "version": "2.1.2", @@ -15244,44 +10583,26 @@ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "~0.11.0" - } - }, "tmp": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", - "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { - "os-tmpdir": "~1.0.1" + "os-tmpdir": "~1.0.2" } }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", "dev": true }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -15290,6 +10611,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -15300,6 +10622,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -15311,30 +10634,25 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, "toml": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.5.tgz", - "integrity": "sha512-ulY/Z2yPWKl/3JvGJvnEe7mXqVt2+TtDoRxJNgTAwO+3lwXefeCHS697NN0KRy6q7U/b1MnSnj/UGF/4U0U2WQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", "dev": true }, "topo": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/topo/-/topo-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", + "dev": true, "requires": { "hoek": "2.x.x" - }, - "dependencies": { - "hoek": { - "version": "2.16.3", - "resolved": "http://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - } } }, "tosource": { @@ -15347,6 +10665,7 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=", + "dev": true, "requires": { "nopt": "~1.0.10" }, @@ -15355,6 +10674,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, "requires": { "abbrev": "1" } @@ -15362,17 +10682,20 @@ } }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" }, "dependencies": { "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true } } }, @@ -15380,6 +10703,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -15387,7 +10711,8 @@ "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true }, "trim-newlines": { "version": "1.0.0", @@ -15395,12 +10720,6 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "true-case-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", @@ -15410,148 +10729,66 @@ "glob": "^7.1.2" } }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tsscmp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", - "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=" - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.2.tgz", - "integrity": "sha1-yI6FPlTlq9iPG/MZS0d8hTyU+FQ=" - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "ua-parser-js": { - "version": "0.7.19", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", - "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==" - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "uglifyify": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uglifyify/-/uglifyify-5.0.1.tgz", - "integrity": "sha512-PO44rgExvwj3rkK0UzenHVnPU18drBy9x9HOUmgkuRh6K2KIsDqrB5LqxGtjybgGTOS1JeP8SBc+TN5rhiva6w==", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "extend": "^1.2.1", - "minimatch": "^3.0.2", - "terser": "^3.7.5", - "through": "~2.3.4" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - }, - "extend": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-1.3.0.tgz", - "integrity": "sha1-0VFvsP9WJNLr+RI+odrFoZlABPg=", - "dev": true - } - } + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true }, - "uid-safe": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz", - "integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE=", + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { - "random-bytes": "~1.0.0" + "safe-buffer": "^5.0.1" } }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "undeclared-identifiers": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", - "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "acorn-node": "^1.3.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" + "prelude-ls": "~1.1.2" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "undefsafe": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", + "dev": true, "requires": { "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "underscore": { @@ -15564,6 +10801,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -15575,6 +10813,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -15583,6 +10822,7 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -15596,144 +10836,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, "requires": { "crypto-random-string": "^1.0.0" } }, - "universal-analytics": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", - "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", - "requires": { - "debug": "^3.0.0", - "request": "^2.88.0", - "uuid": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - } - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -15743,7 +10850,8 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true }, "unquote": { "version": "1.1.1", @@ -15755,6 +10863,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -15764,6 +10873,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -15774,6 +10884,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, "requires": { "isarray": "1.0.0" } @@ -15783,24 +10894,28 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true } } }, "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "dev": true }, "upath": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true }, "update-notifier": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, "requires": { "boxen": "^1.2.1", "chalk": "^2.0.1", @@ -15812,40 +10927,13 @@ "latest-version": "^3.0.0", "semver-diff": "^2.0.0", "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } } }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -15853,28 +10941,14 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, "requires": { "prepend-http": "^1.0.1" } @@ -15888,7 +10962,8 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true }, "user-home": { "version": "2.0.0", @@ -15899,11 +10974,6 @@ "os-homedir": "^1.0.0" } }, - "utcstring": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/utcstring/-/utcstring-0.1.0.tgz", - "integrity": "sha1-Qw/VEKt/yVtdWRDJAteYgMIIQ2s=" - }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -15916,7 +10986,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "util.promisify": { "version": "1.0.0", @@ -15928,38 +10999,11 @@ "object.getownpropertydescriptors": "^2.0.3" } }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "^1.1.1" - }, - "dependencies": { - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - } - } - }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -15970,63 +11014,23 @@ "spdx-expression-parse": "^3.0.0" } }, - "validator": { - "version": "10.8.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.8.0.tgz", - "integrity": "sha512-mXqMxfCh5NLsVgYVKl9WvnHNDPCcbNppHSPPowu0VjtSsGWVY+z8hJF44edLR1nbLNzi3jYoYsIl8KZpioIk6g==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - }, "vscode-languageserver-types": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==", "dev": true }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "w3c-xmlserializer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.0.1.tgz", - "integrity": "sha512-XZGI1OH/OLQr/NaJhhPmzhngwcAnZDLytsvXnRmlYeRkmbb0I7sqFFA22erq4WQR0sUu17ZSQOAV9mFwCqKRNg==", - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, "watchpack": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", @@ -16195,21 +11199,6 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, "archiver": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", @@ -16226,33 +11215,25 @@ "zip-stream": "^1.2.0" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "lodash": "^4.17.10" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", @@ -16264,28 +11245,6 @@ "supports-color": "^5.3.0" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "deepmerge": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", @@ -16331,9 +11290,9 @@ } }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -16425,13 +11384,19 @@ "eslint-visitor-keys": "^1.0.0" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "firefox-profile": { @@ -16464,6 +11429,12 @@ } } }, + "fluent-syntax": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/fluent-syntax/-/fluent-syntax-0.7.0.tgz", + "integrity": "sha512-T0iqfhC40jrs3aDjYOKgzIQjjhsH2Fa6LnXB6naPv0ymW3DeYMUFa89y9aLKMpi1P9nl2vEimK7blx4tVnUWBg==", + "dev": true + }, "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", @@ -16475,32 +11446,46 @@ "universalify": "^0.1.0" } }, - "fsevents": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.1.tgz", - "integrity": "sha512-p+CXqK/iLvDESUWdn3NA3JVO9HxdfI+iXx8xR3DqWgKZvQNiEVpAyUQo0lmwz8rqksb4xaGerG291xuwwhX2kA==", - "dev": true, - "optional": true + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "^6.5.5", + "ajv": "^5.1.0", "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + } } }, "invert-kv": { @@ -16518,12 +11503,6 @@ "number-is-nan": "^1.0.0" } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, "jetpack-id": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jetpack-id/-/jetpack-id-1.0.0.tgz", @@ -16541,7 +11520,7 @@ }, "jsonwebtoken": { "version": "8.2.1", - "resolved": "http://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz", "integrity": "sha512-l8rUBr0fqYYwPc8/ZGrue7GiW7vWdZtZqelxo4Sd5lMvuEeCK8/wS54sEo6tJhdZ6hqfutsj6COgC0d1XdbHGw==", "dev": true, "requires": { @@ -16557,44 +11536,10 @@ "xtend": "^4.0.1" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "mz": { @@ -16609,35 +11554,22 @@ } }, "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "dev": true }, - "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "os-locale": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -16696,7 +11628,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -16709,46 +11641,6 @@ "util-deprecate": "~1.0.1" } }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, "shelljs": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", @@ -16778,21 +11670,9 @@ "when": "3.7.7" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "babel-polyfill": { "version": "6.16.0", - "resolved": "http://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.16.0.tgz", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.16.0.tgz", "integrity": "sha1-LUUCHfh+JqN0ttTRqcZZZNF/JCI=", "dev": true, "requires": { @@ -16807,28 +11687,6 @@ "integrity": "sha1-8JTHBB9mJZm7EnINoFnWucf/D0A=", "dev": true }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" - } - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, "mz": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.5.0.tgz", @@ -16840,15 +11698,9 @@ "thenify-all": "^1.0.0" } }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, "regenerator-runtime": { "version": "0.9.6", - "resolved": "http://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=", "dev": true }, @@ -16894,15 +11746,6 @@ "requires": { "source-map": "^0.5.3" } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "^1.4.1" - } } } }, @@ -16915,12 +11758,6 @@ "flatstr": "^1.0.8" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.3.tgz", @@ -16948,43 +11785,15 @@ "ansi-regex": "^3.0.0" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "psl": "^1.1.24", "punycode": "^1.4.1" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, "update-notifier": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", @@ -17002,24 +11811,9 @@ "xdg-basedir": "^3.0.0" } }, - "when": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", - "integrity": "sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, "yargs": { "version": "6.6.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { @@ -17067,9 +11861,18 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -17089,7 +11892,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -17110,7 +11913,7 @@ }, "yargs-parser": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { @@ -17130,9 +11933,9 @@ }, "dependencies": { "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", + "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", "dev": true }, "decamelize": { @@ -17148,40 +11951,14 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "whatwg-url": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -17189,17 +11966,18 @@ } }, "when": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.2.tgz", - "integrity": "sha1-Br7RKW3zoL/YP38xxeHXeb2X6ug=" + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", + "integrity": "sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=", + "dev": true }, "which": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.4.tgz", - "integrity": "sha1-FVf5YIBgTlsRs1meufRbUKnv1yI=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { - "is-absolute": "^0.1.7", - "isexe": "^1.1.1" + "isexe": "^2.0.0" } }, "which-module": { @@ -17221,6 +11999,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, "requires": { "string-width": "^2.1.1" } @@ -17243,16 +12022,18 @@ "winreg": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/winreg/-/winreg-0.0.12.tgz", - "integrity": "sha1-BxBVVLoanQiXklHRKUdb/64wBrc=" + "integrity": "sha1-BxBVVLoanQiXklHRKUdb/64wBrc=", + "dev": true }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -17285,7 +12066,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write": { "version": "0.2.1", @@ -17297,51 +12079,40 @@ } }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, - "ws": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz", - "integrity": "sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==", - "requires": { - "async-limiter": "~1.0.0" - } - }, "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true }, "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.16.tgz", + "integrity": "sha1-+C/M0vlUDX4Km12sFj50cRlcnbM=", + "dev": true, "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "^4.1.0" } }, "xmlbuilder": { - "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", + "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", + "dev": true, + "requires": { + "lodash": "^4.0.0" + } }, "xmldom": { "version": "0.1.27", @@ -17358,7 +12129,8 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true }, "y18n": { "version": "4.0.0", @@ -17369,7 +12141,8 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yargs": { "version": "12.0.2", @@ -17389,51 +12162,6 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^10.1.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - } } }, "yargs-parser": { @@ -17459,15 +12187,25 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-1.0.2.tgz", "integrity": "sha1-JT+QeurWKiGs2HIdi4gDKyQRwFE=", + "dev": true, "requires": { "async": "^1.5.2", "jszip": "^2.4.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } } }, "zip-stream": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dev": true, "requires": { "archiver-utils": "^1.3.0", "compress-commons": "^1.2.0", @@ -17477,8 +12215,9 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -17493,6 +12232,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } diff --git a/webextension/background/README.md b/webextension/background/README.md index e1f254a3b0..26a75e8f7f 100644 --- a/webextension/background/README.md +++ b/webextension/background/README.md @@ -2,7 +2,6 @@ These are all the files/modules for the background worker. This is the higher-p - `startBackground.js` handles message port from bootstrap.js that sends the click event, handles the context menu, and loads everything else on the first button of context menu click. - `analytics.js` handles sending events to the server for use with GA. -- `auth.js` handles the initial authentication call, and handles subsequent requests using that authentication. It also informs `analytics.js` of any A/B tests so those can be submitted. - `clipboard.js` handles copying to the clipboard. - `communication.js` handles communication with the content workers. - `deviceinfo.js` gets information about this device that is used in some logging and analytics. diff --git a/webextension/background/analytics.js b/webextension/background/analytics.js index 90a5a644ca..7cc4c13e0c 100644 --- a/webextension/background/analytics.js +++ b/webextension/background/analytics.js @@ -1,4 +1,4 @@ -/* globals main, auth, browser, catcher, deviceInfo, communication, log */ +/* globals main, auth, browser, catcher, communication, log */ "use strict"; @@ -90,61 +90,6 @@ this.analytics = (function() { } exports.sendEvent = function(action, label, options) { - const eventCategory = "addon"; - if (!telemetryPrefKnown) { - log.warn("sendEvent called before we were able to refresh"); - return Promise.resolve(); - } - if (!telemetryEnabled) { - log.info(`Cancelled sendEvent ${eventCategory}/${action}/${label || "none"} ${JSON.stringify(options)}`); - return Promise.resolve(); - } - measureTiming(action, label); - // Internal-only events are used for measuring time between events, - // but aren't submitted to GA. - if (action === "internal") { - return Promise.resolve(); - } - if (typeof label === "object" && (!options)) { - options = label; - label = undefined; - } - options = options || {}; - - // Don't send events if in private browsing. - if (options.incognito) { - return Promise.resolve(); - } - - // Don't include in event data. - delete options.incognito; - - const di = deviceInfo(); - options.applicationName = di.appName; - options.applicationVersion = di.addonVersion; - const abTests = auth.getAbTests(); - for (const [gaField, value] of Object.entries(abTests)) { - options[gaField] = value; - } - if (!shouldSendEvents()) { - // We don't want to save or send the events anymore - return Promise.resolve(); - } - pendingEvents.push({ - eventTime: Date.now(), - event: eventCategory, - action, - label, - options, - }); - if (!eventsTimeoutHandle) { - eventsTimeoutHandle = setTimeout(() => { - eventsTimeoutHandle = null; - flushEvents(); - }, EVENT_BATCH_DURATION); - } - // This function used to return a Promise that was not used at any of the - // call sites; doing this simply maintains that interface. return Promise.resolve(); }; @@ -177,187 +122,5 @@ this.analytics = (function() { return telemetryEnabled; }; - const timingData = new Map(); - - // Configuration for filtering the sendEvent stream on start/end events. - // When start or end events occur, the time is recorded. - // When end events occur, the elapsed time is calculated and submitted - // via `sendEvent`, where action = "perf-response-time", label = name of rule, - // and cd1 value is the elapsed time in milliseconds. - // If a cancel event happens between the start and end events, the start time - // is deleted. - const rules = [{ - name: "page-action", - start: { action: "start-shot", label: "toolbar-button" }, - end: { action: "internal", label: "unhide-preselection-frame" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - { action: "internal", label: "unhide-onboarding-frame" }, - ], - }, { - name: "context-menu", - start: { action: "start-shot", label: "context-menu" }, - end: { action: "internal", label: "unhide-preselection-frame" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - { action: "internal", label: "unhide-onboarding-frame" }, - ], - }, { - name: "page-action-onboarding", - start: { action: "start-shot", label: "toolbar-button" }, - end: { action: "internal", label: "unhide-onboarding-frame" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - { action: "internal", label: "unhide-preselection-frame" }, - ], - }, { - name: "context-menu-onboarding", - start: { action: "start-shot", label: "context-menu" }, - end: { action: "internal", label: "unhide-onboarding-frame" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - { action: "internal", label: "unhide-preselection-frame" }, - ], - }, { - name: "capture-full-page", - start: { action: "capture-full-page" }, - end: { action: "internal", label: "unhide-preview-frame" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - ], - }, { - name: "capture-visible", - start: { action: "capture-visible" }, - end: { action: "internal", label: "unhide-preview-frame" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - ], - }, { - name: "make-selection", - start: { action: "make-selection" }, - end: { action: "internal", label: "unhide-selection-frame" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - ], - }, { - name: "save-shot", - start: { action: "save-shot" }, - end: { action: "internal", label: "open-shot-tab" }, - cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }], - }, { - name: "save-visible", - start: { action: "save-visible" }, - end: { action: "internal", label: "open-shot-tab" }, - cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }], - }, { - name: "save-full-page", - start: { action: "save-full-page" }, - end: { action: "internal", label: "open-shot-tab" }, - cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }], - }, { - name: "save-full-page-truncated", - start: { action: "save-full-page-truncated" }, - end: { action: "internal", label: "open-shot-tab" }, - cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }], - }, { - name: "download-shot", - start: { action: "download-shot" }, - end: { action: "internal", label: "deactivate" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - ], - }, { - name: "download-full-page", - start: { action: "download-full-page" }, - end: { action: "internal", label: "deactivate" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - ], - }, { - name: "download-full-page-truncated", - start: { action: "download-full-page-truncated" }, - end: { action: "internal", label: "deactivate" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - ], - }, { - name: "download-visible", - start: { action: "download-visible" }, - end: { action: "internal", label: "deactivate" }, - cancel: [ - { action: "cancel-shot" }, - { action: "internal", label: "document-hidden" }, - ], - }]; - - // Match a filter (action and optional label) against an action and label. - function match(filter, action, label) { - return filter.label ? - filter.action === action && filter.label === label : - filter.action === action; - } - - function anyMatches(filters, action, label) { - return filters.some(filter => match(filter, action, label)); - } - - function measureTiming(action, label) { - rules.forEach(r => { - if (anyMatches(r.cancel, action, label)) { - delete timingData[r.name]; - } else if (match(r.start, action, label)) { - timingData[r.name] = Math.round(performance.now()); - } else if (timingData[r.name] && match(r.end, action, label)) { - const endTime = Math.round(performance.now()); - const elapsed = endTime - timingData[r.name]; - sendTiming("perf-response-time", r.name, elapsed); - delete timingData[r.name]; - } - }); - } - - function fetchWatcher(request) { - request.then(response => { - if (response.status === 410 || response.status === 404) { // Gone - hasReturnedGone = true; - pendingEvents = []; - pendingTimings = []; - } - if (!response.ok) { - log.debug(`Error code in event response: ${response.status} ${response.statusText}`); - } - }).catch(error => { - serverFailedResponses--; - if (serverFailedResponses <= 0) { - log.info(`Server is not responding, no more events will be sent`); - pendingEvents = []; - pendingTimings = []; - } - log.debug(`Error event in response: ${error}`); - }); - } - - async function init() { - const result = await browser.storage.local.get(["myGaSegment"]); - if (!result.myGaSegment) { - myGaSegment = Math.random(); - await browser.storage.local.set({myGaSegment}); - } else { - myGaSegment = result.myGaSegment; - } - } - - init(); - return exports; })(); diff --git a/webextension/background/auth.js b/webextension/background/auth.js deleted file mode 100644 index 3f9f20ffe9..0000000000 --- a/webextension/background/auth.js +++ /dev/null @@ -1,220 +0,0 @@ -/* globals log */ -/* globals main, makeUuid, deviceInfo, analytics, catcher, buildSettings, communication */ - -"use strict"; - -this.auth = (function() { - const exports = {}; - - let registrationInfo; - let initialized = false; - let authHeader = null; - let sentryPublicDSN = null; - let abTests = {}; - let accountId = null; - - const fetchStoredInfo = catcher.watchPromise( - browser.storage.local.get(["registrationInfo", "abTests"]).then((result) => { - if (result.abTests) { - abTests = result.abTests; - } - if (result.registrationInfo) { - registrationInfo = result.registrationInfo; - } - })); - - function getRegistrationInfo() { - if (!registrationInfo) { - registrationInfo = generateRegistrationInfo(); - log.info("Generating new device authentication ID", registrationInfo); - browser.storage.local.set({registrationInfo}); - } - return registrationInfo; - } - - exports.getDeviceId = function() { - return registrationInfo && registrationInfo.deviceId; - }; - - function generateRegistrationInfo() { - const info = { - deviceId: `anon${makeUuid()}`, - secret: makeUuid(), - registered: false, - }; - return info; - } - - function register() { - return new Promise((resolve, reject) => { - const registerUrl = main.getBackend() + "/api/register"; - // TODO: replace xhr with Fetch #2261 - const req = new XMLHttpRequest(); - req.open("POST", registerUrl); - req.setRequestHeader("content-type", "application/json"); - req.onload = catcher.watchFunction(() => { - if (req.status === 200) { - log.info("Registered login"); - initialized = true; - saveAuthInfo(JSON.parse(req.responseText)); - resolve(true); - analytics.sendEvent("registered"); - } else { - analytics.sendEvent("register-failed", `bad-response-${req.status}`); - log.warn("Error in response:", req.responseText); - const exc = new Error("Bad response: " + req.status); - exc.popupMessage = "LOGIN_ERROR"; - reject(exc); - } - }); - req.onerror = catcher.watchFunction(() => { - analytics.sendEvent("register-failed", "connection-error"); - const exc = new Error("Error contacting server"); - exc.popupMessage = "LOGIN_CONNECTION_ERROR"; - reject(exc); - }); - req.send(JSON.stringify({ - deviceId: registrationInfo.deviceId, - secret: registrationInfo.secret, - deviceInfo: JSON.stringify(deviceInfo()), - })); - }); - } - - function login(options) { - const { ownershipCheck, noRegister } = options || {}; - return new Promise((resolve, reject) => { - return fetchStoredInfo.then(() => { - const registrationInfo = getRegistrationInfo(); - const loginUrl = main.getBackend() + "/api/login"; - // TODO: replace xhr with Fetch #2261 - const req = new XMLHttpRequest(); - req.open("POST", loginUrl); - req.onload = catcher.watchFunction(() => { - if (req.status === 404) { - if (noRegister) { - resolve(false); - } else { - resolve(register()); - } - } else if (req.status >= 300) { - log.warn("Error in response:", req.responseText); - const exc = new Error("Could not log in: " + req.status); - exc.popupMessage = "LOGIN_ERROR"; - analytics.sendEvent("login-failed", `bad-response-${req.status}`); - reject(exc); - } else if (req.status === 0) { - const error = new Error("Could not log in, server unavailable"); - error.popupMessage = "LOGIN_CONNECTION_ERROR"; - analytics.sendEvent("login-failed", "connection-error"); - reject(error); - } else { - initialized = true; - const jsonResponse = JSON.parse(req.responseText); - log.info("Screenshots logged in"); - analytics.sendEvent("login"); - saveAuthInfo(jsonResponse); - if (ownershipCheck) { - resolve({isOwner: jsonResponse.isOwner}); - } else { - resolve(true); - } - } - }); - req.onerror = catcher.watchFunction(() => { - analytics.sendEvent("login-failed", "connection-error"); - const exc = new Error("Connection failed"); - exc.url = loginUrl; - exc.popupMessage = "CONNECTION_ERROR"; - reject(exc); - }); - req.setRequestHeader("content-type", "application/json"); - req.send(JSON.stringify({ - deviceId: registrationInfo.deviceId, - secret: registrationInfo.secret, - deviceInfo: JSON.stringify(deviceInfo()), - ownershipCheck, - })); - }); - }); - } - - function saveAuthInfo(responseJson) { - accountId = responseJson.accountId; - if (responseJson.sentryPublicDSN) { - sentryPublicDSN = responseJson.sentryPublicDSN; - } - if (responseJson.authHeader) { - authHeader = responseJson.authHeader; - if (!registrationInfo.registered) { - registrationInfo.registered = true; - catcher.watchPromise(browser.storage.local.set({registrationInfo})); - } - } - if (responseJson.abTests) { - abTests = responseJson.abTests; - catcher.watchPromise(browser.storage.local.set({abTests})); - } - } - - exports.maybeLogin = function() { - if (!registrationInfo) { - return Promise.resolve(); - } - - return exports.authHeaders(); - }; - - exports.authHeaders = function() { - let initPromise = Promise.resolve(); - if (!initialized) { - initPromise = login(); - } - return initPromise.then(() => { - if (authHeader) { - return {"x-screenshots-auth": authHeader}; - } - log.warn("No auth header available"); - return {}; - }); - }; - - exports.getSentryPublicDSN = function() { - return sentryPublicDSN || buildSettings.defaultSentryDsn; - }; - - exports.getAbTests = function() { - return abTests; - }; - - exports.isRegistered = function() { - return registrationInfo && registrationInfo.registered; - }; - - communication.register("getAuthInfo", (sender, ownershipCheck) => { - return fetchStoredInfo.then(() => { - // If a device id was never generated, report back accordingly. - if (!registrationInfo) { - return null; - } - - return exports.authHeaders().then((authHeaders) => { - let info = registrationInfo; - if (info.registered) { - return login({ownershipCheck}).then((result) => { - return { - isOwner: result && result.isOwner, - deviceId: registrationInfo.deviceId, - accountId, - authHeaders, - }; - }); - } - info = Object.assign({authHeaders}, info); - return info; - }); - }); -}); - - return exports; -})(); diff --git a/webextension/background/deviceInfo.js b/webextension/background/deviceInfo.js deleted file mode 100644 index 4c3fcb9ec6..0000000000 --- a/webextension/background/deviceInfo.js +++ /dev/null @@ -1,34 +0,0 @@ -/* globals catcher */ - -"use strict"; - -this.deviceInfo = (function() { - const manifest = browser.runtime.getManifest(); - - let platformInfo = {}; - catcher.watchPromise(browser.runtime.getPlatformInfo().then((info) => { - platformInfo = info; - })); - - return function deviceInfo() { - let match = navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9.]{1,1000})/); - const chromeVersion = match ? match[1] : null; - match = navigator.userAgent.match(/Firefox\/([0-9.]{1,1000})/); - const firefoxVersion = match ? match[1] : null; - const appName = chromeVersion ? "chrome" : "firefox"; - - return { - addonVersion: manifest.version, - platform: platformInfo.os, - architecture: platformInfo.arch, - version: firefoxVersion || chromeVersion, - // These don't seem to apply to Chrome: - // build: system.build, - // platformVersion: system.platformVersion, - userAgent: navigator.userAgent, - appVendor: appName, - appName, - }; - }; - -})(); diff --git a/webextension/background/startBackground.js b/webextension/background/startBackground.js index 6d98d03a19..03e896f128 100644 --- a/webextension/background/startBackground.js +++ b/webextension/background/startBackground.js @@ -28,13 +28,11 @@ this.startBackground = (function() { "blobConverters.js", "background/selectorLoader.js", "background/communication.js", - "background/auth.js", "background/senderror.js", "build/raven.js", "build/shot.js", "build/thumbnailGenerator.js", "background/analytics.js", - "background/deviceInfo.js", "background/takeshot.js", "background/main.js", ]; diff --git a/webextension/buildSettings.js.template b/webextension/buildSettings.js.template index 1faeb2c396..081b251040 100644 --- a/webextension/buildSettings.js.template +++ b/webextension/buildSettings.js.template @@ -2,7 +2,6 @@ window.buildSettings = { defaultSentryDsn: process.env.SCREENSHOTS_SENTRY, logLevel: process.env.SCREENSHOTS_LOG_LEVEL || "warn", captureText: (process.env.SCREENSHOTS_CAPTURE_TEXT === "true"), - uploadBinary: (process.env.SCREENSHOTS_UPLOAD_BINARY === "true"), pngToJpegCutoff: parseInt(process.env.SCREENSHOTS_PNG_TO_JPEG_CUTOFF || 2500000, 10), maxImageHeight: parseInt(process.env.SCREENSHOTS_MAX_IMAGE_HEIGHT || 10000, 10), maxImageWidth: parseInt(process.env.SCREENSHOTS_MAX_IMAGE_WIDTH || 10000, 10) From 752cb68d1083e7ef68208210b01d829c3fc12326 Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Thu, 21 Mar 2019 17:47:17 -0500 Subject: [PATCH 03/15] Actually strip server code from most of the extension --- Makefile | 23 +- bin/build-scripts/update_manifest.py | 12 -- webextension/background/README.md | 1 - webextension/background/analytics.js | 90 +------- webextension/background/main.js | 104 +-------- webextension/background/selectorLoader.js | 6 - webextension/background/senderror.js | 4 +- webextension/background/startBackground.js | 90 -------- webextension/background/takeshot.js | 232 --------------------- webextension/manifest.json.template | 1 - webextension/selector/shooter.js | 91 -------- webextension/selector/ui.js | 3 +- webextension/selector/uicontrol.js | 6 +- 13 files changed, 34 insertions(+), 629 deletions(-) delete mode 100644 webextension/background/takeshot.js diff --git a/Makefile b/Makefile index a84c6b440d..abbd90db06 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,6 @@ VENV := .venv # requirements for the other rules shared_source := $(wildcard shared/*.js) -shared_server_dest := $(shared_source:%.js=build/%.js) # Also scss gets put into two locations: sass_source := $(wildcard static/css/*.scss) @@ -34,7 +33,7 @@ l10n_dest := $(l10n_source:%/webextension.properties=webextension/_locales/%/mes postcss $< -o $@ --config .postcss/rtl .PHONY: addon -addon: npm set_backend set_sentry webextension/manifest.json addon_locales webextension/build/selection.js webextension/build/shot.js webextension/build/thumbnailGenerator.js webextension/build/inlineSelectionCss.js webextension/build/raven.js webextension/build/onboardingCss.js webextension/build/onboardingHtml.js webextension/build/buildSettings.js +addon: npm set_sentry webextension/manifest.json addon_locales webextension/build/selection.js webextension/build/shot.js webextension/build/thumbnailGenerator.js webextension/build/inlineSelectionCss.js webextension/build/raven.js webextension/build/onboardingCss.js webextension/build/onboardingHtml.js webextension/build/buildSettings.js $(VENV): requirements.txt virtualenv -p python2.7 $(VENV) @@ -70,7 +69,11 @@ signed_xpi: addon addon_locales: ./node_modules/.bin/pontoon-to-webext --dest webextension/_locales > /dev/null -webextension/manifest.json: webextension/manifest.json.template build/.backend.txt package.json +build/static/%.css: static/%.scss $(partials_source) + @mkdir -p $(@D) + node-sass $< $@ + +webextension/manifest.json: webextension/manifest.json.template package.json ./bin/build-scripts/update_manifest.py $< $@ webextension/build/selection.js: shared/selection.js @@ -85,11 +88,11 @@ webextension/build/thumbnailGenerator.js: shared/thumbnailGenerator.js @mkdir -p $(@D) ./bin/build-scripts/modularize thumbnailGenerator $< > $@ -webextension/build/inlineSelectionCss.js: build/server/static/css/inline-selection.css +webextension/build/inlineSelectionCss.js: build/static/css/inline-selection.css @mkdir -p $(@D) ./bin/build-scripts/css_to_js.py inlineSelectionCss $< > $@ -webextension/build/onboardingCss.js: build/server/static/css/onboarding.css +webextension/build/onboardingCss.js: build/static/css/onboarding.css @mkdir -p $(@D) ./bin/build-scripts/css_to_js.py onboardingCss $< > $@ @@ -104,7 +107,7 @@ webextension/build/raven.js: $(raven_source) ## npm rule .PHONY: npm -npm: build/.npm-install.log +npm: .npm-install.log webextension/build/buildSettings.js: set_build_settings @@ -114,12 +117,12 @@ set_sentry: @if [[ -n "$(SCREENSHOTS_SENTRY)" ]] ; then echo "Setting default Sentry ${SCREENSHOTS_SENTRY}" ; fi ./bin/build-scripts/substitute-env.js webextension/buildSettings.js.template | ./bin/build-scripts/set_file webextension/build/buildSettings.js - -build/.npm-install.log: package.json package-lock.json +.npm-install.log: package.json package-lock.json # Essentially .npm-install.log is just a timestamp showing the last time we ran # the command @mkdir -p $(@D) - echo "Installing at $(shell date)" > build/.npm-install.log - npm install >> build/.npm-install.log + echo "Installing at $(shell date)" > .npm-install.log + npm install >> .npm-install.log # This causes intermediate files to be kept (e.g., files in static/ which are copied to the addon and server but aren't used/required directly): .SECONDARY: @@ -145,7 +148,7 @@ help: @echo " make all" @echo " equivalent to make addon" @echo " make clean" - @echo " rm -rf build/ webextension/build" + @echo " rm -rf webextension/build build" @echo " make zip" @echo " make an unsigned zip of the webextension in build/screenshots.zip" @echo " make unsigned_xpi" diff --git a/bin/build-scripts/update_manifest.py b/bin/build-scripts/update_manifest.py index 20a3cf968e..a5c89aeeb3 100755 --- a/bin/build-scripts/update_manifest.py +++ b/bin/build-scripts/update_manifest.py @@ -1,7 +1,6 @@ #!/usr/bin/env python """ Sets the version parameter in webextension/manifest.json using a date and package.json -Sets the backend value """ import sys @@ -15,7 +14,6 @@ if not sys.argv[1:] or "-h" in sys.argv or "--help" in sys.argv: print("Usage: %s MANIFEST_TEMPLATE MANIFEST_JSON" % (os.path.basename(sys.argv[0]))) print(" Writes MANIFEST_JSON based on MANIFEST_TEMPLATE") - print(" Uses build/.backend.txt to figure out the backend configuration") print(" Uses package.json to determine the version (and adds a timestamp)") print(" If $SCREENSHOTS_MINOR_VERSION is set, use that instead of a timestamp for that version") sys.exit() @@ -56,17 +54,7 @@ now_timestamp += 1 continue break -backend = open("build/.backend.txt").read().strip() -if not re.search(r'^https?://[^/]+/?$', backend): - print("Error: bad backend (must be fully qualified URL): %r" % backend) - sys.exit(1) template = template.replace("__VERSION__", version) -# Some places we use the port: -template = template.replace("http://localhost:10080", backend) -# But for content_scripts.matches the port gets left off: -backend_without_port = re.sub(r':\d+$', '', backend) -template = template.replace("http://localhost/", backend_without_port + "/") - open(sys.argv[2], "wb").write(template) diff --git a/webextension/background/README.md b/webextension/background/README.md index 26a75e8f7f..34d88913aa 100644 --- a/webextension/background/README.md +++ b/webextension/background/README.md @@ -7,4 +7,3 @@ These are all the files/modules for the background worker. This is the higher-p - `deviceinfo.js` gets information about this device that is used in some logging and analytics. - `selectorLoader.js` handles loading the selector worker, and contains the list of files that the selector loads. - `main.js` launches everything -- `takeshot.js` takes the shot the content worker has constructed, sends it to the server, and handles copying and opening the tab. diff --git a/webextension/background/analytics.js b/webextension/background/analytics.js index 7cc4c13e0c..05697d6bdf 100644 --- a/webextension/background/analytics.js +++ b/webextension/background/analytics.js @@ -4,90 +4,7 @@ this.analytics = (function() { const exports = {}; - - const GA_PORTION = 0.1; // 10% of users will send to the server/GA - // This is set from storage, or randomly; if it is less that GA_PORTION then we send analytics: - let myGaSegment = 1; - let telemetryPrefKnown = false; let telemetryEnabled; - // If we ever get a 410 Gone response (or 404) from the server, we'll stop trying to send events for the rest - // of the session - let hasReturnedGone = false; - // If there's this many entirely failed responses (e.g., server can't be contacted), then stop sending events - // for the rest of the session: - let serverFailedResponses = 3; - - const EVENT_BATCH_DURATION = 1000; // ms for setTimeout - let pendingEvents = []; - let pendingTimings = []; - let eventsTimeoutHandle, timingsTimeoutHandle; - const fetchOptions = { - method: "POST", - mode: "cors", - headers: { "content-type": "application/json" }, - credentials: "include", - }; - - function shouldSendEvents() { - return !hasReturnedGone && serverFailedResponses > 0 && myGaSegment < GA_PORTION; - } - - function flushEvents() { - if (pendingEvents.length === 0) { - return; - } - - const eventsUrl = `${main.getBackend()}/event`; - const deviceId = auth.getDeviceId(); - const sendTime = Date.now(); - - pendingEvents.forEach(event => { - event.queueTime = sendTime - event.eventTime; - log.info(`sendEvent ${event.event}/${event.action}/${event.label || "none"} ${JSON.stringify(event.options)}`); - }); - - const body = JSON.stringify({deviceId, events: pendingEvents}); - const fetchRequest = fetch(eventsUrl, Object.assign({body}, fetchOptions)); - fetchWatcher(fetchRequest); - pendingEvents = []; - } - - function flushTimings() { - if (pendingTimings.length === 0) { - return; - } - - const timingsUrl = `${main.getBackend()}/timing`; - const deviceId = auth.getDeviceId(); - const body = JSON.stringify({deviceId, timings: pendingTimings}); - const fetchRequest = fetch(timingsUrl, Object.assign({body}, fetchOptions)); - fetchWatcher(fetchRequest); - pendingTimings.forEach(t => { - log.info(`sendTiming ${t.timingCategory}/${t.timingLabel}/${t.timingVar}: ${t.timingValue}`); - }); - pendingTimings = []; - } - - function sendTiming(timingLabel, timingVar, timingValue) { - // sendTiming is only called in response to sendEvent, so no need to check - // the telemetry pref again here. - if (!shouldSendEvents()) { - return; - } - const timingCategory = "addon"; - pendingTimings.push({ - timingCategory, - timingLabel, - timingVar, - timingValue, - }); - if (!timingsTimeoutHandle) { - timingsTimeoutHandle = setTimeout(() => { - timingsTimeoutHandle = null; - flushTimings(); - }, EVENT_BATCH_DURATION); - } - } exports.sendEvent = function(action, label, options) { return Promise.resolve(); @@ -107,20 +24,23 @@ this.analytics = (function() { exports.refreshTelemetryPref = function() { return browser.telemetry.canUpload().then((result) => { - telemetryPrefKnown = true; telemetryEnabled = result; }, (error) => { // If there's an error reading the pref, we should assume that we shouldn't send data - telemetryPrefKnown = true; telemetryEnabled = false; throw error; }); }; + exports.isTelemetryEnabled = function() { catcher.watchPromise(exports.refreshTelemetryPref()); return telemetryEnabled; }; + exports.refreshTelemetryPref().catch((e) => { + console.error("Error getting Telemetry pref:", e); + }); + return exports; })(); diff --git a/webextension/background/main.js b/webextension/background/main.js index 8dc36a8296..242bcb0a0e 100644 --- a/webextension/background/main.js +++ b/webextension/background/main.js @@ -8,20 +8,6 @@ this.main = (function() { const pasteSymbol = (window.navigator.platform.match(/Mac/i)) ? "\u2318" : "Ctrl"; const { sendEvent, incrementCount } = analytics; - const manifest = browser.runtime.getManifest(); - let backend; - let _hasAnyShots = false; - - startBackground.serverStatus.then((status) => { - _hasAnyShots = status.hasAny; - }).catch((e) => { - log.warn("Cannot see server status", e); - }); - - exports.hasAnyShots = function() { - return _hasAnyShots; - }; - let hasSeenOnboarding = browser.storage.local.get(["hasSeenOnboarding"]).then((result) => { const onboarded = !!result.hasSeenOnboarding; hasSeenOnboarding = Promise.resolve(onboarded); @@ -30,28 +16,9 @@ this.main = (function() { log.error("Error getting hasSeenOnboarding:", error); }); - exports.setBackend = function(newBackend) { - backend = newBackend; - backend = backend.replace(/\/*$/, ""); - }; - - exports.getBackend = function() { - return backend; - }; - - communication.register("getBackend", () => { - return backend; - }); - function getOnboardingUrl() { - return backend + "/#hello"; - } - - for (const permission of manifest.permissions) { - if (/^https?:\/\//.test(permission)) { - exports.setBackend(permission); - break; - } + // FIXME-server: need a new onboarding URL + return "https://screenshots.firefox.com"; } function setIconActive(active, tabId) { @@ -87,10 +54,6 @@ this.main = (function() { }); } - function shouldOpenMyShots(url) { - return /^about:(?:newtab|blank|home)/i.test(url) || /^resource:\/\/activity-streams\//i.test(url); - } - // This is called by startBackground.js, where is registered as a click // handler for the webextension page action. exports.onClicked = catcher.watchFunction((tab) => { @@ -98,6 +61,7 @@ this.main = (function() { }); function forceOnboarding() { + // FIXME-server: need to both open the page, and start the onboarding return browser.tabs.create({url: getOnboardingUrl()}); } @@ -109,15 +73,6 @@ this.main = (function() { _startShotFlow(tab, "keyboard-shortcut"); }); - const _openMyShots = (tab, inputType) => { - catcher.watchPromise(analytics.refreshTelemetryPref().then(() => { - sendEvent("goto-myshots", inputType, {incognito: tab.incognito}); - })); - catcher.watchPromise( - auth.maybeLogin() - .then(() => browser.tabs.update({url: backend + "/shots"}))); - }; - const _startShotFlow = (tab, inputType) => { catcher.watchPromise(hasSeenOnboarding.then(onboarded => { if (!tab) { @@ -135,9 +90,6 @@ this.main = (function() { popupMessage: "UNSHOOTABLE_PAGE", }); return; - } else if (shouldOpenMyShots(tab.url)) { - _openMyShots(tab, inputType); - return; } // No need to catch() here because of watchPromise(). // eslint-disable-next-line promise/catch-or-return @@ -155,45 +107,24 @@ this.main = (function() { }; function urlEnabled(url) { - if (shouldOpenMyShots(url)) { - return true; + if (/^about:(?:newtab|blank|home)/i.test(url) || /^resource:\/\/activity-streams\//i.test(url)) { + return false; } // Allow screenshots on urls related to web pages in reader mode. if (url && url.startsWith("about:reader?url=")) { return true; } - if (isShotOrMyShotPage(url) || /^(?:about|data|moz-extension):/i.test(url) || isBlacklistedUrl(url)) { + if (isBlacklistedUrl(url)) { return false; } return true; } - function isShotOrMyShotPage(url) { - // It's okay to take a shot of any pages except shot pages and My Shots - if (!url.startsWith(backend)) { - return false; - } - const path = url.substr(backend.length).replace(/^\/*/, "").replace(/[?#].*/, ""); - if (path === "shots") { - return true; - } - if (/^[^/]{1,4000}\/[^/]{1,4000}$/.test(path)) { - // Blocks {:id}/{:domain}, but not /, /privacy, etc - return true; - } - return false; - } - function isBlacklistedUrl(url) { // These specific domains are not allowed for general WebExtension permission reasons // Discussion: https://bugzilla.mozilla.org/show_bug.cgi?id=1310082 - // List of domains copied from: https://dxr.mozilla.org/mozilla-central/source/browser/app/permissions#18-19 - // Note we disable it here to be informative, the security check is done in WebExtension code - const badDomains = ["addons.mozilla.org", "testpilot.firefox.com"]; - let domain = url.replace(/^https?:\/\//i, ""); - domain = domain.replace(/\/.*/, "").replace(/:.*/, ""); - domain = domain.toLowerCase(); - return badDomains.includes(domain); + // Due to enhanced permissions, nothing is blacklisted any longer + return false; } communication.register("sendEvent", (sender, ...args) => { @@ -202,25 +133,6 @@ this.main = (function() { return null; }); - communication.register("openMyShots", (sender) => { - return catcher.watchPromise( - auth.maybeLogin() - .then(() => browser.tabs.create({url: backend + "/shots"}))); - }); - - communication.register("openShot", (sender, {url, copied}) => { - if (copied) { - const id = makeUuid(); - return browser.notifications.create(id, { - type: "basic", - iconUrl: "../icons/copied-notification.svg", - title: browser.i18n.getMessage("notificationLinkCopiedTitle"), - message: browser.i18n.getMessage("notificationLinkCopiedDetails", pasteSymbol), - }); - } - return null; - }); - // This is used for truncated full page downloads and copy to clipboards. // Those longer operations need to display an animated spinner/loader, so // it's preferable to perform toDataURL() in the background. diff --git a/webextension/background/selectorLoader.js b/webextension/background/selectorLoader.js index a75ea158af..3bc8341f79 100644 --- a/webextension/background/selectorLoader.js +++ b/webextension/background/selectorLoader.js @@ -70,12 +70,6 @@ this.selectorLoader = (function() { catcher.watchPromise(hasSeenOnboarding.then(onboarded => { loadingTabs.add(tabId); let promise = Promise.resolve(); - promise = promise.then(() => { - browser.tabs.executeScript(tabId, { - code: `window.hasAnyShots = ${!!main.hasAnyShots()};`, - runAt: "document_start", - }); - }); if (onboarded) { promise = promise.then(() => { return executeModules(tabId, standardScripts.concat(selectorScripts)); diff --git a/webextension/background/senderror.js b/webextension/background/senderror.js index 704df8d842..63b4bc45ae 100644 --- a/webextension/background/senderror.js +++ b/webextension/background/senderror.js @@ -1,4 +1,4 @@ -/* globals startBackground, analytics, communication, makeUuid, Raven, catcher, auth, log */ +/* globals startBackground, analytics, communication, makeUuid, Raven, catcher, buildSettings, log */ "use strict"; @@ -92,7 +92,7 @@ this.senderror = (function() { log.error("Telemetry disabled. Not sending critical error:", e); return; } - const dsn = auth.getSentryPublicDSN(); + const dsn = buildSettings.defaultSentryDsn; if (!dsn) { log.warn("Screenshots error:", e); return; diff --git a/webextension/background/startBackground.js b/webextension/background/startBackground.js index 03e896f128..a4e3cb3794 100644 --- a/webextension/background/startBackground.js +++ b/webextension/background/startBackground.js @@ -10,16 +10,6 @@ const startTime = Date.now(); this.startBackground = (function() { const exports = {startTime}; - // Wait until this many milliseconds to check the server for shots (for the purpose of migration warning): - const CHECK_SERVER_TIME = 5000; // 5 seconds - // If we want to pop open the tab showing the server status, wait this many milliseconds to open it: - const OPEN_SERVER_TAB_TIME = 5000; // 5 seconds - let hasSeenServerStatus = false; - let _resolveServerStatus; - exports.serverStatus = new Promise((resolve, reject) => { - _resolveServerStatus = {resolve, reject}; - }); - let backend; const backgroundScripts = [ "log.js", @@ -33,7 +23,6 @@ this.startBackground = (function() { "build/shot.js", "build/thumbnailGenerator.js", "background/analytics.js", - "background/takeshot.js", "background/main.js", ]; @@ -112,84 +101,5 @@ this.startBackground = (function() { return loadedPromise; } - async function checkExpiration() { - const manifest = await browser.runtime.getManifest(); - for (const permission of manifest.permissions) { - if (/^https?:\/\//.test(permission)) { - backend = permission.replace(/\/*$/, ""); - break; - } - } - const result = await browser.storage.local.get(["registrationInfo", "hasSeenServerStatus", "hasShotsResponse"]); - hasSeenServerStatus = result.hasSeenServerStatus; - const { registrationInfo } = result; - if (!backend || !registrationInfo || !registrationInfo.registered) { - // The add-on hasn't been used, or at least no upload has occurred - _resolveServerStatus.resolve({hasIndefinite: false, hasAny: false}); - return; - } - if (result.hasShotsResponse) { - // We've already retrieved information from the server - _resolveServerStatus.resolve(result.hasShotsResponse); - return; - } - const loginUrl = `${backend}/api/login`; - const hasShotsUrl = `${backend}/api/has-shots`; - try { - let resp = await fetch(loginUrl, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - deviceId: registrationInfo.deviceId, - secret: registrationInfo.secret, - }), - }); - if (!resp.ok) { - throw new Error(`Bad login response: ${resp.status}`); - } - const { authHeader } = await resp.json(); - resp = await fetch(hasShotsUrl, { - method: "GET", - credentials: "include", - headers: Object.assign({}, authHeader, { - "Content-Type": "application/json", - }), - }); - if (!resp.ok) { - throw new Error(`Bad response from server: ${resp.status}`); - } - const body = await resp.json(); - browser.storage.local.set({hasShotsResponse: body}); - _resolveServerStatus.resolve(body); - } catch (e) { - _resolveServerStatus.reject(e); - } - } - - exports.serverStatus.then((status) => { - if (status.hasAny) { - browser.experiments.screenshots.initLibraryButton(); - } - if (status.hasIndefinite && !hasSeenServerStatus) { - setTimeout(async () => { - await browser.tabs.create({ - url: `${backend}/hosting-shutdown`, - }); - hasSeenServerStatus = true; - await browser.storage.local.set({hasSeenServerStatus}); - }, OPEN_SERVER_TAB_TIME); - } - }).catch((e) => { - console.error("Error finding Screenshots server status:", String(e), e.stack); - }); - - setTimeout(() => { - window.requestIdleCallback(() => { - checkExpiration(); - }); - }, CHECK_SERVER_TIME); - return exports; })(); diff --git a/webextension/background/takeshot.js b/webextension/background/takeshot.js deleted file mode 100644 index c0ee835299..0000000000 --- a/webextension/background/takeshot.js +++ /dev/null @@ -1,232 +0,0 @@ -/* globals communication, shot, main, auth, catcher, analytics, buildSettings, blobConverters, thumbnailGenerator */ - -"use strict"; - -this.takeshot = (function() { - const exports = {}; - const Shot = shot.AbstractShot; - const { sendEvent, incrementCount } = analytics; - - communication.register("takeShot", catcher.watchFunction((sender, options) => { - const { captureType, captureText, scroll, selectedPos, shotId } = options; - const shot = new Shot(main.getBackend(), shotId, options.shot); - let imageBlob = options.imageBlob; - let capturePromise = Promise.resolve(); - let openedTab; - let thumbnailBlob; - if (!shot.clipNames().length) { - // canvas.drawWindow isn't available, so we fall back to captureVisibleTab - capturePromise = screenshotPage(selectedPos, scroll).then((dataUrl) => { - imageBlob = buildSettings.uploadBinary ? blobConverters.dataUrlToBlob(dataUrl) : null; - shot.addClip({ - createdDate: Date.now(), - image: { - url: buildSettings.uploadBinary ? "" : dataUrl, - captureType, - text: captureText, - location: selectedPos, - dimensions: { - x: selectedPos.right - selectedPos.left, - y: selectedPos.bottom - selectedPos.top, - }, - }, - }); - }); - } - const shotAbTests = {}; - const abTests = auth.getAbTests(); - for (const testName of Object.keys(abTests)) { - if (abTests[testName].shotField) { - shotAbTests[testName] = abTests[testName].value; - } - } - if (Object.keys(shotAbTests).length) { - shot.abTests = shotAbTests; - } - return catcher.watchPromise(capturePromise.then(() => { - if (buildSettings.uploadBinary) { - const blobToUrlPromise = blobConverters.blobToDataUrl(imageBlob); - return thumbnailGenerator.createThumbnailBlobFromPromise(shot, blobToUrlPromise); - } - return thumbnailGenerator.createThumbnailUrl(shot); - }).then((thumbnailImage) => { - if (buildSettings.uploadBinary) { - thumbnailBlob = thumbnailImage; - } else { - shot.thumbnail = thumbnailImage; - } - return browser.experiments.screenshots.getUpdateChannel(); - }).then((firefoxChannel) => { - shot.firefoxChannel = firefoxChannel; - return browser.tabs.create({url: shot.creatingUrl}); - }).then((tab) => { - openedTab = tab; - sendEvent("internal", "open-shot-tab"); - return uploadShot(shot, imageBlob, thumbnailBlob); - }).then(() => { - return browser.tabs.update(openedTab.id, {url: shot.viewUrl, loadReplace: true}).then( - null, - (error) => { - // FIXME: If https://bugzilla.mozilla.org/show_bug.cgi?id=1365718 is resolved, - // use the errorCode added as an additional check: - if ((/invalid tab id/i).test(error)) { - // This happens if the tab was closed before the upload completed - return browser.tabs.create({url: shot.viewUrl}); - } - throw error; - } - ); - }).then(() => { - catcher.watchPromise(incrementCount("upload")); - return shot.viewUrl; - }).catch((error) => { - browser.tabs.remove(openedTab.id); - throw error; - })); - })); - - communication.register("screenshotPage", (sender, selectedPos, scroll) => { - return screenshotPage(selectedPos, scroll); - }); - - function screenshotPage(pos, scroll) { - pos = { - top: pos.top - scroll.scrollY, - left: pos.left - scroll.scrollX, - bottom: pos.bottom - scroll.scrollY, - right: pos.right - scroll.scrollX, - }; - pos.width = pos.right - pos.left; - pos.height = pos.bottom - pos.top; - return catcher.watchPromise(browser.tabs.captureVisibleTab( - null, - {format: "png"} - ).then((dataUrl) => { - const image = new Image(); - image.src = dataUrl; - return new Promise((resolve, reject) => { - image.onload = catcher.watchFunction(() => { - const xScale = image.width / scroll.innerWidth; - const yScale = image.height / scroll.innerHeight; - const canvas = document.createElement("canvas"); - canvas.height = pos.height * yScale; - canvas.width = pos.width * xScale; - const context = canvas.getContext("2d"); - context.drawImage( - image, - pos.left * xScale, pos.top * yScale, - pos.width * xScale, pos.height * yScale, - 0, 0, - pos.width * xScale, pos.height * yScale - ); - const result = canvas.toDataURL(); - resolve(result); - }); - }); - })); - } - - /** Combines two buffers or Uint8Array's */ - function concatBuffers(buffer1, buffer2) { - const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength); - tmp.set(new Uint8Array(buffer1), 0); - tmp.set(new Uint8Array(buffer2), buffer1.byteLength); - return tmp.buffer; - } - - /** Creates a multipart TypedArray, given {name: value} fields - and a files array in the format of - [{fieldName: "NAME", filename: "NAME.png", blob: fileBlob}, {...}, ...] - - Returns {body, "content-type"} - */ - function createMultipart(fields, files) { - const boundary = "---------------------------ScreenshotBoundary" + Date.now(); - let body = []; - for (const name in fields) { - body.push("--" + boundary); - body.push(`Content-Disposition: form-data; name="${name}"`); - body.push(""); - body.push(fields[name]); - } - body.push(""); - body = body.join("\r\n"); - const enc = new TextEncoder("utf-8"); - body = enc.encode(body).buffer; - - const blobToArrayPromises = files.map(f => { - return blobConverters.blobToArray(f.blob); - }); - - return Promise.all(blobToArrayPromises).then(buffers => { - for (let i = 0; i < buffers.length; i++) { - let filePart = []; - filePart.push("--" + boundary); - filePart.push(`Content-Disposition: form-data; name="${files[i].fieldName}"; filename="${files[i].filename}"`); - filePart.push(`Content-Type: ${files[i].blob.type}`); - filePart.push(""); - filePart.push(""); - filePart = filePart.join("\r\n"); - filePart = concatBuffers(enc.encode(filePart).buffer, buffers[i]); - body = concatBuffers(body, filePart); - body = concatBuffers(body, enc.encode("\r\n").buffer); - } - - let tail = `\r\n--${boundary}--`; - tail = enc.encode(tail); - body = concatBuffers(body, tail.buffer); - return { - "content-type": `multipart/form-data; boundary=${boundary}`, - body, - }; - }); - } - - function uploadShot(shot, blob, thumbnail) { - let headers; - return auth.authHeaders().then((_headers) => { - headers = _headers; - if (blob) { - const files = [ {fieldName: "blob", filename: "screenshot.png", blob} ]; - if (thumbnail) { - files.push({fieldName: "thumbnail", filename: "thumbnail.png", blob: thumbnail}); - } - return createMultipart( - {shot: JSON.stringify(shot)}, - - files - ); - } - return { - "content-type": "application/json", - body: JSON.stringify(shot), - }; - - }).then((submission) => { - headers["content-type"] = submission["content-type"]; - sendEvent("upload", "started", {eventValue: Math.floor(submission.body.length / 1000)}); - return fetch(shot.jsonUrl, { - method: "PUT", - mode: "cors", - headers, - body: submission.body, - }); - }).then((resp) => { - if (!resp.ok) { - sendEvent("upload-failed", `status-${resp.status}`); - const exc = new Error(`Response failed with status ${resp.status}`); - exc.popupMessage = "REQUEST_ERROR"; - throw exc; - } else { - sendEvent("upload", "success"); - } - }, (error) => { - // FIXME: I'm not sure what exceptions we can expect - sendEvent("upload-failed", "connection"); - error.popupMessage = "CONNECTION_ERROR"; - throw error; - }); - } - - return exports; -})(); diff --git a/webextension/manifest.json.template b/webextension/manifest.json.template index 085aca3f11..6d31f28a48 100644 --- a/webextension/manifest.json.template +++ b/webextension/manifest.json.template @@ -83,7 +83,6 @@ "mozillaAddons", "telemetry", "", - "http://localhost:10080/", "resource://pdf.js/", "about:reader*" ], diff --git a/webextension/selector/shooter.js b/webextension/selector/shooter.js index 61fc813ba6..e0a95a2962 100644 --- a/webextension/selector/shooter.js +++ b/webextension/selector/shooter.js @@ -13,7 +13,6 @@ this.shooter = (function() { // eslint-disable-line no-unused-vars let shotObject; let supportsDrawWindow; const callBackground = global.callBackground; - const clipboard = global.clipboard; function regexpEscape(str) { // http://stackoverflow.com/questions/3115150/how-to-escape-regular-expression-special-characters-using-javascript @@ -104,96 +103,6 @@ this.shooter = (function() { // eslint-disable-line no-unused-vars return callBackground("canvasToDataURL", imageData); } - let isSaving = null; - - exports.takeShot = function(captureType, selectedPos, url) { - // isSaving indicates we're aleady in the middle of saving - // we use a timeout so in the case of a failure the button will - // still start working again - if (Math.floor(selectedPos.left) === Math.floor(selectedPos.right) || - Math.floor(selectedPos.top) === Math.floor(selectedPos.bottom)) { - const exc = new Error("Empty selection"); - exc.popupMessage = "EMPTY_SELECTION"; - exc.noReport = true; - catcher.unhandled(exc); - return; - } - let imageBlob; - const uicontrol = global.uicontrol; - let deactivateAfterFinish = true; - if (isSaving) { - return; - } - isSaving = setTimeout(() => { - if (typeof ui !== "undefined") { - // ui might disappear while the timer is running because the save succeeded - ui.Box.clearSaveDisabled(); - } - isSaving = null; - }, 1000); - selectedPos = selectedPos.toJSON(); - let captureText = ""; - if (buildSettings.captureText) { - captureText = util.captureEnclosedText(selectedPos); - } - const dataUrl = url || screenshotPage(selectedPos, captureType); - let type = blobConverters.getTypeFromDataUrl(dataUrl); - type = type ? type.split("/", 2)[1] : null; - if (dataUrl) { - imageBlob = buildSettings.uploadBinary ? blobConverters.dataUrlToBlob(dataUrl) : null; - shotObject.delAllClips(); - shotObject.addClip({ - createdDate: Date.now(), - image: { - url: buildSettings.uploadBinary ? "" : dataUrl, - type, - captureType, - text: captureText, - location: selectedPos, - dimensions: { - x: selectedPos.right - selectedPos.left, - y: selectedPos.bottom - selectedPos.top, - }, - }, - }); - } - catcher.watchPromise(callBackground("takeShot", { - captureType, - captureText, - scroll: { - scrollX: window.scrollX, - scrollY: window.scrollY, - innerHeight: window.innerHeight, - innerWidth: window.innerWidth, - }, - selectedPos, - shotId: shotObject.id, - shot: shotObject.toJSON(), - imageBlob, - }).then((url) => { - return clipboard.copy(url).then((copied) => { - return callBackground("openShot", { url, copied }); - }); - }, (error) => { - if ("popupMessage" in error && (error.popupMessage === "REQUEST_ERROR" || error.popupMessage === "CONNECTION_ERROR")) { - // The error has been signaled to the user, but unlike other errors (or - // success) we should not abort the selection - deactivateAfterFinish = false; - // We need to unhide the UI since screenshotPage() hides it. - ui.iframe.unhide(); - return; - } - if (error.name !== "BackgroundError") { - // BackgroundError errors are reported in the Background page - throw error; - } - }).then(() => { - if (deactivateAfterFinish) { - uicontrol.deactivate(); - } - })); - }; - exports.downloadShot = function(selectedPos, previewDataUrl, type) { const shotPromise = previewDataUrl ? Promise.resolve(previewDataUrl) : screenshotPageAsync(selectedPos, type); catcher.watchPromise(shotPromise.then(dataUrl => { diff --git a/webextension/selector/ui.js b/webextension/selector/ui.js index a5d3cf35bf..5780e882b4 100644 --- a/webextension/selector/ui.js +++ b/webextension/selector/ui.js @@ -80,7 +80,8 @@ this.ui = (function() { // eslint-disable-line no-unused-vars } const showMyShots = exports.showMyShots = function() { - return window.hasAnyShots; + // FIXME-server: we should remove the my shots code + return false; }; function initializeIframe() { diff --git a/webextension/selector/uicontrol.js b/webextension/selector/uicontrol.js index 04f7a4597b..488a352b58 100644 --- a/webextension/selector/uicontrol.js +++ b/webextension/selector/uicontrol.js @@ -154,7 +154,8 @@ this.uicontrol = (function() { exports.deactivate(); }, save: () => { sendEvent("save-shot", "overlay-save-button"); - shooter.takeShot("selection", selectedPos); + // FIXME-server: remove this branch + throw new Error("Disabled"); }, download: () => { sendEvent("download-shot", "overlay-download-button"); downloadShot(); @@ -216,7 +217,8 @@ this.uicontrol = (function() { Math.min(selectedPos.bottom, MAX_PAGE_HEIGHT)); dataUrl = null; } - shooter.takeShot(captureType, selectedPos, dataUrl); + // FIXME-server: remove this branch + throw new Error("Disabled"); }, onDownloadPreview: () => { sendEvent(`download-${captureType.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()}`, "download-preview-button"); From 56968cf3c18f36967e2a5bc95069c64572b120df Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Fri, 22 Mar 2019 10:33:34 -0500 Subject: [PATCH 04/15] Remove sitehelper --- static/homepage/css/help.css | 76 -- static/homepage/css/style.css | 58 -- static/homepage/fonts/OpenSans-Bold.ttf | Bin 224592 -> 0 bytes static/homepage/fonts/OpenSans-Light.ttf | Bin 222412 -> 0 bytes static/homepage/fonts/OpenSans-Regular.ttf | Bin 217360 -> 0 bytes static/homepage/install-test-local.html | 55 -- static/js/UITour-lib.js | 772 --------------------- static/js/parent-helper.js | 68 -- static/js/wantsauth.js | 93 --- webextension/background/main.js | 10 - webextension/manifest.json.template | 12 - webextension/sitehelper.js | 94 --- 12 files changed, 1238 deletions(-) delete mode 100644 static/homepage/css/help.css delete mode 100644 static/homepage/css/style.css delete mode 100644 static/homepage/fonts/OpenSans-Bold.ttf delete mode 100644 static/homepage/fonts/OpenSans-Light.ttf delete mode 100644 static/homepage/fonts/OpenSans-Regular.ttf delete mode 100644 static/homepage/install-test-local.html delete mode 100644 static/js/UITour-lib.js delete mode 100644 static/js/parent-helper.js delete mode 100644 static/js/wantsauth.js delete mode 100644 webextension/sitehelper.js diff --git a/static/homepage/css/help.css b/static/homepage/css/help.css deleted file mode 100644 index 853cac4f2d..0000000000 --- a/static/homepage/css/help.css +++ /dev/null @@ -1,76 +0,0 @@ -html { - font-family: -apple-system, BlinkMacSystemFont, "segoe ui", "helvetica neue", helvetica, ubuntu, roboto, noto, arial, sans-serif; - height: 100%; -} - -body { - height: 100%; - background-image: url("../images/whistler.jpg"); - background-repeat: no-repeat; - background-size: cover; - background-position: 50% 85%; -} - -h1 { - color: #4D4D4D; -} - -#instructions { - color: #ffffff; - font-size: 30px; - text-align: center; - position: absolute; - top: 30%; - left: 50%; - width: 500px; - margin-left: -250px; -} - -#button-instructions { - position: absolute; - top: 5px; - right: 10px; -} - -#guy-instructions { - position: absolute; - top: 58%; - left: 25.5%; -} - -.panel { - background-color: #FFCB00; - padding: 16px; - box-shadow: 0px 6px 20px rgba(0, 0, 0, 0.5); - color: #3A2E00; - font-size: 13px; - border-radius: 1px; -} - -.panel-arrowUp { - position: relative; - top: -15px; - left: 50%; - width: 0; - height: 0; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #FFCB00; -} - -.panel-arrowDown { - position: relative; - bottom: -33px; - left: 50%; - width: 0; - height: 0; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #FFCB00; -} - -.button-image { - background-color: #E1E1E1; - display: inline-block; - padding: 2px 4px; -} diff --git a/static/homepage/css/style.css b/static/homepage/css/style.css deleted file mode 100644 index a07aeaa1bf..0000000000 --- a/static/homepage/css/style.css +++ /dev/null @@ -1,58 +0,0 @@ -body { - margin: 0; - background: #fcfcfc; -} - -html { - box-sizing: border-box; - font-family: -apple-system, BlinkMacSystemFont, "segoe ui", "helvetica neue", helvetica, ubuntu, roboto, noto, arial, sans-serif; -} - -.myshots-button { - background: transparent; - border-radius: 5px; - border: 2px solid #858585; - color: #858585; - cursor: pointer; - font-size: 16px; - padding: 5px; - position: absolute; - right: 5px; - top: 5px; -}s - -.graphic { - background-image: url('/static/img/onboarding-1.png'); - background-size: 327px 255px; - height: 255px; - margin: 10% auto 10px; - width: 327px; -} - -h1, -p { - text-align: center; -} - -h1 { - font-size: 30px; - font-weight: 400; - margin: 0 0 10px; -} - -sup { - background: #00d1e6; - border-radius: 2px; - color: #fff; - font-size: 16px; - margin-left: 5px; - padding: 2px 4px; - text-transform: uppercase; -} - -p { - color: #858585; - font-size: 16px; - line-height: 23px; - margin: 0; -} diff --git a/static/homepage/fonts/OpenSans-Bold.ttf b/static/homepage/fonts/OpenSans-Bold.ttf deleted file mode 100644 index fd79d43bea0293ac1b20e8aca1142627983d2c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224592 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 diff --git a/static/homepage/fonts/OpenSans-Light.ttf b/static/homepage/fonts/OpenSans-Light.ttf deleted file mode 100644 index 0d381897da20345fa63112f19042561f44ee3aa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222412 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%0AG%b#%#Weyp=oz<}IGPqm z)8c4aT%)1Wt!Z(MiMFk2@iJ>#98HU(X>l|yj;6)Yv^bg;N7LeHS{zM_Yxd#ySkvN~ zeHg82+}v^bg;*NE&CYg!yli=%0AG%cHosL)|1w>IGPqm)8c4a98HU( zY234>XK0^jS{zM_2iCMWnifaX;t^|FJYr3YqiJz8Esmze(X=?47Dv zv^bg;N7LeHS{zM_qiJz8Esmze(X=?47H4HFj;3+zoZezA-tt2Ti*NO}ht8y9Z4R(XR?O$*VqkT@+w(?T>YMAJev zEkx5oG%ZBaLNqNz(?T>YMAJevEkx5oG%ZBaLNqNz(?T>YMAJevEkx5oG%ZBaLNqNz z(?T>YMAJevEkx5oR&hf#Eo2opMAJf6aYHmMMAJevEkx5oG%ZBaLNqNz(?T>YMAJev zEkx5oG%ZBaLNqNz(?T>YMAJevEkx5oG%ZBaLNqNz(?T>YMAJevEkx5oG%ZBaLNqNz z(?T>YMAJevEkx5oG%ZBaLNqNz(?T>YMAJevEkx5oG%ZBaLNqNTP7BerkT@+w(?a63 z5KRlwv=B`T(XYMAJevEkx5oG%ZBaLNqNz z(?T>YMAJevEkx5oG%ZBaLNqNz(?T>YMAJevEhJ70(XR?O$*Vq5KRlwv=B`T z(XR?O$*Vq5KRlwv=B`T(XR?O$*Vq5KRlwv=B`T(XR?O$*Vq z5KRlwv=B`T(XR?O$*Vq5KRlwv=B`T(XR?O$*Vq5KRlww2(M0MAJev zEkx5oG%bueP7Ber5KRlww2(M0MAJevEkx5oG%ZBaLgKU#O$&+BLNqNz(?T>YMAJev zEkx5oG%ZBaLNqNz(?T>YMAP0U?OF`pC)G0Er8SoKNhOTUp#J+?b_&#gf6GpT`tNVq z`tNU{{`)(4pIVDh9@l&1apQkc7;3ZIp8x<=jR&w^7b*lyjTZ%+I)-+oWbjmvftx!RT^sqnz6)=Qhf@jdE_IoZBep zHp;n8?M=_Cr5Rn$ZE9mimvbBC+@=;~+vVIwIk!>H?UZvn<=jp=w^PpTlyf`f+)g>S zQ_k&_b35hSPC2(z&h3SQ_k&_b35hS zPC2(z&K;C<2j$#BId@Rb9h7qi<=jCzcTmn9lye8=+(9{aP|h8ca|h+zK{ zW=5m^?mHQc_Pg(76jDy#qPQ6N7Dc1mr*Ba-x_$ZHGeSE~oGNGrF9<@6YIR`o2G-%UPvz>P!ul)9BTtDwTFb80WA4_FbhY z#po~HRfeVx5g-?6V$CSvb(_^(5u{4taDbe&RNAeXBF$5RjhMXvCdh= zI%gH@oK>uIRzq}rb5^m=S;abM73-W;taDZ=0&(s+a2%Wfb!&{$y#`(- zKic+6c$K_q+w0*~iaq>WuZmYG_OR`>@hZh0w!K1LrP#yvtJtrBUMH_&rL>Bb(kfO; zs}y@U-RtC4iaq=*e=Dg{>|y*N_#^O5@CNu}(BD$46nhwd3H%lC4$y75O0kFk>Xuxk z*u%D0+N%_M*!FsRm0}Oum7rT@m0}O0+g_F84Wrv$Rp7Q)rFg^mAHZ5O!M6Fp z&R?beVq3Sy2)%Y%rCwt@#MZ4bvc2+9r5TnQPq6E-KZ;HNQsm$_(7zNp*rtE6 zl3b<8!Ef`oq$))Yw!K7RPiXwBIv&9QAS z>||!NQ<`Jj9PX6n=)@msj`4nQFKDiIN^{N$b<&7XCmslO(uhze9td^Ph)}n&2z48a z(Cb>h0nj<>q!FP`8WHNG5ur{R5$dE7q1SVEGWXfZ+-E0qpPkHob~5+b$=qkB=048r z+h9MalSY&>2o8ZqK%F$A^kGmZjmSO*W92u5055=x zpiUamUv<)mP$!KDy*j;9%42*3)JY?Yr*~@BW7KUd!A>cUQMa)Ob<&9N z4*ylN9=(%U&rT_i?F!O=75iP-zlMD$ztTw~dd9ter!cB( zZetO;C+^f7$LRj(8y>}#w8%Nq-k9U;lomNfx3L7i|54AVB^w{{do&{3)=48muaxeT z7TMNGBY|&+)L*4VN|6@X)=48mucGgi7TMNGBSM`tB8-!wlSX8R*g9!M_WQ7P(unMB z*g9!MwoV!m-ixi1Mr7-x5ur{R5$dE7p-vhR>ZB2&P8ty=K%F!qTPKYOKLk>DW-&XZ zMNao>^G?lTYKZ^YzNWWtivr}5+zk0QKr?kknSDSZAi)>r5cS?(Fd$oC| zw8%ESQd(pi4y8r5-{w#!jmSO#>NXbHI%!0x+gOCUjV0KH7VScde3RygQmjS0P?%k4 z(Jr)T7h2>S3`c?lT9iPG5dPTI5^v7G+zDd~2T3{P@;9qqQhe=C^4)nxYmx8HGg^y$ zcb?H&~o^5N9Z_~4F zE%I%8wyj0JP0zNq$hYYktwp{~&uA_3ZF)v)k#Ey8{*h~q7Wp~o>TT=)9=tC-=^nuYmsl$vu!Q%ZF;t?MG3UXx9Qoo7Wp{Qxr}eqGkSL5+w_c{ z5%@MeqhovDre}0K@7wf@j@5UoeHtB~`!+ox5wdU7lPwO7jw*edp3(87Z__h6hV*TE zM#qi5P0#39(YNU>2i$ulbnUqJO6c0{p?2JRCEK;*-YcPN$GulV*N%IygsvU;UI|@0 z?!6MacHDa{R+u7=vx;JX@XSA*|rs9g=dtD$x^ z_^yW9)!@4tYFC5rYN%ZezN^7^HTbTE+STB@8fsUA?`o)B4Zf?Pb~X5}hT7HOyBca& zt3ALCL2a2%ZV@`(u2oHqx_LzCk*-$tHR|LRp-yfQ>f{!oPHqu;B&ua3swFC}WhAO) zB&ua3s%0dq)ox5bZ=J72;cLHjLioQX9lU zo!lZ@C$|W7a*NQ~SgXC7PS?pTLY>?a)JAl2i|`lytH?V*_vl(wr4~J@MM-MWkXkgP z7WJq_H)_SFpSM=jq7t>}LoLcs8-2>}k2ZihxkdKZl?(T#34d8F=MR;;@g2hZ*u!~0 z@yY$fC-*DfSPbqL+vkMdIefp^Htr_fJ7DiG+XFU{(hRnMDXAEz4jP?;_aDal4@W+xlzRBDhyVKEVLe|TxK-2#Pk^5J)(1~w|7Yw5 ze{rF-(-(>gWk^TDZqrrat*7yYIF@3+@;FN>dPm72B@`%&_Lgm~qk2vKE z;1^ZS{lQ;ie~G_-SvB1s*f0BoCem9#uV?NL(%5a_S9$VTer50M53C#egKvP(k@8LK zcAo4Yr4#H1pXaYV*e@6(-Wjz&;+;|Z`Qo-8ukFWc`{gy2D&n~434HMczIXy(Jb^Es zz!y*8izo2K6Zql@eDMUncmiKMfiFI#-!2EA(r=A!y$A5l0laen?;OB82k_2;z&+~# zJ~|M%XB|+E`W3C{0A4$w9G&hKbs%uhI)EP!;Ku{Bu}@RxPgCYklkca4ztNMQ4*t9F zNow~bwR@5$pXA9Wsoj&*?n!F*B(-~z+C53_o}_k9QoDoHz6mxI*hAayxN zT@F&0gVg09bvZ~~4pNtc)a4*`IY?a&QkR3&7WZ8wOAb3(W62C-q=ZM%WC-9X!JplvtM zwi^Ps?FQO*L*TaE5V&nO(6$?B+YQnjzrk(0fwtWcxNSECZrcrk+jc|Xw%tJ6ZlG;9 z1a8|6f!lUN;I`cmxNSECZrcrk+jc|Xw%ri8Z8rpN+YPks2HJK5ZM%WC-9X!JplvtM zwhzI^A$T|>9#X*}@nE#-9-=)Q5)Zbmx`${#hfv)^sO}+D_YkUkNIaa=GgjS0;-N?A z-hD_6j0ml|hs1!hg55$Rrio;ZQH7Q zh&mpkj)zd)r&YV2;Az!PNSl0`Hu*Gd@@cinb4vHf^)zkrX|>4_*@sB~oZ8aUYK?xz zJ?m+`U+>ZTjUQ9`=iujaF!MQ>`5Zm#bM&ld;Px4~eMY&D1kWgU;}f9O;2Gua6l=mW zl>ZsZ|9O>UG59>aLK-M*P)?zZ&sZBmQc{Uyb;y5q~w}uSWdUh`$=~S0nyv#9xj0s}X-S;;%;h)rh|u z@mC}MYNWo6)VC3T{YCH;1}T+9s4^JeDfFFLBSP1umAbT2msaZHTct*VG$l+^ z!n8PFREkTL7TZRbCoNVNRp#d=)0Y3X@-j$*;oXS7Gv5YW*y=eip@hmb{*YfoEahYdrHcp7|Qj ze2r(m#xq~znQthU<=`92MX2{1-zoeizx^h^{U*QtCcphAzx^h^_02oyf_C|IQTT6d z!&^JNwW~cV9roH`uO0TBX1gi0ra|-@4-12bg2xBLPuy_%Gc-!?Rm=f zJY{>HvOQ1Po~LZjQ?_0`GZOUb8DY>XK6`^f@QB{f8+hk@Z!nJiGPYO$dV?#ZTm`)r z*Bjgb-!kg`dYj&F{4DrI|2FbvY%6VVqzilj90I@NH%Eqf!%3b$h3!?!-pFa}zr`NI z9_RT9>`BtkVpGnDXH313^Q2$E{%3FvTn9J6P4Hj963_qKcGPiKZ}eB361_t__eQPN zz0q>)JDq#<*Y%`t1V{<}e;mFSKz5LEdeE=u`vU*}LSHa~?RxbEu1jBV2FyuM`hp4n zHkjqFUMcMh=6H|y-}VLbJoy^9z+Zm=x^{iR1)lt0*j_>H3ts0}7qKsa-lN+muQ`{i z;5AaN^UgPT=7->qz&F7gJo#hnCGaNC-@^WT@z59ig!e3y@(hLryT{srh5 zzAs|s?2G&rPr8@&MLgH;i+HZx7x8}YzKG}AeG%{X?u$4Q>x;BuJLc(&{5R0b)))C3 z(jC?GMI6cWMf$)O`RlhpJRb4Ne4kpfYj+GA??;Yfzr>R#c-#NP_J6YUMNYaUL{9Om z)8H7G;~82=qaz^2Va zyqCK#LOY50|5N%RZ-7g@=N9-Adpv@#Bmc;6|2OIX#FPIAdj)$H`)AnJgucicb@6&m zU&QMe|Pck9UveKSKJ%+Loj>V1n!w~l2ZZfO}>PKI`pp@n2< z8<~h(MJD3*kcrrjnTS1@kzb6~oJ{0<;52CE$wbUjCSrav5i^rf-G!>7(OR96!Wcb9 zWTLLci=@0riqD@P34H#%5S8vnrTYV`bU!NHk4pCkR=@thD&3Dt_p87A8P~2KmF^Gh zk$zOVAC>M$rTZgR>3&qYKVp^cN2U8CR_XqTRk}Z7mF`ES`y*DfezjP??Yr1kw*H7! zx<6u-?vGfd`y*z!KVp^chpYYw<%F?*RJvcS(a%_=`_)>ER_XqTRk}Z7mF`!|FZ~zVm;BWvA2jFmkk!}DE2jFl3 z4hP_H01gM>Z~zVm;BWvA2jFl34hP_H01gM>Z~zVm;BWvA2jFl34hP_H01gM>Z~zVm z;BWvAeXqet;Cl^(a5xBugK#(qhl6l92#14kI0%P>a5xBugK#(qhl6nF`w{d`I2?q- zK{y4WUItXweW_G=vrnp+!Sz(GXfRq}uscR-_@-&S+g4k}mZKJw^8$z9iP^Tf(X-M^Qx;1JDjT%CuhESv-6ln;J8j4mb20lXkbA-s}h-#-4BA+8f zK1Yarjs(_b-VHRO@rXzr&uB_m2dxD#s&=XKcTYeHpw4TEUJe-Z1{O?11ne zu>X-atnjO!Ih`ot2vNilMG<;ld@9F?V}>J24|CrJOF*rV9?!V&mC!nklmBeiNRFF3u3?a}#2pk3`?Czxqa!2BF8_VfFMLp`)5%^>L?I&xh&b!|LNsze0+AG)(XI{Udr( z{o43hr_-;8>DR;b>tXe4r@sIWf#31l=-0#Q*Z!@?mtpnml<;rCah{deUkE*39o&I~2{&()vo-c=Ofv` z^O0BU$Dn*~p8$)ANyR#Pg9X z^O3CjlR z^*Ez-AWOf?O6B|pk2P7ToNdoXvJu)6^O39+&s=#vl4U-URS&gIn?VD!XkZo%%rYOz zMm!(MMm!(MMm!(MG9Sq@AIUP7Wh0)CWEs)25zj}mjBDA5=OfvOqu(s^k*vma*TVCW ztaL!RGat!DJs-(3AIUNw$)c!P<|A1YHOqV?E3NR8o{wZv*DUjqEc1~pqhyx(NLK2h zT$qn!qgL9ilr|NN1m7*IL&IJ$HkBC9OXO?x5r`i zID8%_PB@N!9w$yXPMmO@S{#477BFy}IN>EU?IkqrB{c0NH0>oc?IkqrB{c0N>HKo= z5}NiBnl=g>qp&dw8>6r>3LB%aF$x=_urUf7qp&dw8>6r>3LB%aF$x=_urUf7qp&dw z8>6r>3LB%aF$x=_urUf7qp&dw8>6r>3LB%aF$x=_urUf7qp&dw8>eC8G;EyK2)i7d zmOd{E2eCb~J1wm?j)2EOM;fQ4+fMgBz0<_orvpcQr(xr?Mr1!T4SFBWX=$=?#R&7K zVg9sKOTUt8IsLzajyX@`k<)nObR$GBQzlV~*;pxZ> z>2u(#{MC`?Y4vWSqr21U-Nqk-H+kkZ=$YVYV(-&L-KSyrbkyVT>8MBB)3lJ&w2;&4 zeNL(HZ#7;UW2C%W_84E~#`r2XCZ1Eln7Hi`j$oVHF|q1&mw!y-o&Rb@8WV3qzR->F zg>Fo|Ipt~4-}lF0X$&65sP&jsPH&US`ALs`W2&$5D(L!-QI|35GNv{&q7=`A##9&m zR&~+ys)g-$%RWOdI72TuLoYZ(FE~T{KSTRJL(4xy%RfWQKSRquL(4xy%RfWQKSRqu zLz_QCYd=GLa)$Wi4DI|3?feYw{0!~<3@!W&E&L2E{0uGp3@!W&Ej&jAk|P4i5rO0= zd5#DqC*~W1oS5$sdR~yDMmcJfBLc}0f#irlazr3GB9I&rNR9|37dQgR1&%;+fg_L{ z5lD^*Bu502BLc}0f#irlazr3GB9I&rNR9|3M+A~10?849g65arM*X zV4QwBPCp%|pN`W{$JI~$SI^(a)kDt-J%1lp-y9Ko{ywhWXWR4larH9eHPAD!arF+P z=kMd{9kxAxA6M`2uRMPrr_GPk=Es@8kE^xo8Cv+bTDYE6OLod%`3-8lwo}-izmKc+ zI^Fa4akXCCp1+T)-5NcAA7}nP9`XErTrJS)p1+T)1={xfeH?8ZM;ph{#&NYP)f$By zXZ}7;TN-EnK8|LN({jdXIpegPapv#iY8!s@Kk;VI-^bN9oQvo0<7ykWe{RIrTGk>2Tx|krkm{4@F7);2g#zF9iYB3@II>ph& zMBou{B6taObTL76F%kH`045j{ClpsWeHwIJF+p50L0mCGTrojhF+p50L0mDRxI(`o zqL?6}m|(1&i2M)IzXLj=m{3Gv{9Diw#e^aXqoark@oaPyF+uz=A%>me_+f(hVIt!B z;6&s$_|Lp&9o#fB+D&^#7mR3v`M0-N!r^aIyQ-d zO%i!d(z+&5m`Su{5>=TbE}Ep}OfoJ{GA>UtE>AKpPoe{pM4o4vahzqwah7M!^2|BX z&yjwP^mC;9cEXXsw-XB0mQq50BhCkoQS+?&=G9JYdsRQLcH+N!MJTVa)#$#T*XU{V z{439@Z=O}(JgdHWv8UgvohTQz6QjQo=UMg5v+A2?)i=-TP(I?wA+OQFZ~HE`zdq#E zew^;F4|%m8l|&UfkOD%3GdQ-#n|nc_Pm|tG;>S&pfNXd9m&1 z-B0tZ`sUS^lp@B?3H^;YFWzkX>qDMZBi}GM68MHeAsiOqumFbzI4re9nb9+*X_RdmWt&FXrct(Olx>4;}c(_-6beVZ1;wmr9< zW~MMLZf$$UF-_l}M(d{0x@oj-n!Z1c;!UG?(+1Mc6LFb`iFVuw8`hB5W67y9nDw*e=3$5w?r4U4-o-Y!_j>2-`*2F2Z&Z zwu`V`gzX}17h$^y+eO$e!gdk1i?CgU?ILU!VY>+1Mc6LFb`iFVuw8`hB5W67y9nDw z*e=3$5w?r4U4-o-Y|ls^mV+7TgHZk2=pALV!QX3L=oR^*M_4Xzz9Nsv7H{W-9t~d+ zd$wQ4_Db?AinxqF0sjG9@iXirdWC&Nudt8k6|t?iiEZO&{G{0SlYfPs0@Gj{=zY1b zC{i+xg0J$t|HtPQ#WqH-GrXdBMyMFZ_)f6GPby+@%5Q-0R>~Z8pQG+`)P0V+ze@V6 zq`yk~tEA5pXU-F0&J$tI6JgGykn=>C^Td|(M33`CiSxvV^F)U8#Dw$2f%8Ot^Td1e zDBC=mHXkX7?fFO%^yn~86gN-&Hc#X>Ps}!tj?ELT%@e216P3*qmA!@s&r{~}l=(bm zK2Mp?Q|9xO`8;JlPnpkC=JS;KJY_ylna@+^^OX5KWj;@t&r{~}l=(bmK93ror_ARm z^LfgAo-&`O%;zcddCGjAGM}f+ufzQ7F#kGp?bkIDEeEe_Br;wX8?US6wr_xM8S&BU z_~>=!fUj$mar!CH>&CBZ9C6B7a0>Lw@arnA)4jU;y2cLM{x6l+HC`BhZe%v}IGGC(1mnick%6y43U!u&HDDx$aq52hNzC@WXQRYjO`4VNm6mgj^ zQRYjO`I30{uUzI!l=%{6zC@WXQRYjO`4VNmM42y9=1Y|M5@o)m5p6lRLchL3zrI4h zzCypgLchL3zrI4hzM?jx=hbG6?$=k;T8!@3SLoMQ=+{^1*H`G*SLoMQ=+{^1*H`G* zSJbZbTeT~r`}GyIE2I1M75eoR>7n23etm_0eT9B~g?@d7etm_0eMOq4C+XK$=+{@I zY3G8gj38GTL9VJ^i@{aZ$mm(mRdoI;I)7DVbBgDWSM@gIyM@>A={08Bq={0Y;czXlh-X#4^(%&TgP10{DJr&$gx)6`tkVkrCUzNvi;E@}u>4@wbq`&2K zy+P0G4aS3F<3_}*Pd8Y7y1|;#4Lo&2p3>XoDdTB=I|jNZ-jLUve%9|74@Rr>4S2YL z2XBZCr&~#GXnn@G#vA-!;Wy+*R{Y7Z zYPv*Cm#FEI+TOWfiJC4^(Y7ZYPv*Cm#FEITCCsWnl4e(C2G1vO_!+Y5;a|-rreSla7$)zlbYUC zO_ya`?Qc@ko2sd8tNl%S8TV-h+@~q@H^-awvYYg>o7Cbaz3irHp?UQtNttib%Wl%kZqmzc(LQg{K5tRxTa@`0Wxhq3Z&Bu3l=&8A zzC}yEMN7U#nQu|%Ta@`0Wxhq3Z&Bu3l=&8AzD1dDQRZ8e`4(lqMVW6==3A8c7G=Ig znQu|%Ta@`Hl=&x=`6ra*CzRx;r2mxkpOXI5x6}28#o(uU!(y<^NU_XFvCK%Z%t*1! zNU_XFq47{WFEdgs2OcSw87Y<-DV7;2mKiCQ87Y<-DV7;2mKiCQ87Y<-DV7;2mKiCQ z87Y<-DV7;2mKiCQ87Y<-DV7;2mKiCQ87Y<-DV7;2mKiCQ87Y<-DV7;2mKiBl=xZzV zwH3U%B5(EtEA+J$ytzVOTcNM5(AQSzYb*4%75dr=eQkxlwnAT9!OJW3wH5l>3Vm&b zzP5tLSLkai^tBcG+6sMbg}%0e_gCm^D|ml}zP3VNTcNM5(AQSzYb&&Y723cGeQkxl zwnAT9rKYRYbd{Q}Qqxsxx=Kw~sp%>;U8Sb0)O3}au2R!gYPw2ISE=bLHC?5qtJHLr znyymQRcg9QO;@SuDm7iDrmNI+m71Uw;3yMGgjVK9rXs)(daSaHg&wM+S&Ggs@sf}w;3yMGgjVKy_C*a zd7H8FHe=;&#>%&dXWk;7d5d`FE#jHCh-cm+o_ULS<}Koxw}@xnBA$7RcxFv+NCj(r z7hBVNWV5=s#(MjjX44Hy@prMcz^hwptU9i->bS;tu{FMnt?^xKjqhS>Dv96YojGf? zs5QQetp)xrw#Ij{wZLm!Ybvdu^v;~Mz~4C5#JqoX5!*X+*5n1JcxTR<+NAOSC+Ype zqq^>M-kM<`h*sMn4xTroA$!D6RTPugod(T&$S( zOl*>0f>r^s`$qBQTb`MFq;=VC>kixqh;R^+)@ zQEcm9V%vC+&&G4HA~Uf?+DMV-Vnv=B6jdWWvd8D-xmc0sVnv>d6`8XwN?ksWBad6=|VGo{JR&ugod( zT&$=ztNZ1-STUgX1Fy^}GD}>Ps(m)EGcQWpPWw%PqT0Cs<&`-_wQ-{(hoaiJ(_WcV zl>UugnNwswxu~|_Gk9fAQ7yu0k7bHH7b|Ke#QA_GXwHoK68J=zwH8d6>**-&Qs)BNl|T9XW&^$Q7zYLM|4FTsmODaqFSQvi|1lR=EI9> z-9FMQbBb!?PJ3leQLS}PxktP{|xK`J;T4mmqM3PyGic>{r2%vYA@)K z=~C*Sz|VtU03QPnfPQ&OOapbp1pC#?q zx0E_Z`rD*E|ID7?La%UOPjI1oF7^Z$di@N0f(!kGWhrItEv5b)^q74q<%oSrUt%%( zOQB0CNAFAeMwZdDD@*Ar(C;%YrE5UXtFXhk(6cM-GcH_3y3S?sH5>LESK2FWmeTJ4 z-vu^+tzaA24t9W@;734zDRhZ1g)XK4D`);F`RFQ*u4pMsw3H>j6uP7@ljvW3DRhZ% z>9FIua_;tj`BLZ-UkY8y_)DQn`XZLDnJN{iV<)z7)EoFJd|UA@Vy&f0(qt6uOkTmGo`kI&eL>0o({~0%=ox3y6K# z_1~@B#UJqNACmqf(tk{v_LZT1WoTa++E<45#g{^tGN0hcF8=jN(sz;mbJCw8{b|yF zLHaLA{}t(9bNGLf^BM5Jf%kxZ3ctjcLbd06>QB~BL*>mEQJtt0$f%cp@ zl?UxPamvpzV>~CubK;aeC&qK)lszZLbK;aeCr;UO;*>on#&hD7Jtt1tbK;aeCr;UO zVmv2K*>mEQJtyYt#4(-|>$`l;x97yENzk4Xr~J%4#&cpkC&qK)lszZLb7DLv#&cpk zC&qJPJSWC;V!los<2iBKo)f3Nc0I;(;&d%(drq9T=frqUoW6;)JtxL<;I#{3(tx1oEXoE@thdXiSeA6uM@`^drq9O=fr%kEY8?-;*32f z&e(I}j6Emj>%=i%CywW37(VSISEH5cus=nBzR7O=OlPeg6AZ7PJ-tocus=nBzR7O=OlPe zg6AZ7PJ-tocus=nBzR7O=OlPeg6AZ7PJ-tocus=nBzR7O=OlPeg6AZ7PJ-tocus=n zBzR7O=OlPeg6AZ7PJ-tocus=nBzR7O=OlPeLY$M}ISFx2g6AZ7PJ-tocus=nBzR7O z=OlPeg6AZ7PJ-tocus=nBzR7O=OlPeg6AZ7PJ-tocus=nBzR7O=On~A37(VSISHPV z;5iANli)cCo|E7?37(VSISHPV;5iANli)cCo|E7?37(VSIZ4`{li)cCo|E7?32{z> z=OlPeg6AZ7PJ-tocus=nBzR7O=OlPeg6AZ7PJ-tocus=nBzR7O=OlPeg6AZ7PJ-to zcus=nBzR7O=OlPeg6AZ7PJ-tocus=nBzR7O=OlPeg6AZ7PJ-tocus=nBzR7O=OlPe zg6AZ7PJ-tocus=nBzR7O=OlPeg6AZ7PJ-tocus=nB*Zxho|E7?37(VSISHPV;5iAN zli)cCo|E7?37(VSISHPV;5iANli)cCo|E7?37(VSISHPV;5iANli)cCo|E7?37%8I zb1HaF1<$GAITf6wg6CB5oC=;(vF8LS9l1xS86Kg&h%S6DX+@h#zaNx)E3H^jxVbVY z{IB3g!QThv&&t3~c?&sPN&f-qKP3G}r2m-o$3WVhyvYBe-N}ob{xgpJ1nDl)pCo-3 z=|3m^Dbln`d6DlC4*eBkrGL$#zVxN^XTbjk>MO*`(N~Ct`U-K7wigLC<`OFY5i0%> z+F{c6BB8z_CDfQpXfFyfpGD=)ViOVQ)86_^G#ATGYj1reo;xbBH zMv2QPaTz5pqr_#DxQr5)QDT++{QjWId;AH12V4(sNUc`RX5Ckn{Ctn_qu}p@TU3u# z_<0q6UZoh)$Jo!S6hk^~Kd({@X|$hLDTZ`ekAS;D%}6V!57dmb(oazCmpH>Pr5^^5 zfabhPE^T}o)OS3TJ`R2v{0jIC_|Kr;hte_Qpx(b$`m5mcpk2C3@uAT!U4=_m$)$Zg z6O{5Y=~qZ==2`i#lKvKFcpdyUs5xi-`mf;kK|QTd&LnsqoC1Fe{yQa3gEQbI(5_pB z>sH~qRk&`I{8nd^(;Dl*n?Sp374BLkcXe9d)f8$sWTAEr720X5aM~)Iwn{OcbL_NL z{@%OrHjZ59TF@8hjoJrUh!W(qVqPBW($PR#dt560m*Cyte+U1bBOj2?tMmmtV=p=S zN}l=Du`2zK;Qs<22M==%deWp{_3oRHT28yKtkV3p z^QjBXZ#(^O90T*3-}dpp0DlSoin275ulyw#h{43D{!l#7gH)*p(J|^lbXDp*bRPPS zs^A{d+xc||_)z7Fe%(pFBbKVbu}YO@!j1m`o&-^;o>@3w&%cEFijnZgz862C5ZcYE z{G3AQ9=u9(=04uNc2!`PtJ3_rbMzcac-`n{3PP=N5$atVp?kwBJx4IEBIoU-e-qR@ zddk0=!@UNjo>D5Gq?r(1MrVPd`Uf>kJnc>g^mHL z6k{7d1^xv{ZPJTXW!#HZ(Ti32Tlz}77ptNdtD+aH%51YLGWUZ!K<&P&-ph^};;12x z8m8>1Vakpg;;12x8sey7%B?BXsC+``2sy-2)eDkuM-6e*5JwGh)DTAvanuk;4HX-^ zTsvxrqlSu&owlQf8gaW6J8GyAx6zIoYQ$}{qlP$Ys1di1JPz7XL&d#DJ8GyAx6y4a z#8E@Vy-wRvLyfqNcGM6@4RO>EM-6e*5JwGDcGOUDugkTghB#`dv9`}(M-4T;Ho6su zIBKZ))@eIxh@*yzZ=H6#4i(=T?Wmzf(?&aLs1dZ$jvC^qA&wg2s3DFT;;12x8fv7h z^Q7&lA&wg2s3DFT;;12x8sexSjvC^qA&wg2s3DFT;;5l^7E&$Xs3DFT;;12x8sexS zjvC^qA&wfR?Wm!?GHSG=hWe)Hq|lBU;;5m&BdW9=HB8%4LmV|s+fhS(N7QIX4byhi zFl|Q-anvwvM-9_<)G%#F4gKt1Xh#ik)DTAvanuk;4RO>EM-BDF&_~))LmV|s+fhS3 z6L(p5)DTAvHLI#tpm{7IjvC^qA&wg2s3DFT;;12x8U}XMFtDSBfgLr(QNzHF8sexS zjvC^qp`I-|AC=;$A&wg2s3DFT;;12x8sexSjvC^qA&wg2s3DFT;;12x8sexSjvC^q zA&wg2s3DFT>KUc3LC+|ScGM6@4K=>dUEru8jvC^qq2@ZAZ$}L^*Wt7sHPraRId;@g z;|r(lsG;UMoVKHe8eceVM-4T;aN3RXgS>)hUmvs#6{-Rcp4vsGT5$nk5$gj>@V|`Ch71zL#pv z3HX?Q0zVIGC4+Jv0}p_M;1Fjx2p$5z2tL7iUgMav;5ksM3v`}0z@LE^z>7wWi;Y@= zDO?4v2Hh`IE2=lX-{((jZd~|5P|x6$_FPJJ+H)z@+6_T>k#-$bdoKy0XH=@wpHU4~ z>zl(yeWPBuonLqGYY*wa1NU&ALmcx2zaAy+If`nn#xd$UNJ6c(5PrS#DWRRYS|bbp zI?Z{0eP2tYV=yrWDbRguwMNrAKKS2VqSmfB{h-el^pf7iF*$HIIelP1H~{VkkGXV> zVtj_@z*C^Up`;wov{dVj7?-GTC<$L6|3&g&qQtL}&%FfSApHvXD)(NNc={vx!;2(m241Ns!IQXaFCqU0X zRBL|E_-PRKGO(BVKg?m~{{sJS@V|rq1N>`n8`pC`xC8v0t|ub)h=@HRVvmT}BO>;Q zh&>`=kBHbKBKC-gJtAU{h}c6TbDc9{G#3$jM8qBuu}4Jg5fOVt#2yi`M?~xq5qm_$ z9ucueMC=g}dql(@5wS-^>=6-rM8qBuu}4Jg5oylN*WlPABKC-gJtAU{h}a_{_K1i* zB4Uq-*drqLh=@HRVvmT}BO>;Qh&>`=kBHbKBKC-gJtAU{h}a_{_K1i*B4Uq-*drqL zh=@HRVvmT}BO>;Qh&>`=kBHbKBKC-gJtAU{h}a_{_K1i*B4Uq-*drqLh=@HRVvmT} zBO>;Qh&>`=kBHbKBKC-gJtAU{h}a_{_K1i*B4Q8irDL5Cdql(@5wS-^>=6-rM8qBu zu}4Jg5fOVt#2yi`M?~xq5qm_$9ucueMC=g}dql(@5wS-^>=6-rM8qBuu}4Jg5fOVt z#2yi`M?~xq5qm_$9ucueMC=g}dql(@5wS-^>=6-rM8qBuu}4Jg5fOVt#2yi`M?~xq z5qm_$9ucueMC=g}dql(@5wS-^>=6-rM8qBuu}4Jg5fOVt#2yi`M?~xq5qm_$9ucue zMC=g}dql(@5wS-^>=6-rM8qBuu}4Jg5fOVt#2yi`M?~xq5qm_$9ucueMC=g}dql(@ z5wS-^>=6-rM8qBuu}4Jg5fOVt#2yi`M?~xq5qm_$9ucueMC=g}dql(@5wS-^>=6-r zM8qBuu}4Jg5fOVt#2yi`M?~xq5qm_$9ucueMC=g}dql(@5wS-^>=6-rM8qBuu}4Jg z5fOVt#2yi`M?~xq5qm_$9ucueMC=g}dql(@5wS-^>=6-rM8qBuu}7BJBTMX&CHBY? zdt`|{vcw))Vvj7bN0!(lOYD&)_Q>i<=wOi5lTf2$kF1`A8XbFNQ;t2dDaRh!lw*%< z%CSc_<=7*urvN_2u}4-j|3=3iSz?c@X78PL?2%2mkIoW%WQjep#2(qSV~?z66tyD- zu}7BJBTMX&CHBas9eZSnJ+j0eSz?bYu}7BJBTMX&CHBY?dt`|{vcw+Qv}2EK+ObDA z?bsumcI=VWyrs)^?2*;%rPGc*vcw))Vvj7bN0!(lOYD&)_Q(=@WYfRCFUKBP?Vn|I z@0=y}$ZDqsr`>yIi9NE!9$8|KEU`yc@7Ven#~#_hu}3y=?2!!|dt?L09@)ULM^-ba zx9?2#q*$P#;GHHYsU#~xW?k1VlAHsjbMn{n)s%{cbR zW*mEDGmbs78OI*kjAM_iW|FnjiS#fj+^#WNgES!YJ{rNtQ`$8^sQm(hj|YB!^l{DS zPXu==e~-{JQFp4}G5#fZH~1Ny?N0SR&Ud+YN@Mz0`fqg3JJlZz3Lj9^dZ+i-5IzV# z1UlxtlfLOr^-VrT`=JQ?K<$U3wDv<0y58?p-(>t8_>bWK%dh{7^yf)yKNKBv0DPSM zLDEA;-IuOY_hr<&!JtcT4csr(YF?qAmUhWQjM~pm=s3SiPGa;Zrb`|&DqIhG{L;lU z%`SO}kMT3jF7Ib2^fS#ad5F=^G`sMME}j^6$t#@Wr-WTRAME0JUl&jMx_HLdC9lx0 z@(QD$+;zz-jDA|zg;#Xp68q3ujoJqqY54sXO$1>aS9t06&@fjM8_3e-3^Me94$@@-gXV@VCh+gKrsw zTb&<#1pGAk7skwI{cGkQNdKeoZk6~M;U_?scsC{9opOnHr(ELQDVKP+N;EcuF7a-y zZ8W;XyH%p`BjBgOzc5nb-73-Pe-z#W!}q}OJurL^4BrdG_rmbK^7$*ly^7){h5Cwx zP%8$7$H7tX1o#}kj*<2=mwVGMkbVjLI`}fjyb5YXpN{zzpEhBS1g35Ipzh@T#3J{pnSKcdlkzW^^F4I4@heb zq0&>}PeDH`zc+Z3V-~-n!04^Ikz2wpS73A=YGy@QG% ze>W(68@R?t@{Dquu6a+eP1h{+J3&IvOKeO3RA=7icX@<*OIPSPVVmDF3%2Q+b-b?G z=)Pl{--Qu+c63|tDEK7kd4_HD?AwB`^55sdGyLkFeVgAh6KaL3@SEg&ZN@ggZz9xN zy28t(e*qRbgJ+w!1u;-p&ePBO00PY8$15bfp1HS>j0=^1bIiFPoVw?l#!NjOhhH(YxKH{^wPUB6&?W&Rc zh3?n3OGSgiqoC)JwsXzfr6uRT3|dRuxr^FQK9?m?ScEa z?ZFT@0(v#hcEx7ScRaQorEMo3+fF>TT}tyY=54!_=Cm2uuD0y7dDyOa%xSN&*)9bd z&Bk_rPg^(xzD2&-*q+INH7?O_{0ZMi+MH}xJJlJ`>JFIM0W&)^R-FuXXq0N40XNcQ6j!p>e2ltm+-8dWXiOPVWWx zf!6sBjZBT!`3{Xwo&IOgGif`ddFMP2TJ1Z;m`nc#XtnR~`-Z|FlJhgtS3x_^4vkEW z*8GmZn%{xucPNfkT4PoHs!^(OrP|{TY03C@ay)ysLu1v+pd0qOVXqrqb)&0p#t7Z$ zsvBK(qpNOKK6In2ZgkZRW8E;;jjp=oSA#(}y6Q$(-RPS3T&e2VM1`s~&XKgRXkeRgdO6CW9XQvj<)EpsOBq)q}2j@X{W1)q}2j#M_|$ zWnJ~4s~%jm2VM1`s~*jM_{`Q-k7hiK)>RL>>OogM=&A=@^`NUBbk&2ddeBu5y6VAE zd(hS2h~X>2--z2Q!QYYoJJJsjy*xmF`T)J>14I-LNG(@_2c#CGBZLQt5FXHfCxZv{ z-^t)X{r7%htx+-0gz&gr>p{(2Iqm4;LHg(i>7yUiOqBkmQgpmZF>d$q^wbY3y3p~8 zE_}>+@~6O`8s)}D_rDJ+LeP=)=?^M4aN0flLsG~Up=02O=p`SLDxCf)=w9+6slquI z!5c;?!RToDq2Ng$quO+O9CQ!(km}AkUjx4Zy4QP1wdQ>HdJn0NoYs3-!Wc}9^mh-@ z-#w%{a*p1^60Q~Y!hbLP_o}@shv>0at={RUb>?28$6m4O^a;?>W3L!?j-$t3qQ_o; zl}qWbgN`11{Z%fZqsLy=g3-}qFLm8ZUH1|__7Xkz5 zd4-E*eiwT3kWD=Ckok#LUy8% zohW1{anw!}vJ-{ulvn6qC}bxJ*@;4SqL7^^WM^Q7>_j0uQOHiUZvV>)*@;4SqL7^^ zWG4#Qi9&X&73)Y8vJ-{uL?Js-$W9dEohA1K-dR$p=;(^@u$*Ll=K+*Resg` zjLP>4+g<5zk=EB-m3GV8B@H<39(fnexeK@4rMq^H``=yunyb*g@Gi|E`)vA}t59Ea z4ZN?Vu0+Z)x<}rns7%L5MYCnI4tY06d)jv$De;9{+7>9fqhkTf}`7mwsVZ8BST=8KX?_sq>=9ID8niX5uQp^BV(+Xq>=9ID8niX5uQ zp^6-RaSm1FP(=<^mZASNKeY!Rw z*Vf0i_0gmC=?b0i`H(((v_5*YK6!U~OqettbN9&_U>!U~OqettbN9$8Otbfs?_0gmC z(WCXzqxI3F^@(AXLXXx*kJcx)^&KC2w7v9bd+E{k(xdIAN83w}wwE4lFFo2`dbGXt zXnX0=_R^#6rAOOKkG7W{Z7)6AUV5~>^k{qO(e|pns9buqz4T~%>CyJmqwS?f+e?qO zmmX~|J=$J+w7v9b{V1d#h4iD4eiYJ=Li$liKMLtbA^j+%ABFUzkbV@>k3#xUNIwec zM^`D5M{S^rMh|6w;4E`cX(f3h757{V1d#h4iD4 zeiYJ=Li$liKMLtbA^j+%ABFT2^Yo*TeiYJ=Li$liKMLtbA^j+%ABFUzkbV@>k3#xU zNIwecM_Z{@P{=+MvJZvqLm~T6$UYRZ4~6VQA^T9sJ`}PKh3rEi`%uU}6tWM6>_Z{!0UfXh zbTEKI22jWV3K>8l11Mwwg$$sO0TeQTLIzOC016pEAp@+Rhu2wmKLIzOC016pEApppXF+GJrw` zP{;rZ89*TeC}aSI44{w!6f%H922jWV3K>8l11Mwwg$$sO0TeQTLIzOC016pEApwz?rPVx2t9ca9e-zJu6wiMY&)?6i-F{~6_NPzlzx$b~ z*iZbhpIN*8%-Zc&zpr1_;~PC|w_m-y(X)2@)u$UhYqy_%d_Vp8e){qK^x*rYF8?|U zde&~g`eLK!6ZSJ}x1U+N{nC|legnKo_<4U3J@~x8h#q{NUq8>UU!aYAfj065l>Y^k z@13|u1MkEwlny6_M?udOKPE*PUnb`#pl9|T(;1YnGZ;Nr{FpQ|A@p4FW73I_@l4BO zQj34}T=8SljDPi9@ncepb6x~JSNxbXWAt3{W2$SR>UU7+x#GuEr#fD3XHpT8=ZX*L znuWCY18VPsN_(#O0PX#N>Sa`E&lMkFKIDL|S;y;|jeqU)1fEqp!0g8X<~k1G0|#{F z`j@WR=(*wpn%^*b9CSd}?0nA^A5h&HJ$rUQahK6!q64Zy=X=zAAn=IefLy|7@Vwap zxrEVk#RqVS1GvNi)tAn!`Z9XP>~Ze_B&;>cANB}+ZI8SYjr9>kvqsf$7Uc@Tdd#GeP@e^C7EJn%n=KM&&1gZT3x{yYftgD^jcKM&&1gZT51 z9AhvT@|To^9`y`q&-oUiX97o)sV5SL@?Ia)L(bpw>)(_1v;HC6bx30? zpTQnGq_LILcG@A0t(>;s4ry%Vv|V=y*B#Q>$~k_rKP2Z+E$Ay}PJa>foY+wCCD5~c zL;A{@@oA1c27ZMc&-)DpCqO&-kVa=dv;BNXqcf-Vtuvv$Vkmfl^w+qrZ-6iJUytR7 z;^;nf|<|Y9%@KqL+7tCGa4Z}{Z7zcaZv4ULg@L=gK{&Y z$L|N_X-<1q=V03NX$Pfqquuo&WA=m6r;br?Zp?!B_*d!5Ii9OI$awr9Bk_Zb!4ER- zKFBEhAmi(U;@ro3&g3BD;)9Hc4>A@$$oTglBj1C%I~~br_aLL)gL1ry;E){87#Y>8 z8izH{b4Y!w)1J>fMBjQyeXG;%TMrRS9FhkrE%#Ht+|TG9_7FYnA$r(D>S3LKoFhG^ zJ46qANIk6oTL51m-#zRhMP)w2*GRjcJw()Th~D;)6y;;w=N=-)I7DQ1NVTam6JH%t zojSb+bT9lx?(vJ<;}^NwFLJeCL<3($1MFNMJV8vt{`E>bcJlu96GGp$cd;K8`mWi_ zUid##zbAZ19?rh@LbrGJwHLaLv#-6-G1U|B!0z@+yCpsW8&9ZraN0e!ce*#e;&SP) zpHRDV+P(G@V!*$;b+GHb&@IBd-YcIwVyAnht>Gt#L!Oi}uLMs@lg26V4bU_2PfD4_ zUmE3m#+{(PWUlmHP~VGF`X9iP;6H<&hkueD?MYpm(?0{Rf}Ra{Qff4Me)UOd(wGGu z6Fv$5PfD52|4rdj#K2Dx13yK?`xFuHQ$+hu5$!)kRR0uF{ZnY*DQf>q-Vq=ertcf3 zHizlshN;bAYIB&{9Hushsm)=c;$doYnA#l1!-uKOVSIa-+8oBKhpEkBYIB%4d6?Q9 zrZ$JE&0%VDnA#ksHixOrVQO=j+8m}fhpEkBTyB`!9Hushsm)>d8KyResm;UG=3#2{ zFtvGD4s#_qOk{GH+B{5c9;P-AQ=5n7Cpw1OJS;zP+O>IDeqwZO9wt6HOl=;fHV;#q zhvhB))wOw;+B{5c9;P-AQ=5mm+QVG!VQTX*wRwcPI6^HPp%#uX9y!7o@CZ(F1pbdO zraJ=jM_~R4%pZaIBQSpi=8wSn5ja1>IPM6JafH#_5ncaea73IB3jI|52&1_px+CYi z?HqyaBd~o$e&U?O$e85_W0oV_(Gl+G2>c)M9#6qheEuj7e-wv5io+k}UXF_YNgd-E z`=iXh9>vd(;^#;4^P~9rQSt9%PJ*6AKgwMk<@%4JmZRw8C|7iyBLB05%?d0{}K2f;Vwqte+2$V;C}@EN8o=1{@Keu zU>AF#d)TMp|7q@pUF?-({@I~k=>GI+__$!=KpEVH6nZ@M4C5*Gc~{!wsb?5ZdAIjHN_#xz z-QJB~^}ncPc6(Ra@xwEWr@ZI8(~gW=kEht@UFh)?`@9Q1p7K8LMvtew!@JSrsb|t2PkC>5|JUOw z@9^#%kEguDyVD*|d53qWJ)ZJD?@oI>^-S91Dev&EvoW6X4)0ETJmnqUjUG>Vhj$<8 z@s#&=ciQ7A@9pkmJf8C2?*7%|DevuW>?OzJDfV+0dOXE`?m~~J*w0<)@f7>H3mtKJ zCwJ#~JoOCYDevd*w8vBI=PvYk%KN!H$8qm7jHjLnJf8Bd?#>wnJ)UA$ccI5q?CLJ` zc#2)!g&t2m!+454+?Dot%6qu`zaCF{4|k_Mp7I{QWi((XnXRgDtuj54YkCFU8G+OGtoQoGTy>!`G9^r%YT%h5IH%Qv8P zsJBRcesnlWL^R4cYm~T1&(Qo|smSQKXjGapIxZSj%^E$<8WqD%I~E!x78(_AN)rW* z5(SMi&KlL7I^WUkDC4YWHtm&)&uX0Y`@*lQ9-q}X%Q-(0 zGtc6v&!#UrEsxTFy`-T33&9fS3>0gRSedL(WrdZVJJoyFi1@J}kU*ZfN zXFaQ4!)J5U^sMwbA++~CD}6fc9`IT9AU?(s)U)a@oOZnQtYUAKrP^0niol)z4bonP z_^jg9(cpyc{eGd>XP(e~4GO)&;e_r>Y2BCdbzjE6c7EX5&J)abo?y1~gzn2ndYfvWBHtFVN!S$^f>o9W{;m^ zl<^#+jOUmieolPqS4JGqG2(cRIpOCRcRa_q<2h!1PtvEHq)$1?EZIrjulDm`{_tel zGhHWj@6Pf3;YsEXPtyCGr1v?={NYL6uYT428to@1b*D~yv~^NqPT_T@sF71dAg72xP7#5eqK-}xdz>Qn zIE9~_!cR^SdyL5+_Gre+>Kc0(gV7Es`!7<%c@I{Lr`z^s1pT`JwS1pH2O;k95C0MjISc@9Z3}BN~%i`p6z~ z{ucau@FCE>^O(HUN4n*X(Q?O7%b48N`F-T?CEZVYAL#+okAm*6$K<^}{tKMhZzGPW zr#3#xukNYG)Kfdh&N+tTjj4}zn%dW#r_-ME9FvFpY@TTulao8`InOb?aZFBPPM!zd z%Er{noa0&0F{#&RHy$IF9+S8D3?5OA$zhy!8yxfg4njwCW9li))xVNPKhnJO(TsX+ z{|lX{*LGU_I|$u=$Cw2j(^DALxcYAY>sO#htYhkTe5B_>$JF~c?U|o3^+8U1E_6%| z;OqCBP-AicqkHo)@9!WCz$zb!8;q&N>A&i~jCSBL^sfW9rR~t9)PH-$Ce^ zr7`t!KGF_9rk>7euc{hTf43(Xr#By`Hy@`rAE!4Tr#By`Hy@`rAE!4TS4+7PjMJNs z)0>aen~&3*kJFov6IG7Wn~&3*kJFov)0>aen~&3*kJFov)0>aen~&3*kJFov)0>ae zn~&3*kJFov)0>aen~&3*kJFov)0>aen~&3*=kcOEE|kZG@{9}ej0p0K2=a2F(IAhn z=5e7sV}X47EcqS_Iga!5#QAyR{5)}fp4dK5Y@a8#&lA<> z1W`BI3{E5W`hu7oPZ=+#pN+Ejry zRiI53Xj28+RDm{CpiLEMQw7>ofi_j3O%>F$PXqofi_j3O%-TU z1=>`BHdUZa6=+ih+EjryRbVt-piLEMQw7>ofi_j3O%-TU1=>`BHdSCWU7$@BXj28+ zRDscSfi_j3O%-TU1=>`BHdUZa6=+ih+EjryRiI53Xj28+RDm{CpiLEMQw7>ofi_j3 zO%-TU1=>`BHdUZa6=+ih+EjryRiI53Xj28+RDm{CpiLEMQw7>ofi_j3O%-TU1=>`B zHdUZa6=+ih+EjryRiI53Xj28+RDm{CpiLEMQw2uB1=>`BHdUZa6=+ih+EjryRiI53 zXj28+RDm{CpiLEMQw7>ofi_j3O%-TU1=>`BHdUZa6=+ih+EjryRiI53Xj28+RDm{C zpiLEMQw7>ofi_j3O%-TU1tQo2ZK^<UrAK^R%hwX;aVBrkom1|TJe?BFM{^Z)7158 zMwh2m*Z$R`%hQb1PE)6+;r}$upN8|(uzeaPPs8MCcss4AV=_2HEOCY?;tWy58KQ_Y zx}z)l)iVQU)b51D31^59&Pe~x@p%7?G;j2H|BO^>^mzY_^l9`s>x{0==&}D9qJ=X= z3ulNH&gcr2Pt0(JnBfdpdxon$L*#IV$l(QQ;RWU)U*MP*IOavhj4v`~e36mhi;M(c z;`o<1{w0ooiQ~V<@n7TkuW|g>IDSI;6TyV?g^X<{(nrP8gyt6Z2>mQ|f)TFv6DHqp z;!MDmc5Nl+hI4dIok8a``gyKa@srMhUNJR6jVns^nW<~_Z|V``zMxl3O;Gz2nw|C; z%;$vW8Jsq&6PizO+T2bsZk=GESgLNg5h)!a^Kl&v%jOlYj_v}c(n7;#UagqL;i zgTc$XcOiH8vc_MNO8dTE)+k%3`_iwvFQXOvGFSd`;Bn&18U+}w*q3!Z#w9Q|s`OEz z$DS`!;wxfxGI)i#f>)R;ctvbD$M0voA|8aga^u^C-=x;QNv(a8TKguo_A2LjmGivH zd0yo_uX3JOInS${=T*-08s~Y9^Ss7+UgJDxY3XNa<7a8(XVu0hgR?wkIICJ#n$~@m zrwnIl*Jo+hXKB}GY1e0I*Jo+hXKB%AY0+nS%5YZo=<|FX^nB4-Mn-2D6P@KL!&%j- z^F3xcOItomTRy8gbxvYrq<@x?{#k1FEOmO8)_oQ~d|j=3GI(9B+vuk}ud8(%eJ`)8 zbsPPZ=XJGiqo4A;uGVeb3;KPQ*VVd>e#-W`TDQ@6@w#+qv=_aO3%$;jzpj?Lx?1;SaE{h@j@EZhE%!6QIcoMCwQ!EscTUQjP`M+JME_r z=V*iHxa)JY!E@aEIo$Xh44lJ_&%whv+U7afI7dr7$Gx9pzU!RoOXp

      zr!M>9xXd zb6?-4ly7tXZ*zuk^WX2_X5YchzC(?FhZ_Gbdj2kY{w{j{E_(hR$A6FGzsK?4eobPsbo_BlC^KS2X)t&RL z+w;8JdtNoD65;2(YS3wW>3Mmnj>Or13}Ziru^+?Ok6~;I#-?Cw3dW{jYzoGvU~CG; zreJIe#-?Cw3dW{jYzoGvU~CG;reJIe#-?~1dWyH9rvfuJ#mx2;j7`DV6pT&5*c6OS z!PpdxO~Kd{j7`DV6pT&5*c6OS!PpdxO~Kd{j7`DV6pT&5*c6OS!PpdxO~Kd{j7`DV zPhjjPF!mD|`w5J_LH--$zd`;Rij3+?9tuvjr8%(P%CWP*Pr&(t^jsH)pMtsbxphsuZY4^O-M3U1)lG8+z z(;8Fgzr>T%thAq|znG?nnx==EW-ab?@RZM>+A(^De40LMnm%hf@am~))r)_9iL`r- z>EJB*9nfRIX?l%mMe_dDK0mGK-RKp()2y_gW~Kc!EA6LQX+O24 z@u+FsXdoCpjK(UZ8d^P&*fx`@JB=DqoR<(Q~#Jq+X{zSARiKgphi? zKz&_cPV$13>3q-CUkDr(T#yc(cFc1@+B15d@PhQ_^kvdT(o0|rI@-CwT>S-R=PpQf z&hcFR1u5-HFoQy7P{<4lnL!~lC}akO%xJtk8O)%N85A;;wnAo5$P5aZK_N3JWCn%I zppY39GQ(J728GO^kQo#*gFPLN20^izwtG3b}|vE~1c&DC8mv zxrjn8qL7OyPLM{>&UnDBNNK|}LzH}wHh(a!+kc%kfA_}>P zLM{;pULp>>L>zbtXTC%&U&4(q5eHtP)-DkTUJ7=L?MuXgmxu!|5eHr(4!lGhc!@ah z5;b)RcfCY?UBX>2;jWi(*GtsbCEbh9={WEbao{E5z)RG~B|P>Lao{E5z)N`SCEWEA zao{E5z{|vemx%)}69-;SzoBzp=3Xun2VN!)yi6Q;nK3HJ6%fx|~ zi32Zl7niyI%Yoy-%fvsIx$?`zftQH`FKfi-UmXWt=E^S<2VN!)ysS~4@`(fAq=mjo z3w@JT^Cqq4OC}bXm%%hNb6f%!O=26Hz z3YkYC^C)BC}bXm%%hNb6f%!O=26Hz3YkYC^C)BLT;dt8z|%k3b}zoZlI7GDC7nTxq(7%ppY9V zLT;dt8z|%k3b}zoZlI7GDC7nTxq(6!rI0 zJ)A}2y+yu!vM9~?U;ZA>qLia6k#dap_;|&-Dp4xZ^+-iJQW39nJX^RJ>?Z9w!$n2E z&iBmWqGDjD9XBp25_Z~OK3OD&T-38Lm*wx_EGjm3zGoK~6(KwAImSh?ZS-8tqGDsC z*L*H2LU!6~J{P4raV6FHsvIpZN_DWrR^TvQb8GkZ>QQL(hsjz||3Q9JFp zbW!ysR79P&xsC7{~^shJT*CMUHNUJZZZB7P7 z)r-+37HOMB+GbIFI>+<0MV;Arv#^9JN~ofQDoUuLgepp?q9lJ93`!cOToGCoB~(#D z6(yBBsvMuWgepp?qJ%0+sG@`_N~og5_i#$6qJ%0+sG@`_N~ofQDoUuLgepp?qJ%0+ zsG@`_N~og52%>~4N~ofQDoUuLgepp?qJ%0+sG@`_N~ofQDoUuLgepp?qJ%0+sG@`_ zN~ofQDoUuLgepp?qJ%0+sG@`_N~ofQDoUuLgepp?qJ%0+sG@`_N~ofQDoUuLgepp? zqJ%0+sG@`_N~ofQDoUtg2~{kiiX~LBgesO$#S*GmLKRD>VhL3&p^7C`QAQPIR8dA1 zWmHi{6=hUWMipgLQAQPIR8dA1WmHi{6=hUWMipgLQAQPIR8dA1WmHi{6=hUWMipgL zQAQPIR8dA1WmHi{6=hUWMipgLQAQPIR8dA1WmHi{6=hUWMipgLQAQPIR8dA1WmHi{ z6=hUWMipgLQAQPIR8dA1WmHi{6=hUWMipgLQAQPIR8dA1WmHi{6=hUWMipgLQAQPI zR8dA1WmHi{6=hUWMipgLQAQPIR8dA1WmHi{6=hTrqly?+#Hb=h6)~!aQALa@VpI{M ziWpVIsKWa`?+Gfb>h$iPWw_UXemZh3Dia6;^dt zbR|BIS9MnCNh|4p<#?~^tfajvuafqhc|}+2BfYA#lJ*L{iWKF4c~xgc>p+Zl#)fv62v%;#*iu!0D=~bPTv{!Xj(rUe#HVN_`%$ z^s7jvPJ2~nMeG^9sUe#IA8WN*dbykR2D!hMD2^=|8Sk+lk45RzidJ^Y2il_u$ z)mc#s^4Ywqv!WK{v{!XjSk+lk%;SG~RcA%dzl@%btpq4Ut;}ces?JK_XF3(;tSV}2 zK7&_vR@By<_H1p1Rh<>uT}8SzS6+Gh-FCQy)3UkzUnVVV10-cIvdBTvrsE`Ch!Lv!d9{=vAE+twJ$+RcD1b ztwNkup6IMmRh<>ucttHy_rJcc&d2RMcAc zWW4wKpis|@go-FKDYdl;p=R=hKP3Hcr1g%5a^3*75<_XN#1QHojZDg`I)!>iL%0mo zI~q!BHJb1qA1QtMNWF)kehEj((K=71 zwTeI}UlPifgo<*7`jUoFE7OEpD=1XdCsfoY{1=XwJ1MP|pF*wt6l&$CP#P0z<)=_< z2!;Q~zqImGX}$R+)SF*ItsWH0k%U_RDU>4#wf<8$18V)J(pvv1lotv0=9lmn{8#Hg zmDU?WLcRGV{1s`fDpY!&wBGzudV#dw{8CzPeq}P$W`^3#P@5Tfk^V((W>lLxn^&(1 z?{&Fey(Zjl4pqxOvWFbK`K7ep{1WQTFQHsWs5ifaavq`H{1VD}gnIK!s1>0?z4;}S z^9bcRLcRGV)QV7{zN8`4n_oh``6YakW4;9H%`fE~1@$EjrS;~Q@GInKji}OEBPx{t z2=(TdQ2ry-n_oh$Di_Lag!+<(P;MiX+X%I4RH#vaP@@2$Mgc;N0)%oKA=;4J_-tAU zEYzD{LiAv_Q5p@%ZOofikP7wYmr!qh3FS7z{{X2+uWD0{X5fW-^Ghh75o*LF)JjpI z-ux2EXM}Q&>ssGPS!2VXYBAS>_l|Y5U1C$9O`G2Zb6B3N;cGYVC*6ezHt@ zGiE`J`;@kOEOX>0)c8)g7u1+eX{`wnYSbpwcui>cSmp>ysBxB1;~k;KR+(jvk%Ssa z3GE)s91#h%_Csj*SdL39_c{cn?FP$ngXQ?Za>WnM(W-3WMW<;C%e~f4>4)S(%TfDs zbiN#gFGt(UQT1|Ey<9z`|7#sCM}f=L>pA@*sI_)VYpt?SZ*mF0Nxs(FDg7F0jk1-t zDwd;%+Lii6oo20aTCWQGA=0lhdVLpWU5Y9t54?TmV z<2A+?a!y^p)2~R+p<@Z*56IEjS!uH!!gdJTp=XMelNi;qj4MF5rjR=d;Xm|KuuL`l zSHpib{8z)jcf<6r=D!;LtKq*I{;T1?8vd){zZ(9l;lCRGtKq*I{;T1?8vd){zZ(9l z;lCRGtKq*I{=F0BWX5|?8r`2(!~Y7+WesLlXf8{rnZr?`_H-6LEgh~%HM1eGHxg5Z+wjE)W2%gqEM?A zg-?L?{1uuZ)Rm|mIbSPqgjz!-%!36`yG1LfQOS_Z9MLr>DT5g6@S^;MFTMf9SOP&=s0LG`0u)S#IfG*g3SYS2s#nyFE{))_RbJSwziYPjDT?zDzGt>I2+)}WahG*hGg-RHDsYT&j8&D5Zo8Z=XbW@>Pf8Z=V_&oyYK z2DWR^Obwc;K{GXIrUuQ_!2e44UkU#!;cz7!u0%5{VR9u*u7t^zXl5mRu7uB(aJ3Sa zR>IFp*jNbMPs#StQL*c zqOn>uR*S}J;indUYGI}pW@=%k7EWs6q!x|UqOn>uR*S}J(O4}StA)2(G*%0HwP>ss z4r|d^EgGvuW3{kai^giss&TG+FEgGvuW3_0kmb$1# zW3_0k7LC=Sv07@R7LC$v7RuDK4))S;O=G*gFW>d;IbnyEuGb!esz&D5cpI_|fQ z`>o?n>$uZ8?zE13tm7W*&`cegsY5e$Xr>O$)S;O=c&I}&b+A!~X6oRi4$ah|nL0F6 z2TOHmrVg&^&`ceS)uEX>c&kG*b+A{5X6oRu4$ah|nL0F6hi2;FwhqnIp_w`~Q-@~i zV7Ly=)WLHdnyG{BIy6&``AH4Log-dA(itGVCR+}CO}vl`8;Ml-9qqt)EYYVKk+ znpurzR&&iaX+$%cxk)1$p%ijOctX9*O;U)_(c?{?9Tj>Eb(3mb$EcQ#Iq(UN83XlB zf%5fEfzUGyH>r+{=gDz2ev@j%c**%<+ZYPpF7}Kbzr0=ST@m`ow~IHU)--0`F0S;e zxH3LT&KdA^@G@8gwO&!jXuV?Q?P9=K4LTZmJ9W24C64MFA08*JQG3yQ8fq^_k6hNk z!y5769P_Y-n0$@eh;x2Ij>ku9bX7WouFANboCm>OU=B1(Yt#z#U)8VEW28MMTBBBA z)OvWKd0Qj>`^XnbQ@WJzeDk?RYBy>ns?g)jHDc9hR@X?+LbzQ6w`)-E8g#oxiq)A_ z`;(cqD0VH1U5jGZqS&=4b}fosi(=QJ*tIBjEs9->V%MVBwJ3Hiid~Ch*P__9D0VH1 zU5jGZqS&=4b}fosi(=QJ*tIBjEs9->V%MVBwJ3HiihT#y^A67Z4$k}z&iM}h`%e1V zchb+klh*o9>iTBg>6OgQx>KR9-{^k!UCO^-s2ND%E#l-|srQ50X;kSClfD(yPNT}v zPNTy0;0DcUyvsX{3jYcGJop7rE9#Yh02~ChE3tAswtZL1_4uyTIq*B+8{p5t3!v5Y zuCx{VF7GrdTm`NMwJWi5ZUJxe^?0XI;d=0+9HW_7vnnG4SKypMswNKMDRh_-XLh=h^1-XYL0zZ?E*{RLXC`|8K$nZ^8d> z!GAsc*Ta83{MW;Oy?1)e)Wd(hcY0OY{MW;OJ^a_F%zr)n*Ta8(%KX=Rr&po*uZRD7 z@ARs)`LBondibx0|N4~quTPo(`jq*vPnrMvl=-iR|9beZhyQx-^s0RGUl0HF-sx3o z^Is4D^=b28pEm#X@Lv!A_3&R0|Ml=+5C8S>Ul0HF8S`K7onD3JzdmFB>oexRK4bpt zGv>eEJG~0ce|^UM*JsRsJ^a^ur&p!T|GVM;-SGcz_40y!+$gUH^YB3{5QjYGyFHhe>40y!+$gUH^YB3{5QjYGyFHh ze>40y!+$gUH^YB3{5QjYGyFHhe>40y!+$gUH^YB3{5QjYGyFHhe>40y!+$gUH^YB3 z{5QjYGyFHhe>40y!+$gUH^YB3{5QjYGyFHhe>40y!+$gUH^YB3{5QjYGyJ~~{@(}x z?}PvM!G8<@e=GdA!hb9Lx59rb{I|k?EBv>@e=GdA z!hb9Lx59rb{I|k?EBv>@e=GdA!hb9Lx59rb{I|k?EBv>@e=GdA!hb9Lx59rb{I|k? zEBv>@e=GdA!hb9Lx59rb{I|k?EBv>@e=GdA!hb9Lx59rb{I|k?EBv>@e=GdA!hb9L zx59rb{C@!cKLGz9fd3D`e;fR_!G9b4x50lK{I|h>8~nGye;fR_!G9b4x50lK{I|h> z8~nGye;fR_!G9b4x50lK{I|h>8~nGye;fR_!G9b4x50lK{I|h>8~nGye;fR_!G9b4 zx50lK{I|h>8~nGye;fR_!G9b4x50lK{I|h>8~nGye;fR_!G9b4x50lK{I|h>8~nGy ze;fR_!G9b4x557h;s1m1|3UcwApEz(e>?oQ!+$&cx5Ixs{I|n@JN&o9e>?oQ!+$&c zx5Ixs{I|n@JN&o9e>?oQ!+$&cx5Ixs{I|n@JN&o9e>?oQ!+$&cx5Ixs{I|n@JN&o9 ze>?oQ!+$&cx5Ixs{I|n@JN&o9e>?oQ!+$&cx5Ixs{I|n@JN&o9e>?oQ!+$&cx5Ixs z{I|n@JN&o9e>?oQ!+$&ce+d3R1pgm`{|~``2mE)ye+T?`z<&q)cffxK{CB{A2mE)y ze+T?`z<&q)cffxK{CB{A2mE)ye+T?`z<&q)cffxK{CB{A2mE)ye+T?`z<&q)cffxK z{CB{A2mE)ye+T?`z<&q)cffxK{CB{A2mE)ye+T?`z<&q)cffxK{CB{A2mE)ye+T?` zz<&q)cffxK{CB{A2mE)ye+T?`!2gHg|HJVAVfgX)t367ncMjFHh#S= z<&pJmsk=aruWw6z3jDO@i*8GKF7CGUZ-X10lfE6?2$sqB{M&7mavP=Gmier5ew(t^ zQPw)jT1Q#yC~IBHWv!#Ebt#v%jymqwVtxpQ`UOQT2EQ)DQi7tt*5N@l(n9+)>GDc%KBZ(+CW(w zC~E^{ZJ?|Tl(m7fHc-|E%Gy9#8z^f7Wo@9W4V1NkvNllG2Flt%S-(eFw^P>blyy60 z-A-AzQ`YU2bvtFn<;BEWo@Rc&6Ks7vNluJ zX3E-3S(_$Lijt<@E!6o zDl*-GtfrFOPbJ6qM)T*+*ucDANmJ6oxp zt<=uelxt^e%C)mK<=WY*zQ)J9cDANmJ6r$%>b^WYsv_j{7!l z^Ly*u>Q2;|`R1AD`TqF9legZx)u}pf)w#E->vkI|It_?U1ESM_=rkZY4Tw$yqSL@s zbQ%zy2BxCZz*KY^5S<1@rvcGvKy(@qod!gw0nuqdbQ*+;PJ>X0<8WEjFM5hta zX+(4y5uHXvrxDRjo8@gq8ZM8}Wl_z@jHqT@$&{D_Vp(eWcX zeniKQ==c#GKceGDbo_{pAJOq6I(|gQkLdUj9Y3PuM|Av%jvvwSBRYOW$B*dv5gk9G z<41J-h>jo834pf%cng5H0C)?4w*YtxfVTj63xKx(cng5H0C)?4w*YtxfVTj63xKx( zcng5H0C)?4w*YtxfVTj63xKx(cng5H0C)?4w*YtxfVTj63xKx(cng5H0C)?4w*Ytx zfVTj63xKx(cng5H0C)?4w*YtxfVTj63xKx(cng5H0C;NxZ%yE>3A{Cdw3A{CdwfwvHN3xT%~ zcng8I5O@oLw-9&>fwvHN3xT%~cng8I5O@oLw-9&>fwvHN3xT%~cng8I5O@oLw-9&> zfwvHN3xT%~cng8I5O@oLw-9&>fwvHN3xT%~cng8I5O@oLw-9&>fwvHN3xT%~cng8I z5O@oLw-9&>fwvHN3xT&4M!m5_tT2|t9%gis-wb;=YzyoI%Cc$d95x-c412zV{Xtn? ztoHK~*p;xY%8EX9RGbcfE7@isHUqKQP>9VyY&H~Pv!M{14TabY#AYBiGlkg96k;<| zh|NH324XW;h|OFfHUqI4h|NMFwg9mOh%G>D0b&afTY%UC#1y#EkJAmVha#k zfY<`W79h3&u?2`NKx_qKD-c_O*b2l}AhrUr6^N}sYz1N~5LiAKx_kI8xY%o*apNlAhrQ9 zOg-*J5vCre>{NQT2~%%UmcFx*EWKk+R=vR#rrxBiS`Qzlex&Tfu#YH9{empDe9DJf zzOpOS9%}i@?gKj+c3;?Ou+w1=fSn0D8+Hz?54MPGCo$7Wb~&tSZ=GPK6U=minNBd% zNzBkuVn$ij-a5fdCz$CZW@ryFqwGr9R%O9VCo!Y^tz^4_*bT&P#G)IB-9YRHVmA=G zf!GbiZXk98u^WipK&%JwWUMVh<2|fY<}X9w7Dr zu?L7fK zfEWW}42Urx#()?DVjPHZAjW|h2VxwEaUjNl7zbh;h;bmsffxs39Efos#(@|IVjPHZ zAjW}cQwu*q*wn(6onp}EG1ShLzaO#LpEmZY|Pr(n6{rZCnAYD`Dx)Q@ZLZSo#)F@~?rt7M8xTllEK>djl-Jmr8qXg1rOwPT0F( ze+~N^*n42r%5d9IYu;=_tw6I4wTj**1yD752wNlPz<6tMMD6`41GqGnj>>OAhY!Pe;>|Eq?2<)M-)ru>I_QufOFh^=L zv^Ta;l0G8`R?TSj;i{y~ z`lomPABF9i#{z)l{nBM2U_Gn ziyVAz;uuPc97Ac511)lx(jo_1{y~7CAIBQohn6hsHCMM-E;5(<-q7A2uYNoY|L zT68*HbtH}1a+IZWl+7hO0F4?j=(kJAS0lIqijEF{vEJa z!Cnn}4eYhB*Wt|TVQ+xF5%wln`hFqGN4+OLKsu)EuVH@!dk^eyQM-F#>9-r`ocm!P zKxud4oQHt*F#O-cr|%u2GarSoMtK9IW@?Wb21w259H`jPJUO{gm&8KNtb--7RhUkJYlelh$~_~oz%!p?;~6t)Vs2DV<+ zozzd2R*eb=Nd1(rMuh{Ue#%#)!U3q?0I8qaquz@dAoWwedOK!-)KB^9No;`BPxPc*X)KB?pR5(EDr+k;g4lvmX+YQ?T8-tC*s#QG$)DjP%xu*=+ z9A!zoa3GZMi--GK~e=7sga0pndwjne;gsMxG({evdKC zI9B^K_B2k{ewH!HctiWS#suSY?dKTBnR4ml^o*o(e3#?8lLOyFm0KhxO3Z_$31vA+mv zKi4Q1sq^!U7IC}YpKr97!?i!mSZc1;{s@EKxYjl4wg?xgoRZ=vP0W|Q&F^3J#Iu2{rdZ72HdL^v6>;{}1fNZcC?$ECMXoxdc~)gKEd zDrI{l-VsT7XM2Bkg14$a8td@-ENfXLAt?v1ufS)ilT;?Nk;&jCQRxkPlZkLgq&J*c z?X^2oMF__`yuIP|-c=EABGMI=$w-3A9*uk3BZ*{~(w_cARCYw$RUu_Tx;#UQ-knVL z9XMys+O=y7!n(NaRI!3~yLZmNJCandMDYwy?k&nm5iWuoGQ#Vs0LCPGfy_?V@1qY&z4ZF``Bn{UzydgAp-03@`nK zX**0_yI~uB#(E=xv$|=o*SL=U3JuHf(H||shUYV8(cbxVwoSRkC?791Qk$;pgH`!O z$%`8W)Pefwc%04%5=NXlj@M{R=f8xGbs7DXN0_dzq@(RPyMt_k&YVqu|2_w=QAO8B zDF;;-RZ7cPhO4D6gW6kwBdMHHC7C^>B&lOV%Na#!6*EaHO_&fOMlVXbn)ca7C)uB} zplYbfq0U-Q=_^S`|=Np)3GR{SW|yQn6rR;tV@&t8g- zin$wGi8H-aPsNoR=Omq{n5v|F!gQXy_0wxqoBMfW3kkvcm*pPJs{nQFqB_QYQVvOb z8tJ2vYNOUzL@l%yZCvF^|F|-S@sCal^gsD0u4kMHX0i@e2M4reWFC2M6zur?NEt5`ehU=h~Ix>z@hvL3dY z#aJ(kGn@4>hb5R~N!HKSu(fO*ThBJIBiT{xXm$)cmL117vQ2C=JD#1uwy+b~N$g~H z3OkjZ#!hEvumQG}oypE(XR~wIx$Hc4KD&Tj$Sz_RvrE{e>@s#a+s3xDE7+B62fK=0 z&8}hBvg_FO>;`rtyNTV*Zeh2wU$NWR?d%SAC%cQ$Z(_5%**)yH>|S;syPrM4e#ahU zI~n~tCHp;lggwe0V~?{Z*dN#**^}%k_B4BjJK_9olK-ePaF-RvFqSN1NWUs7T3vk%yZ>~HKN_A&c}(XUgm&)FC3OZFA}ntj9m z&c0>evG3Ur>__$wZg9pqr|&N08QjA&c^1#+IXsu=@q9jv59cHJ9(+$el8@q}`4~Qy z@5RUQ@qBMSfluU<_&(grC-W(MUp|#j@4j?d={cs*ap8+ar4^F=(s7xN~*ga`Rj z9^%XRa=wBe#+&)!oIZQ!t^5ey#>0FSZ|5C6!aI2v@8(h7!&mbd@8xlB^FHqI1eZL? z`}rEamapUM`38O@KZ+mCkKxDi9tiErk|^Aq?Mej-1KpUh9;r}ESI>HG{nz_;=< z`C0sIehxpEpU2PV7w`-DMf_rZ3BQzI#xLjF_;!8;zmo6ZSMjU)HT+tB9lxI6z;EO? z@tgTA{8s)eejC4?-$B1ee;55O^>6sy{2u!4*L(SW{C@rb{~dpj@1)=Re3*VY^AY|i ze~dp)zZCfg`sKnW`BVI9{tSPX|A{}xpXV>|KhrPxy+pri_X_{B`~Y{eIdm z`dzKJ`EL59p}+EX`Fs3-`1||={vrPx|A>FgKjEM9&-my33;relioPlR8~%6xE&q;x z&wt=Q(s!F0g3;Gk3i>9$4B??~U&|8NB8R?9D^JjOCeb$wjSzc?J;g{dioR82jQW-b zF;0vZdy5J59{wbH7u+i*iz#AXF;z?x`-$mde{q1AA!dqMVzwv{bA%;)qEHlxVo@SW zMVTlU72-f~keDkD7Key=;!sg3szkM@5w)UD%ohtpy;w*qBpZcaED`~+STuOsLMymr>iFVN;BJ|077kw@s6+L3Lh>2bir_XEpXqGb} zq)3W>u|}*F>%@AoK^!TL5=V<;#IfQyu~BRio5k_s1hGY&C{7Y5i&Mm@;xuu(ID?+W zw~8~xS>kMQjyPAGC(aiahzrF<;$m@$xKvywE*IOxc5#KcQtS{{iL1pm;#zT?xL({K zZWK3(o5d~SR`Dxwo48%vA?_4+iC>G~h`Yr-;cf zqxgqun9Ss+FikVV^q84umYHqln7L-2nQsm=hnpkJJ)6Kv^mBcYwl%^Gsl~I zn-k25<|K0;(`!yPrfXx#q#w!Pm1e7XgxO|>%~fW**bx!R1Gy=L6B%|6pH z6Q(qiX1}?{Tx+f~*P9#6Bh91Cqs?Q?W6k5tjpinEvw6IEg1N;!(LBjK**wKO)jZ8S z-8{n_Ft?g#nrE43o9CG4n&+A4n-`cDnirWDo0piEnwOcEo7>Fo<`w3Z<__~J^J?=N z^IG#d^Lq1!%!0U`?1*%l@%~tBMBI+6=k#d2D-lWdC*m2B9&jU`$h!7exHrq`x08{M zRk56SfA1>w@ZS~pbl5Q(E@bva67&e2%ntXGC+Xon7bi=~DHh4@3nwD+Sfn$V0}lg} ztgw3KkIL0%U#wqd&_jD~*wekfuR9X=P##gcBSXf*vfJDcN!Y@UM?`Y1ossNLM2J7T zKVf!8*F=PjuFH^-HIaBmM2%j|cr+fNykd4dTSj`L@XT05%8ZE9AC6^Gy}|@bRf$M7 zvf$z5&+qFQ^#$Qr@_)a#=dMbG+gC@Ds$SWv$VGAU^j_34m&PU0XnQo#-rt*pv4x}& zN+hEz5ndDdZ=MITRqhdmC{~3NIoJYH4v>;GGK;7nuA*wHC?b40ZumOvwQ*AgDN7L_ zqoY~v{Rs+8`+BiH5~r-~)sZ-5n<*n0b!Bx#X;3DkGCMt*%(W98oy4o6Ilqerg0V=i z4F+;zc2~4L9HZ8h*&mNuR%K1j;J_~1UPH}7)!ow(p%_q;prBJe{W6!rD*F-fL_Wfs z+R6yG_a`H~w_mlNFmcw`J zJZc6Bx;T^E?r^Nrh15G`UaDOvvOJZDlcy5p$gOna*cpqg^HhTA?8+2F8I=j*lULSe zRqG;oYTb)#-HU4nFV3z_U6oUhb5wK7smFQB9bP|puG-G8Po1x}L~XL$vk35>fC~|D zAp(P!c>-?v0;wyrdi!I^XkTo-CxBM!3AvYs+)G1)mu81j*LV)Y!HlKdb|RkB6-o3` zw_X*K9uDU4&yJ?f5fP#x?$Thpr`zu7_F$GC+bxfsy2{fLT@&qycx;!1e)qzD_rm_c z3$y#vSFFcD(j6ipdwptmW@T@W)!*1%Sq#ma@L6TW%cTw|Nof&phPc<^}w7Wpn zgFw0MgT7haVJFRYGM?)8FlFv(cas`7=}2uQ>~PZ4LGa;ZX00vw>Zq8ju%=xOUU1aj+L%Cg)ysjY| zxeErb&g~xb%>|?}X1CI>dc;RHYY$CcQPat-ck7{cWky{;ryh{*S#Wdf-IBX!x&E;F zbOqJ!EZS1CANABPRNFk-le=)R47ojneqO_nLg%gi$%c}uc#PV8wB6I_1~G;tuW{&k zu^}6tMwiYQ60=be6(i$mbQ@jFO%}Pi#ogQ%4ap!cK4inQ$jvS81}7fwvt=@2(_K>3 z#=Ar$-jx~9O~BSoAm9edMv@=s?vHnc6aBrhaDOu29=gQ?wcL()mbfLM8w;sz-jX5U zd5Iw#o+WNc5^fT7uaZb|gM)PD(k)Nj?^J)y3hHj3Me}n|YERI;Tq4O^Is_muIb_4L z)IBeW#9XSHOp=TzknRxu zZkoG%um-tnhxmsL@z)Rf*@vZM!PD%rvH?j>bGk|9Y)HGFX18V=kYv!4N|*F>#%wBO z4(=lEwNOsDnU(H6Br~i<)0J=>%XO6ueqL}0e|dDXr3WhA`3K9I;exw#Wq_vabkR)3 zl*c6@0|e&{{S+b5$`G3?H&O}fYP>q(5T zOLfS+06m?NVqr&KXvhUQf!;`$d*U8Zy5uK#8Nf5EBFS*Z{4muJ4;w`l#hDt@Y^FnW zlMK^+i@Yoas_-%z!hL;V>cqXPI>OxF&lmOc6;bLuC0saX~k$fZiv3*M-H_ju}3?99OR z<|;Zpqf1pXqazYahBI|u^h8WmR0nCIIvF-qW*MtdJ$g!~>bV82s^;;2zAl<+>pJ#D zMWWmG&|`aV*q4DsB&n*p2%?Xw*-n2{q6}NbAW!9-D%tR#l{8Oh>jqFC#6}J-hMOJk zj7I6Bg2JMdSK>>1g=uf_XmP&2qNGGIo8Br_Tj}%5(q4Jmt4MjJR@zHrm8P(K#U-hu zzH~0WbS}PhE`{k_3e&k1rgE_gi&ME2rt>Q-P47$RT$s+eFr9NzI_IKv&PC~*i_%;a zr7?=q7)5D}qBKTP8lxzUQJlsoPGc0OF^ba|#c7N|UW(Hg#c7Pa0J}ZUcvr_f&S!oPk8e_1`C8>Q@MY(6W`&hizO_t;4;#rF% zdwEI@ve%|O&tdL~>)nJtHl$IzC(^4D)P}mhRh~aM{G~xeHf9GfBLEMhvtff%2CKp{ zlJ6d&$La)qG)E&dck)49erl5lLo6VzDSGo6Myl zBt6adt4Ruv8i6Jw9vbl4@eT}VF=L@HFm%KgK(h59dQ~i|lOC1S+(C9cHRjBqUGa9e zvgH-UKAOOgN||f>6E^mi`U-UyB2PD|QeRO?VRrhn(G1-7vemRiFHKQ&WYY)&a~j=w z7!|v|%vIAK+RwwxN9q6#l9SPJtRvdlnNfrLMPI`1=x3XNBx@hUW4g~qGUcoiD2LgQ8HdRFRsR%-l8jbEwpD>Z(l#;?@)l^VZN z<5z0@N{wHs@hdfcrN*z+_*ELeO5;~){3?xKrSYpYewD_r()d*xze?j*Y5XdUulr+h zmBz2q_*Hee;I-OPkDxBc)w>x(wC24Ar^})w>x(wC24Ar^})w>x(wC24Aq*0 zYF&ovT8&*dh+U(3(7I8qb)&dOm!U?Np+=X%)f20@Mwg*Rm!U?Np+=XXMwg*Rm!U?N zp+@siqvKGk@oO~)wVH!kjbE$rYc+nY=Ac&N*J}J)jbE$rYc+nY#;?`*wHm)x<7@pa zuG9E+8oy5C*J=DZjbEqn>ok6y#;?=(bsE1;HrEE`EvS;+I%1eu?Gcmsl=-iRI##ST25v<<`GM>urhU;+I%%{Y!i<|0O=R z{v|%Q{v|%(`)b{ON-2(0isO`~j-!0Ejq*{7@==QNQHt_Wit z`6xyCe6?;rrBvg){gk#fzS~b}TjRU^l(sd#+fQj*Z^78DW$p`Za<}MT@JUO(zY&#+fQj*$HDEVw5{Xd_EXx{ad7)7ZEJkDpZaRueoCp1 zgWFGOTgSoer?jo(;PzA6)^TwADQ)XGxc!v2b^YCbO53{rZa<}MU4OTq`fA;NN~x}| z+b?Nb*VpZrw5{vw_RB&`-xrFkx{-s^R~UrQ!{VwT`!MWK`}Q0>Pd&%{>@>`0seQxn zV4BX!-AreakE5yU-Gk{%N2H!@)p0dQ*dw)L6@B_h`$E+}-_ux~MGx`?ee{uOrh29= zu%$=spoBj7q9hAX_vB=%r(C4;fUAzvv#mOg$6Dp!iB_GU9%d=!ot^4-ROldWVwVmTm-zzsu&E6|##L!85wS(1r+z+Na?uSyjLq3qoPJbBXaVPIH z^^Cp8ou$vzQ}a24)A781VYZqv!-SBjygX%6!$&>fwMtS0S*rvs!zy-rGNq}Wty@TS zr9mrqg^@+?QH(J%|3SY`jg`E4v}kM${c*J=t|M#G7Wvxd7{x}Z!D8WLoUR>VaDSlD zYm8YE@Ox>+utE9Izo9mLU7YRy#dZ7Rx++|ejnd@O`NNDoXeIJkV?6ffPzgM=x;T$Y zG2GbG7;Wrj?5&Sv(8}i=BcDn;!Wc>A9!F)E7>jm=jay;wg1t9J4ae9C`xxv~F}pox zJP-Sdt&YA4`yT8ks-YR*!2YN#Go=b?4(y(=}>_FH zuq%=(w^rCr*f{u6>!caganNSMA8NC(M_F3NMO^(dO~uNMn6hd$po-mpnhwT!Fy?9> zLoTl6w7T1aJcp*L6-_esqos|d#vw)>ElgZywCbxC>vV%ouh;1#I{iqeU$`k7q0=!s zEp*!;TR`;~VPp)h(V^`OV@N>XH(fU3LvesRQamDOQle61B@c1DaQWvO&Ed} zlLqK}F;v<}Z&q=mo|ljf@M5x!3Z0Iqf68;)gE6|5wnt&FF?yM`Y4j3L_KYnHwtSt> zGWoVmqpNAxJkFRe*UI)}%p4~8_zc4edva!aX!+@;GS19xL95A{HDu3(D<&N`!I+Ex z0a}MFX$7oWsjXHZAEN$SlZRwxj(X;!7ubM!`uu?lJm0^ZmC^g@w$qnv+qB0@Ym?Yu zZQ`r83ANsFMESHAzx^hB%Vl3|eRsb*|J?k7m7gvu%b-F9QAQCmJtKK2=o@Q|_RvPo z$YHczJxZTu#AkWyR)}n@)r+u_y;i=DO?jAqu zn@!iRc=^ey&u9Ox|Mk;vc=U{k7sVR0&Ykr7s~>mmO6;uPd0E@sU2ok#=F0YU(NRa< zG@A=*L|1Nn*xLA@RqV;4_K=a0$(XsnwVyRLwQaF2d+B!s>~`5#Kogiz`m`mkUQDp^ zh>?jS8T*IHY3Y2C+SU1pIkR5Ddp_;Z~^VN#;A*?sVwrW zoD`_YvWBVs!_|IMaL@0oNoso!liI|Nk=7o*;Y2H%fM;p2(nl|Z{In^FO^g|ff8X%f z)Z^aRoj-Nw>*Ig5oo~N-)9k#>qc@i2Y#KJ}*5JQGk zzr5ns{?g=u7X)^f-E-l|Pn=sd@z%Q^-FEu&H@|(M!>lS<#GWm>V(er7>!&~Z*{&^( zyxhNe-6P)z-~8ZB&xxi!2do$yfGt~YMl|D{K-YUp_7(Y+79@5YL( z7s{t>FFJM3DHnZkZ|3BAHI>`|_r9w+$Qn`om+6 zYkPe7%=i}b(+|E_H~ra+-+xqmcv^%^u8SzcD_Ex9mjvVFg@K)1Ib+nVFYSrAWZy#%-8^1C7uL-S+=PD>ktyLs?PXbrTzISesZ5S1szgCvMyE$0xnFt@i z-*|BN16|?!uI!lb%5VSvM9~e$TPLqL=CoH=zgBwL@CTm#aNTEXuRg|}`@q?^?preZh6M+IdDjaokJy`E{_ULAlXiT4D6@1Ar0U*Fz&%4stmI(71i zo%d~CvE1%|VD9z%ow)Le5u@i`e*F7OAIynA{NwKzzIJ!!9_LRv>eWN0KRapNhnM>v z|Mag@#=ZLR?enWI8h^yLNn3Zfe)-W+pB{a~DmL(?Klk-#rYyVm+$V27Y0b?a-IM?M zZvV^MzU$t0^QePvKk>oeYQ=cf+W69csTiv5xQdZwd8l`DW>}SK-#+GnR=HKWt$17E zmefm0zt9c0tqg4{)s;{Y)lw%;`*#w;Jfvxm5Neq_##v)i?OTk@BMG5~RzBM|yQFAn z{OO(~NT(OB{`>nYcGgVroxJ|Sndd#Q=|=YF35`$QddiCU8(9Zj+4|TMXODc>T$2Cs z{ONOy@>_R5e)gh^o}aR6^w;ysCI|X_$9;Ng`H8o`_ul!&k57lrTQv1g*G*rv;pSh5 zD?gv{)Vq(r-1^#YXP$7#otNJE@~-9oxc`pdAM@qYd6#{1{*N=CJ7~$?dzVlDdfq~7 zlleXUMRY%oEZJ|@Z3TPnI&Am>C)_yY-Ikw~*g9fJH~x2b(K4%q2%#QYP)$oyrMJkt zxPKLW)Zty6pbu>l>wnr~y_NlH*%*Dmf;(!3RZ>VF@TIz@+N96L-8<^WyZ*xxXc5RA zIcD&dn&_8F@1h6|CljlE2U!(v5et{nian{`xa*e@Z#d~ycNVGNmm7LZnv>`Yd-rcY zz^b6q6{w5F$m!|aQx&bYJLqYF?qcd;fj%v%m|dtI75=yGe}C7+JKCz4c%KE3f8XY(1Sp8O3hU>@zcXZG=v&)xm(C5s!s`_q*BUis{{l7l78sCI9C^tX?9NAWeskPY_fJoTyQcel-uZB2c*XiF-yAz)&(YIw-Q_Pn zcIJF<&E2nePVGG9$-q7P{J#9LrCWC;z8crr-*b0;_tWL;^RKtAeRWpbg3DgKeiXZI z^NZzYS`{PD69*o3=+e7xdUMX+oBwj{9!n14x4$^^hsk$c({knT-0Q9$v3OW?SYa{-k*8pjdpR{JA&*avm@&Ec`cX=V|57A2eCEoko4+J7O4eeK~Q z2%vf(rpKcxmUqV_Yl3gQwHNK6w!a6Od{K2;;7Z&g52M!#MxFo6>TCDwdu;o>bN0!a z{cy>}JGM{y>}P7C^zT&hyVuTnsq%_&^w!bWu6xvaWb52xs=l6j*Y3@7EUo1qamn_# zzTG(IgWo+-^KRnJ#dn29csIw-J8SnvO+9y%`Tla%><>;e9-SC?*I#(g3EwQb|J$xm ze+WgLa^;eZId*}7awZm2n zw>D*rr01CLwElIz{YlsQCq|FyT^zJe8aICP&q{3le=9#UQX$bQE36pQRa$Fcm8W&} znV;&aYIGFjtdaSC(rkr;#;aHSj&88)0JUXXl+qu!BLix|UI_C7kl2aOsZfNyxZ+vma ziRCX|aMhuojH}O`GAS6?S$*{rr(U=0BSw}Ud{gOiqDSx_{shUzm6>Km~!cT zN8fwXZyNr%qIQ`7*~1$BDYe^7YIiIRcd3Jo#5m_CLzB$otQvJ_AM;>~ZdcpNwv}ut zN{xGDdl3yy)a_;VFS>4ZusU@RJs7!o-CTYuoumUPN%^jySxb{)>s;Z-<|q{mjI1%WB46ank4Coqp-fU+0&+J~!{inseG}XI%W_ z#dhOCzbfwP8?ogd%@r-pZ^t&>P;ykH;fD))?;L$j{Us;$jky2dU#&X#j#uw^{+0JG zt=xLdk4N9Vwn(m)_vR!n_b6Z~j zpA|*@2Y+yO^sO3ukr8|Pg%e&`cJ)P9&-+8;i?-On0onL1qVNJ!!wt@ z_P{MQ=brQIvC|elc;mSrkDARgXNnIG{pg_|wk!GB#Eu*+yvMhR#b{Tz3VqlA$+X!& znXDTUm6h~(k(y+r804lmG8u&+eI&y-oNj5fs?RF%m6p(lz0JP}!PDm-^T&5P-)f4! zx5w4L>-zG-qj&t~Z@&z|%9~ERYu1VbW8$sH+sr$ky1BXd@Xx+_=E>7u-M;jM_2Y-n z^Ih(nKJD+*XL+-KJ1qH${r$zImu^4l%dbZm4~}BHwl?1N-kCQpm^kIk$>ZL<@#vRc z{`A-*Zmqlf)>AI+sJi^D)}r&S8FM`!^VxI-_q+ZXSu_pCWw5{pc0lw`9Peunc_$&T*e~?K^02wl1;f zvp9c;5dPHxgOXDp?zQU-A@nHjSB{=Ea%#d8$yJ0H4r78gqi4-<==+85B_wJs?(Z2l zb^N3UMjkN|VtI=Y#o_TItEUnxabdiBao;fh-Z|rDblqA+h2p#Mt^hlR`r;Hw% zVEOmYSV|h^8!~C+eN$z9I5nQ%g6AERM@|}B?O#?)_^|s3k)578rFsU}=f`^qZ}bup zmpFC$*r|P&MvslT5+ z!{^}n3s~nx5`%kt1@MDBlh}n6jG-hPe}a_qO5m}IUc)h;tv`f&d_RH4a5E1rhV{Yv z=K;2K`93m+dza+#*GVbvRWaPNYXWJx&QBr>q-&>13U`_~rM3J<{IZ^88pAieK-{=q z%oCE0=S$>0NfBBnv^K!KN5VV9{T)r-)FLukNOWMd2sY56heV6UmKOG1cA6xI=)h>v zx&f|QcFt(gx=FOSf-$cHe+=(`)8wC!3W*k=1EWQ#fd(Ie7LVijG}=|+6q$CD4vZG9 z8{;!}&S=rPffkI`j3#W|Z2tc`V(n~xhJ(L7G9CrZ+4|X0!ViO!;pzW4GJa+}^^ZsJ zI$IBTp5SQV8e2ZcI@bc%9i+84l4u;?kZ2$$>A|BP@?0ipz@v~6++T-h&oEvU+-Q&& z;Ovp$(HA@huGipxGKu2sElrG$Z0&yh}32N)7Ne0ERLjnH?( za#G0j99y4!6z~ciC$AurcYl{6QVJ=|y4*cxS*&>w4-MS*v~4-)S(eFC0UOu<@r2m5@9_5DR6*;*yJ1YVeJ zke;1QbZjj7Nzk@|6v`vWS=IzRBij?eR|t@*`mmeYqg&lp-M}mRzJexNIa)@U_@^I%-;t$rBkWzRxQsWC-n&>bR zAvM@|cI3_l8s8JN7hsPpWFF6frg>zGY8M&9`~%(%A7Kh?>l9MLUxCe0i*xvRG6}dE zg_a|aB-@0eBul=9tO5;ZE1{3%>BP-=6+AXh-jno2a|DkQL09Ha#LJ+=K)YgmuL8fg zWqZkN-b6IPahVShXpLkF@D?StUF2g){}I@9LZ_iEg8hp}v!HcHOF+v+^Pst~e!{%E z&=EW-xp5SHFU*l-nb2+MaE^IPfe-qZvBu_MID#Eh3$>8Lqr}AImH7rCdm=9tFJa7? zyoYR2%p_5)VV(0K7u9k%>|!a|OGwioLYlQWM&O8{o4ZRq&iI<~8u&|Thb>(NJ3Wrr zWjbP43`ITg-5Z8yHAG2A^c6^KHU06pAF$h;l zg6uD>H5qnkQDDu=ci| zb?jjB54*{ZXM_V7?=a~p%Ojr9k?ALAN{zLRuLkUn@$DU`wp+xZ^c>X*wC?ml0{Q)27AkpIh@RJ062f1YSMF#nibmKqyT7m0HAw2#6J%;f5 ze;kJc?}h(#pV17qeO~amlkrz;ALowqk$0Tm@`*z7{XdR(`ZOVZ@V|}{Ux$2~)<@8a zkQ-k@k4(c6SZBwkDl}-ao2`oOB`IhTtno=C4ZcJ*_ZvxqZchMjR|snmv;0l`23->+ zA4-NXzeDoXzJ@KkqjBJWG#T2{T=$mKf$uF(;QOy=U*miT+P?(oEAC79L+FnvH_*tU_vy|5;`3HWFe80&Lp1{kO#cU*viV!VoOVNOA8=(0OCTjo4i5ZqV1`NjsnEH=~ICC zIu|ZM{3;;+01%U#5I+crSM!hXPw*E2F%fh^iBKsl6V?ka3U5V|=w8taqjyKY7JWAQ z7eGuLW{2J3kRVQVWCkIg0f-*~#82D-@!dg)jjbRa1BeMAZfa?1xk50WI2qrP1ABFz-D^H4E*2Ny2+k8>TSOIWUzC3l zer4_#^9fD<33z$+cV4U%}|0Gpe@ZWH$H zMYPc8r_h%>j-TQDI|{ACJ`}km+8M1F4H=lwhfc-$^w8Nq9ckr1-MRg`l+nT^zMkLA zZ{fG{+xYF|dwvJ`f!|4fpOqRF%~O##Py zXc|qYU1$dFN;7FU+MV{GJ!vnRMZL5)Eue+89d*+(I+zZjchPd{;~%EO=x|y=N6<>h z%P2aUj-g}eIDQYUq7&#udJnyqPNI_$%}k}!=yY05XV95+7XJuWMR(AhbQgVy?&kOM zkJ3lzUiv6)ppS7AxQX;T`aQi$f1uaskKpB>=`ZwG`WyY7yNCWk|Kv7s8@WwfJ-3P@AHrG`}jQmagK15pTbY& zr}5MIYJLVklWWVb;?lTuZa7y#h_~&B;xlG_WN;*3Hv@+MvyB)^7 zk*-|V$o!;^j@Gz`NxI21! z13kSrds2g=2kF74a5?9< zjK5@Hd2UXm)9Fj=jTw>bt8|qEF9%>7+iG+ zHJZAqxj;85Dfd%cKei&$pSRNIH&j;9ZU9wUdR}Rf-#qZ{azE$Jb5xB4GVouP%h@&3 zX}sA71N{AMgi(Ef9AMb#WN27%)JsO;#J_N0dEneZMnxVX-sD7|pQ~hdUJTu_4rX^2 zhVI;aywU~Q77Z$|LyD$gj4KxyUoq0Za1^*}A|s5;;Me^T>2%eZjE>A?z=*yM09`O< zg2OM1^UK*&tsekSvPbIh2PDz`5jgx1i3#G2CP$_V!?1C3UAdLP|7KN%V@3xMou3$B zgtBtKHwPH=jtnwM?!nHHJpLB=aV8aRS z+&hMGl}84K0R#G#Zl$A~i{yRiXut(W9=^D;d*H8M;Z~vj&d4FLcIZo zKf#eZHYeDRo!>SnPIz~p{LpA}c8YQOw}}+dqO$Cyj!OY9kop~rlP2;aaWML*5V+$FjUeEfGH`97bj`;;2MNQd zS1t1@y(+JU({hmq0W~1Qm1FRHRg^rfp;{Vw5KjR{Ts}${9#nZF13ea^hu0T?crXsZ zsRs`&e_BKEnDiGDWwQ_1CAQoe)V!n=_Ghh94NEd{8QN zhA)%6TUE|{$6yDI9vqX;4~~hZdN|!rMf3fN;$n)6JTXOi?wGhV!(g|k-QWmwON>Hj ziIMXyF@*)5m;&50drX66lpid3@H9{Ld=~!{&-cxXi1|K`x;(Li+j=4g+dS66Myeld z@aPBY^#k-=jQ+fy)9YLGoE-LkF!hkZQ^*4H6#0<|20|CwsEi(^YY&zUN=z&|s%U|U zP?g;6r_22ALF})0;84GOnV$?EdUyFjN>}@8SFIx1QAPgLLFIl&l&{D?244(O2W=$V zS6!W$SW!J=W+MB{NUWYAeF^=MPQ&585V?ieNq_9Z*~v`V5!pFhYV{HFiG{3#mwlC8 zy!BVKuaioq zJ~6?61IcXCLg&$|+(fR1JHUO&TlwDn2>507Ai>W<8{ux@IpKyZPxgrHlsrwoPJUW` zLlLRSQH)XiOW9kwQ2DVcLN!=br#h-usx#I1syC`%R$mT_2^$i&BkV&>N6j3~8=9ZA z?X*SOHQE=nU+GM`F1i7_>ADTN$91pi+v(@%4;vJQGQ&n=d*e9cM&sKigDKv$!1SEy zx_N;45%YVN_LeHkqn0Lg&5@%c7e}6q{JE{UZEo9p+dkU%leWJ`DWjsJ=0&ZH+8K2q z>V>EaQJ+L7MrTClNBg2DM&BR3DtZ@~_hd{&Ooy26F~u>%V*&aTdUXSs8Nb8f6G))?!IO^NLtTN*n$c1CP%?B>`Om);fQN_J(r2DmC+ z4ed1T+P3T1u1C9m?S{8I-0oDn_u75c?oYSEZFa}FJG;H^f$ov+>Fyf$M)zL#GwxU2 zZ^m_tD~h{2?%ufj<5tD(iffEJ5_dZ8{kU)9{)$({N5prC?;hVb{;v3{_&M=s+Q+u{ zw9jcjxc#{Hv)eCgzoGrE_D{8cwf)=eKW+bG0!h#$*b|Bqh9^u;n3GVOP@m9{a46wK z!e1SdI`rz$zr)ZDV>`_1u%yH04xc8*Cw5KDPxK{DNSv3rGV#Zb6FScASl4k=$A>!} z>iBZUcRGI2@%JQIk})YNsZ&y~q=KZfq_IgelMZzfI$1lpJ9X)l*XgcK<2%jiRM%-o zrzbl-*XdNJ_d0#u>91sEa+~DDPfhQZJ}rGt`l9r2(tqmGqs!VZd%7I%@=BL?x_r^) z_Y6hGJsEFxm3JNA^;D)QvpBOM^X<%!x^?W9)@?+$*So#l-Oznl_kG=e=;7`$yvMPg zhMpsOKG*YX&wuy4+Ow&bwpUEADZLi{1@>Fj@HznuMBpTs_Q_u16v z;~ZDc$egEg^|?cGD{_zJS@Y8J?$3KL@AbZ}zIXS%r|XXek(ug!1F zKU82Yh%6{Bs3|yH@MB?G;rzm*MarVFMUNL9D|Q#B7uOW8DBe)~Xz`Q%++Wu}x_@$iZ~xN%WBSkRzoh^6{{H?)`+wB`&jHo}Q3JXSm@r`5fWrfR zDH&Qax1?@hyMY}CrVYGn;JkrL2ksttu{6ANN$FpMCJ%b2tYg{kvfs*@1{Vz;HF(b8 zwSylUq8`#~$mk)Pha4F4_FbuWjk@bfdB^fzXzHj=CYDKlVx}tKhNnrXWEYec+7+)&+wX)GzpGVf4Z& z3!h(jYT{*<%cjwp2OoRz(1Rx) ze7)9CJEV4F?T*?%mW)|)W@-G=MN8jVmbh%rvR9UymycWSU;blVQe9o$`np|pjde%r zUaGrT_eI?wE0inRtmwF+*NT!AqgKpVv3$kO6;G`=x#HrAFIW7zQnfO2Wzx#*l|xpJ zS~+>;f|YAmKD_ea%9mHZyYlOm|5+8bDr!~os@|)HteUuL-l~vyZnb4~-0H5Y3s(dmY7tv(8zKeM9($?i+G8)NFWi!?lh5H*VPY>Bg@%sWurmP2Mzj(;xL*y{>**{i6DH z^?T|M)t|2ap#IzX>zg&3qc(TioVB@d^WB@rZ=SPx(dG@Cw{L!O^D~>D-~8t0k6=|f zR&yh$VaIu*Al7FEUd9Q$f{^6YWDiaDBzsaio1I2y2HHu!py}BvZcg)3*^%poRl-+z zdP~a{x?Fl%M-sgjUZvs$L2sZ`!)fFLd>R|aldP;nqlsjOCmT&P)9CRSF(!5K9zM;J zYO`A8uGl!5H^FoM@_pU1yqRe^bc5i!et214wzqEO`Yi?I$E~i3wE+vLnquaR%1dSg2bP{=is~@Fuo;2P^HHk&QBsAz>Cw+j^8XyG!M+#**y`8IYwTpjLkDg}*J)8E&YYGa7OXz1^Y zuo?$w=>Q|u8ns55-OQ_HB-xYYF=ZmQ9X=e(O*9g==HO8R)$TFkJ|H&PGo>bdOHB=2 z0d{z&6{|2yEgk7yG!HK|E5#}QZZ?e+&y_7N6EBo5D-o~Lm>ltYnpnD`l%|v|DWl4! zFKKeNc!94G_b(Dl=>gUj(Xs{fuvpC60&zbr1I=q%mJ1rW2|3|7l0?RN)8mcqD7zqZ zuxMpYLLy{Fm8?^;TPxT0^YQX_x(>QxUsQ+0wwAX2eD)3&AjcxJVa3VPdQF+BY_&#d zt--%0iZ!zJOGpS1$s$)+UForL@#!|3#~2rvp4KHJ-D9=c6>;&#XikxaLl^+X`8m~+)>!*Tlit~Cqt)<9!F0uJ81vrk}GD1JDDEs zy?f&-q;^S9i@WnWbqtIo7S(}K^qFo%1TPg z$_nY(ts7Tw-L!u7L!#L9?glj_{F!^E?xQRTGPi*JpR~|PdxhQ6IZ^y z_UVXPBn6!<)5 zeSDIxvn-j9h~qnSa3q@?szRSbAX$kd91BghXM#{p}~Q%kz!&RW@o*jH(HZDyT6o(dpGZsv>S1l^QsOtBWZ;jf?l#Oq^!>`rRuw zu3Ni@4J-af?6&VXJ^Ryd^v#n`i76O$2)97cA!^f+&fZ8=TvCNrtqN1=4T73#IgLiE zhW=7wk1Fex)SJA?h{sm$w#&@WoAG9MhK%RdCDPSx#G1eM`*-_)5tl~MrHOKjICIL8 z81YyIoha5<(7c!$ca26 zTxBitsT91v$j3(n(w_($! zhQ0ONC)oX}!>;3W`T(6SJ|M0aPl}&lx28M(xy4I>8WA~n7Er56JFfvH#7Y{b5mX8V zRmri_#B>?7caX`U!kjK+T83P%h^HRz>>i~x?VWO3vr;fEo?-2@e>zRXh+|+y-O!#9 zu=)0IsxT9?jtXre4eBDFK|#ZdeQaQ+K5l6Z4D3v&y`UVJ7F5JDy=b*SH&~s5yD5t< z@=xu$`hmM28B_lHwKu=p@t*i1_tP3$b7;%jK{J>47%*+$#X~E^pWYHrBU3;LYP*C; zKoC#*c-uu1vqC|5TdY>zK7qH}?6xAG-L7`KqlvaJI!~-vyZ(vSHat+-IH_#t z_lw`XDpagI6s@!!UVq`TtK+WZ6q-QQYc?;rXKq^F)V>2>W!|`;_?v>4awl%Z+_NY&Cmbx^c7JYusg}qu#=`nWpMkqiUoFtnVEnp8C12Ab|lB^ zYGVv@!U>TZ`8c;GOc&M97pBu$c#FNrXNlmI@JL{egIva7%aojt5LqR2Y#`25yA>SA z@tz>ZxnhYdWQ^soS+<#U0L`D)yWi;V|I%nCUpsZ>Kkr--|DfNm-no9=(0X6V25uU5 z$Dc5-i4Z>)U)_K0jW5I-bnt6WKfbP^aB<%FLsg6)LDNLwQ%+*M1}a1OJQO3(6~k#F zjD{gOfD}+@Lo20GTt(9r{#RAu1nY~VS_SoKg z4;2jl*SsSio;!YHW&dZUKJ@&JhWnPRoI7%JU+;E){C#7FJ(%62ZrIq_jJ6Z8I;J!1 z#7%m8V^PqGv>A#*yhSebMsPrc3vUmNh%pZn%4EdFci|uc^VZ zrVWJDGw7~w-ui+nw~8Or&PVsIeY9|4-h@Nr803=WK&2J)q@cqM5DP+VcAa^EPiMGk zM1snWi6`T{*0#imK<5stGHYII+rs~A=~8B5ILQ{)VlE|gLo7H+tCgu#7ITKNKZ5Ae0K z8Po+nL(sLA1VxHULtYXr0SiS!Zf(d&!5GS+5?jZs&iql!`qs=FP(QN!^KZWJPJHnL zV|yRE8NYU!xw))*M(MaI?v$mYk3Uf`W%T4B(?>YP_k%$#N9MHT$&bno!!yr9nsgBo0j5 z*?Fr)vSA!*4g}81v|)x-?s5<~7ww#>f{Eh3*~~1m{Al^^sv)z&lT2>9Qs4rx(Oz+41W+s1-RiWPW9}*d4Q+ff70a&5a6HM8O5# zII|F?)<;C>)Ph0>e?X}Z*M}GS^m-l9MHKpUCSou2;ko}(xvlh*WO|$qSV#C3g3%(l z5VQwuj>~8aemjFw78e!Pt)TtHKd*^gBMm>i%m3nansV^zXa6NTa^U#l$0O94;>WN2 zo6niHWZtCabHnLFN%(5Wf{Ki>EU-WzuDI z!soQ?XxaMyOwxccSvfEUf1T+=ouERkvdJvd7W!nopeyt-DutZCn~53l9&$(y!sCm} z=y6~SakjWdyobJs+Mv0IG1r%Wo<~tpD)+5eFD{ZD5toRM(P$cbV=A0ZtQqt2e_`G* z=CjDvYAO&VMLtHZD)7O4ah$Bc$MF;rPHzElr_aKGKujVv{;#GBd~)+VuA+GlS1UWR zSxl&J{;JhXDw67LgIIy`O3JIl?wE+V{y`nWm@(u`Vs*h8Xmw*~cnseB?dBlmWIZK4 zg;iLT5gezBR0?gQNMr##FPTPTEbwUrnZ3X#yG6u1S3#Y~j4&|{(NPj7p+M)-H>YuO@twzZg_>@YSTF%2qmC_&x99l`Cq=nex;govt*CUH* zY!VwAd9IQ3H+5*v#T_z_*w0klP~sp!(T-{|p;FNzBy*IDkHhCr_T#DyUD3ExUk z!`?BR$ha^y!waXBsaoUYmg@yTT~r~V1Byxb_O<5kw>CC%o6j^K=1whZeiVdmVgbH9A_9OLWMu}f1TRzfPV1RQ#<17F*cNzJ4nT<++#0S##u8pK5_T3V zRU3IZA`2ZshA+#*vXWrZkTnjN4JUQktSpQGgdQ9bMo_*)G$?gDDWT_;^rG0PQ;Hgy zVcR=R6|y5Y3I)Wr{DD0uuKyC`7M5u-kWOB!3Wk#E^-$zSQy8z%D|xC2ams(q>k3Yc zY2&yIa7)%pO_!C1oiFlHN>0Z;B%J-=aMMXl*e#N}v-rMD^FZs#PW)XoUEos*yuQH4 z-x8UdJ_o8Qp?0AB@V9j|EjuCZ6klOV4|Rw+h?Ym)sBZrG*T4S!<=19J)eno4AtP0& zOk6Hb6?cp8i|0`7*a4Asig+%d1qH@mDo`lR+eQt%1JA^4QG z-fsdH^ze1kya>8&;1^yE9l~oB+K2+5R#2FsJ`k2?y?Qe|x+y@g1;{tS^eFxwE1$nf zhy5vD$@oXid@Zib7VBvt_doG-9{AC~YtHw&wUlxil~ECn=&Cc~F7f=ghxa}4{3l#x z^KRLZH_wZoj%%L6RjyyNX5B*YEQ>@qXyA4Xd(mb%^WkQh;EvNo^EMl_uub4$QChJQ z0ntM0hb0RHmm?JNBFKoBA}Pt5!i{19rQK!|IPsgG#HN))->GWc-*e6SH=YtNeDrMk zGfynt(zSN^S5MN~lOOci8`p7Bb@9m3w1U?je*CqPjm0y@7mpm6Qi_BP1y>PaDDbC1 z*2Y9o7{c>Pq>KdU1c7G;uC-cZnucZBtWIu4qnIM(iz%|0&62%22APS#I7Z_38Vyvf zK)S|cRPurr0|mt;kTDCP*uo@5Qiq7IpciEk;@je1_;;!CwU?fIO?ITI|8?S*E* zH03?}%BiFLQNW9j0F8#MMjLM!%yJmw34zDUQCVy=MAACIod5$eb`R-I0!3OB+us3bP=upJga%(R)L zXF&*PAB=8hqX#E3dt|5fi62_isI9a3`95*p;jcT}BGak-Fg15}n$y2J%wO#Ns^!6* zO&%<3&WUZ$KE=;zTCn}))o<{%j0!MKLOtLJBQCE=kjtR*Q3(*n9ugRU z0CVF%q5dTNo2iHCS7P_$sA-=3jM$y4X`atDamSjU=lV1kv+)_$=3#s#ad`E}Q_B>* z3RZaMpq)U#9;rqpiW8BBw$4!fx&v427QjAuL(U>+?vAi5y z76nlVR8WV>1gHa^DsS_QZaFN-%Sky2r;ycT=9SF`{)MK$_~=?;%huW(6EJQA^4L=_ zt^!c%PiMqS)F~d9Ute|I$yUpfJfC13o|vBn z`tHb|nt{7xoU5VvvtarZPk6-Rv?(+*Ucf;1RH-70c*wz>GutsU^2|;Tro4oyGmgkE zt@;o1-tZoJyx@|ZgnAD5s<3~k#5-nq9VzLkA_%Q9oENkvF>98xvZ1U%Xp^WoMU#~k>85SKK z5n)pD@Y%Sq=)OKK42cMvq8Z^83ghVf1d_(hN41)J44F92J@L#qZ-vG*XuP=yoPr;wM1hz8P!G*4*<(; z#FFQO$8ZZ~@OOBt9g!d>rJAI)cU-(n!8}Tf!qderDcFGC=MH@EEn zobg6u{kF!f_4UF~@k8+!{Cjsm=_>4IELkvi?~0ed{`&N#3-7(nxS<*tUV*p!Yy`2B z9@a<2huh^^KxQB&K*qKNTBWX2I?IBw6WgDRb2*GGX@)SG8+Q$fK-KR9b|rZ-7N?4b z9@)Ko?PLqycF<5W?HFrcWs4Gry#7J=4Vl0XW)(7k9~1DC?R7@U?L?B>D(^l@dA4Uc29gf@Z*wbDP`9gHMgm%zkL74pWeGP zTdNQnmWsO?w{CA-zkS<=$M7iJh)TG^;~JeD<;^Lpk2kEKb>&$wZe^YPX5dNTXsIis1}7F zK_`#F9t^TO7LCTtVgFyoTWxBHf*J-=A^?B;0VGH|R49v0T-Ze9^GN)oFwezQ&GWpX*J$llOuG*OSb?`lT5-(bW6kw(U z$soPSWN)v;h^}r;Oix*gnVMx>huF3;?g({upSJpReR`fx*}bn%9jol1SL&6v4js6@ zz7G2KS$%!&4Yp2weYVITkA53U@skfVG$_?6&&)V;hC8+7!Q<~W zzYOV47~FNh-7mb=oX$MsJz$h^c&DF-Z|w3KS$>&PgHfx<_h~sjWt{P*6tM=Av~ZeG zg(6K6C_@?2&~UhGhxXmNweQeX$fpUJ>0P>Z&B(ymE$c*!G`0r${El9mIV?=8R7SM1 z8S;HLuS!qAeehZ&&C%wzNzAPROhfD05=V5;?bE;D){LShVyR{DT|(0hgLqsqJT!R# zr%}MEfpmetuT!hT!jy7BrWA}Oc&`S7QpqdAth_$pF(iZI*`_tz27HsyN+pj71}+ed zS`@S_v7C-NCFanN&xrHq@7=59QhJW2v&E$56`cHDah%-JbUFjSvcc#{hhT1=V3|-; za8ihbNoMpJZ!#oOAP#+`-tx1M5*Nwyx~xW{3FLRFOfJ5iyRFS?HAM*82x!`v2!mOV z$cga*7$La11tEZ_hCJ;6=eJ^rTbyC{U^~ts{bk%CcTb(QePhGa**n%XER9qqKQWQg z0m_tPvyVN;ovEog^jz}}cKp}7%_oKY`jVl?hKzaPZN@P{ZUwv+lHv^~7RIg?mCdSA z84O@ngF&tTCuY5!S8u|?ICcMS28QS8v{zqaoOrUKvT+-cs{Hd2JoYGl`X9$25>a@C1;+tTt2iOi#hPfWkk(jI^dk(}3L&i&mvlt2yLA^je~}N}3_)?U*uKSCi0?5n|eoA&=Wz(9NEcR{MOzaudeBR*8;|vmaE)8{APho%1u}-s7x{OLbzRRHkkYR zbY6pA0YWK)glco{w&Wf*oR$FZvt=6ElphgB#Z3|E95mBX)%QQp@!w*D$g@BUOO%1H)p~Cy~}xT9NjQ*$cYR1 zNfOM=VmS^ohat*PQ?&+LcX)e&P2~y2zsRy7JoR)jnGqxI7Ap^3Ezv2%X1;Mqti+(R zzQ{?Z{kYCISUinbN$$dEZDDOJs>rBlyG^G>)GjF7m|$*{Om#we2BKhA5)h1pvHgKU z0JarkGBKXYFbAgWf+>aMGv+j9`{?s8itiqnI7O)pOEH}}{7P4gQgFSnU%bH8bieS_ zh~@>zAB+}DiZY)`=Vmsq*gvyfJ@;<_1*qb&My0gISg%ompY5Tj0a78f46_PYECY!_ z6bOfdkuZy^T=b||^E`D@$G^lHy6(7mPJI11m%`b_VRUcvx6SA2aWMzubC7pA#<#Mp z2bRg(>;e)+aLcukN?7%*)SF%d3%FaY4LlPtv>6%Pp`QkrmD)jH9TF4r{_Z-p<%{GfDfL>l3qSmjnkKUSNSemry9iMJlOZ}E%|j(m0Ll4jg6ZY9^ajV4$5 zR&m2BY3la+)eN8lQ^Fp>8c{W7cNUVS%L$;fxeCf4S2$TM70?he< znN$&v_tYp|YnlSx76j`Cx zj4Kfm_%cXAJFk(~hewz+B|hGy#}7J{_~axxkr={XNq!};{Q$=v_9mVAaY((v=&(Ib zn5DQlTAIF~%b2w}(|p;ZlDjPIGH!ML1NlWmxifvbY@XCMu5F|@vwpJE;lK;`*yk5l zAa<{Srz6!eqmUU9nce{Y&`7n+1|C}n0rtDCmKjXwGFzmo3I@W*tdx09j~-c>o;+^< zjZ3oPrG33w`ChE*1oZdE(%w%mZ?sLR<&m|8`z9#)wowr>&aBqrwL7g4rVvp55UMc+ zW889zLR=yh&@y+x&FW@ZV9J6SDKO>FPS{X;_9R`ov}kooO6{cmdmegh)#{(R$X|QY zL55DLHnS``MiU+p-ruK+ zh(L*#q1a~*Co&WW-Cl5VTWL~&i*H#rsBg9libFaw4JfGsLvxKM8hdVAGjBd^5Qp|I z}9+f1N^c57yNFfx06Yy2n#c4P}8O2H5Q#!VGmd9bPBy3^<2bk z)th6?oZhTAYp7MOVU$w_zmLVW(grN2Y~T=)!|lVy2@3uL zYJou#Pz{)wWoxA{OwtfcM>PE7SKYeYmesvBMM zURhSYdzZFJa;M4}-`D4~stkR7DyW^H5+zU{w>$afP!!7~nB`a`UWP0))(Mm>-Evyu z;I)8?c02Pe{?Y|CL*{oLoA=UNpS-YeR=0bbHorzI zUT5tkanD=l#XT=iI6#y3AD|tcIv~F9KOnyMl;AqBZQq`x`z>vM{@}tNJ!W~tqtY|t zp4U%_4R4*NLtlMTy!hk+n&1yU#^gMYw{X*Bry)x*1iQm_d8C?B8}n-&&bDf`DZ+*V z0-ocwrWh>so#C%Qd?eYwX-2`eOxUH&2t0ikN)jdf8{H^%k#e1!C4AV*5mUB3I&JEFi(`t zNom%bVoV(LzL_(bP3C{(Fh+n|I*YA4pgg4D&*j345DK%4m$o|bD#ZU_HtyoRB_oFn zpGXf4?ssk9`K24FtYQ0&OaGJIxa)(wMZK4m%!?Lh(oy0re%@m7)c;~Q+HzeEe^b5z z68HCceL;TXH@qNYSpW`Lzz^fDK_*$;?)2)k(0ZulZevitXycjSwRxlUn@G@U0kLPy z*xKqWcxLh9Bc7DO@493idjj<+v1PFqjVI_(&iaV(io*X@Hyh6}*93i94&Vu{rJJ zRyFUv>MM1YWTlPD&92$<;0E7@1N10YSoPJAk;Pqda^q6Vr!1aYvbpY2%<1GZr8!;5 zzQ*cN-^!b!)$(?3({S@7GgoY;Vdh9PXErO_IAgR*WECVegcqQOhd2X}v{vSj#WdG{ zS6Fk^r8)ki`?k#3Fz@2mGiQ$KLph`r!w1oI(u zi1@@q4a?f7r+isou2wfR(D~x^=iiaS#>a-0?G|5@v)QMKO+qESbUlg39-|C_q%4d# z7*T7(>t(2f3%pJisLTw?7853yQBre;E*_^)IsM)0US%Jg{pcGmNo zP`aj8ZtJqN4>oW&a((U|YD*eX32DuSB{>00!mPF1Yho|CVf!xvAtkdPRu!`!uMBT3 zvEa{;RkX=kxry9~C+gQfzHjrEN1MgFt0oK^HeviQVancTk3IazGe`E!#b@5ES(vc| z7Ght}LO?RZRM=wV6`Wcn|2z8tB%ziBKbs{B9Qb|WzL_*eygZYZi!chI@0>=Q&=b!XcGs&j8FyFgO6%{mZ+Y_%PDX$)64d)Q%@x)c z{yyvbIr@?re1G&+9O4YDE9==9@4Wr&!f zNPAY(t+YhDXj^?-mqkeEK%%gt6%~cI`y2y&aRy^pfzRl=iT)b53#VYZU85Gsft?k(ANS~IMXem)X z%^75IBr*MOddwoVfga)i(1R8cSD;7K?LCr1v*51qw_~_NJ;+3ofgb9^Jl9SdJQR+&X*mZJ#BfN~KvDm@HpgPP*! z`At-Js|X+vVd57-SbZIweO4XDVh*IXv5$@v5(_w_#x~C6i<(W%;uSx4j6c(SoQrC{ z!sXm3qbFubWwpWLN%}VT4CA8t(5R?S1c?VT5W! zIFqV8TlJWQU;Sm2q1J!sL5o^$1bVc&y$8c;V3vu*Bw>}K&YM{60e5qVG*8C>B;wO| zK*H)2@zOj-3G|rNGV*pv7?*Gl-|9h !}#gv~NV!5|5YF|kE)J0y^zWbk4>=%|6F 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 diff --git a/static/homepage/install-test-local.html b/static/homepage/install-test-local.html deleted file mode 100644 index 020d43aefc..0000000000 --- a/static/homepage/install-test-local.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - Install Dev Firefox Screenshots - - - -

      - -

      Dev Firefox Screenshots

      -
      This installs a copy of the add-on that points at this instance of the Screenshots server.
      -
      - -
      - To use this version of the add-on you must: - -
        -
      1. Use Firefox Nightly
      2. -
      3. Open about:config and set: -
          -
        • xpinstall.signatures.required to false
        • -
        • extensions.legacy.enabled to true
        • -
        • extensions.install.requireBuiltInCerts to false
        • -
        • xpinstall.signatures.dev-root to true -
        -
      4. -
      5. Click Install
      6. -
      7. You may have to restart the browser. If shots are uploaded to screeshots.firefox.com instead of this server, then a restart is required.
      8. -
      9. You must use a localized build of Nightly to view the localized add-on.
      10. -
      11. To see information about this server, see __version__
      12. -
      -
      - -
      - Install -
      - - diff --git a/static/js/UITour-lib.js b/static/js/UITour-lib.js deleted file mode 100644 index 465511cc8f..0000000000 --- a/static/js/UITour-lib.js +++ /dev/null @@ -1,772 +0,0 @@ -/* Imported from: -http://searchfox.org/mozilla-central/source/browser/components/uitour/UITour-lib.js -https://raw.githubusercontent.com/mozilla/gecko-dev/f2a1911ad310bf8651f342d719e4f4ca0a7b9bfb/browser/components/uitour/UITour-lib.js -*/ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/* eslint valid-jsdoc: ["error", { "requireReturn": false }] */ - -// create namespace -const Mozilla = Mozilla || {}; - -(function($) { - "use strict"; - - // create namespace - if (typeof Mozilla.UITour === "undefined") { - /** - * Library that exposes an event-based Web API for communicating with the - * desktop browser chrome. It can be used for tasks such as opening menu - * panels and highlighting the position of buttons in the toolbar. - * - *

      For security/privacy reasons `Mozilla.UITour` will only work on a list of allowed - * secure origins. The list of allowed origins can be found in - * {@link https://dxr.mozilla.org/mozilla-central/source/browser/app/permissions| - * browser/app/permissions}.

      - * - * @since 29 - * @namespace - */ - Mozilla.UITour = {}; - } - - let themeIntervalId = null; - function _stopCyclingThemes() { - if (themeIntervalId) { - clearInterval(themeIntervalId); - themeIntervalId = null; - } - } - - function _sendEvent(action, data) { - const event = new CustomEvent("mozUITour", { - bubbles: true, - detail: { - action, - data: data || {}, - }, - }); - - document.dispatchEvent(event); - } - - function _generateCallbackID() { - return Math.random().toString(36).replace(/[^a-z]+/g, ""); - } - - function _waitForCallback(callback) { - const id = _generateCallbackID(); - - function listener(event) { - if (typeof event.detail !== "object") - return; - if (event.detail.callbackID !== id) - return; - - document.removeEventListener("mozUITourResponse", listener); - callback(event.detail.data); - } - document.addEventListener("mozUITourResponse", listener); - - return id; - } - - let notificationListener = null; - function _notificationListener(event) { - if (typeof event.detail !== "object") - return; - if (typeof notificationListener !== "function") - return; - - notificationListener(event.detail.event, event.detail.params); - } - - Mozilla.UITour.DEFAULT_THEME_CYCLE_DELAY = 10 * 1000; - - Mozilla.UITour.CONFIGNAME_SYNC = "sync"; - Mozilla.UITour.CONFIGNAME_AVAILABLETARGETS = "availableTargets"; - - /** - * @typedef {String} Mozilla.UITour.Target - * - * @summary Not all targets are available at all times because they may not be visible - * or UITour doesn't not how to automatically make them visible. Use - * `Mozilla.UITour.getConfiguration('availableTargets', callback)` to determine - * which ones are available at a given time. - * @see Mozilla.UITour.getConfiguration - * @see Mozilla.UITour.showHighlight - * @see Mozilla.UITour.showInfo - * - * @description Valid values:
        - *
      • accountStatus - *
      • addons - *
      • appMenu - *
      • backForward - *
      • bookmarks - *
      • controlCenter-trackingUnblock - *
      • controlCenter-trackingBlock - *
      • customize - *
      • devtools - *
      • forget - *
      • help - *
      • home - *
      • library - *
      • pageActionButton - *
      • pageAction-bookmark - *
      • pageAction-copyURL - *
      • pageAction-emailLink - *
      • pageAction-sendToDevice - *
      • pocket - *
      • privateWindow - *
      • quit - *
      • readerMode-urlBar - *
      • search - *
      • searchIcon - *
      • searchPrefsLink - *
      • selectedTabIcon - *
      • trackingProtection - *
      • urlbar - *
      • webide - *
      - * - * Generate using the following in the Browser Console: - * `[...UITour.targets.keys()].join("\n* <li>")` - */ - - /** - * Ensure the browser is ready to handle this document as a tour. - * - * @param {Function} [callback] Callback to call if UITour is working for the document. - * @since 35 - */ - Mozilla.UITour.ping = function(callback) { - const data = {}; - if (callback) { - data.callbackID = _waitForCallback(callback); - } - _sendEvent("ping", data); - }; - - /** - * @summary Register a listener to observe all UITour notifications. - * - * @description There can only be one observer per tour tab so calling this a second time will - * replace any previous `listener`. - * To remove an observer, call the method with `null` as the first argument. - * - * @param {?Function} listener - Called when any UITour notification occurs. - * @param {Function} [callback] - Called when the browser acknowledges the observer. - */ - Mozilla.UITour.observe = function(listener, callback) { - notificationListener = listener; - - if (listener) { - document.addEventListener("mozUITourNotification", - _notificationListener); - Mozilla.UITour.ping(callback); - } else { - document.removeEventListener("mozUITourNotification", - _notificationListener); - } - }; - - /** - * Register an identifier to use in - * {@link https://wiki.mozilla.org/Telemetry|Telemetry}. `pageID` must be a - * string unique to the page/tour. - * - * @example - * Mozilla.UITour.registerPageID('firstrun-page-firefox-29'); - * - * @param {string} pageID Unique identifier for the page/tour. - * @memberof Mozilla.UITour - */ - Mozilla.UITour.registerPageID = function(pageID) { - _sendEvent("registerPageID", { - pageID, - }); - }; - - /** - * @typedef {String} Mozilla.UITour.HighlightEffect - * - * Specifies the effect/animation to use when highlighting UI elements. - * @description Valid values:
        - *
      • random - *
      • wobble - *
      • zoom - *
      • color - *
      - * - * Generate using the following in the Browser Console: - * [...UITour.highlightEffects].join("\n* <li>") - * @see Mozilla.UITour.showHighlight - */ - - /** - * Visually highlight a UI widget. - * - * @see Mozilla.UITour.hideHighlight - * @example Mozilla.UITour.showHighlight('appMenu', 'wobble'); - * - * @param {Mozilla.UITour.Target} target - Identifier of the UI widget to show a highlight on. - * @param {Mozilla.UITour.HighlightEffect} [effect="none"] - Name of the effect to use when highlighting. - */ - Mozilla.UITour.showHighlight = function(target, effect) { - _sendEvent("showHighlight", { - target, - effect, - }); - }; - - /** - * Hide any visible UI highlight. - * @see Mozilla.UITour.showHighlight - */ - Mozilla.UITour.hideHighlight = function() { - _sendEvent("hideHighlight"); - }; - - /** - * Show an arrow panel with optional images and buttons anchored at a specific UI target. - * - * @see Mozilla.UITour.hideInfo - * - * @param {Mozilla.UITour.Target} target - Identifier of the UI widget to anchor the panel at. - * @param {String} title - Title text to be shown as the heading of the panel. - * @param {String} text - Body text of the panel. - * @param {String} [icon=null] - URL of a 48x48px (96px @ 2dppx) image (which will be resolved - * relative to the tab's URI) to display in the panel. - * @param {Object[]} [buttons=[]] - Array of objects describing buttons. - * @param {String} buttons[].label - Button label - * @param {String} buttons[].icon - Button icon URL - * @param {String} buttons[].style - Button style ("primary" or "link") - * @param {Function} buttons[].callback - Called when the button is clicked - * @param {Object} [options={}] - Advanced options - * @param {Function} options.closeButtonCallback - Called when the panel's close button is clicked. - * - * @example - * var buttons = [ - * { - * label: 'Cancel', - * style: 'link', - * callback: cancelBtnCallback - * }, - * { - * label: 'Confirm', - * style: 'primary', - * callback: confirmBtnCallback - * } - * ]; - * - * var icon = '//mozorg.cdn.mozilla.net/media/img/firefox/australis/logo.png'; - * - * var options = { - * closeButtonCallback: closeBtnCallback - * }; - * - * Mozilla.UITour.showInfo('appMenu', 'my title', 'my text', icon, buttons, options); - */ - Mozilla.UITour.showInfo = function(target, title, text, icon, buttons, options) { - const buttonData = []; - if (Array.isArray(buttons)) { - for (let i = 0; i < buttons.length; i++) { - buttonData.push({ - label: buttons[i].label, - icon: buttons[i].icon, - style: buttons[i].style, - callbackID: _waitForCallback(buttons[i].callback), - }); - } - } - - let closeButtonCallbackID, targetCallbackID; - if (options && options.closeButtonCallback) - closeButtonCallbackID = _waitForCallback(options.closeButtonCallback); - if (options && options.targetCallback) - targetCallbackID = _waitForCallback(options.targetCallback); - - _sendEvent("showInfo", { - target, - title, - text, - icon, - buttons: buttonData, - closeButtonCallbackID, - targetCallbackID, - }); - }; - - /** - * Hide any visible info panels. - * @see Mozilla.UITour.showInfo - */ - Mozilla.UITour.hideInfo = function() { - _sendEvent("hideInfo"); - }; - - /** - * Preview a lightweight-theme applied to the browser UI. - * - * @see Mozilla.UITour.cycleThemes - * @see Mozilla.UITour.resetTheme - * - * @param {Object} theme - Theme object format expected by `LightweightThemeManager.previewTheme` - * @example - * var theme = { - * … - * "iconURL": "https://addons.mozilla.org/_files/…/preview_small.jpg", - * "headerURL": "https://addons.mozilla.org/_files/….jpg", - * "name": "My cool theme", - * "author": "Mozilla", - * "footer": "https://addons.mozilla.org/_files/….jpg", - * "previewURL": "https://addons.mozilla.org/_files/…/preview.jpg", - * "updateURL": "https://versioncheck.addons.mozilla.org/…", - * "accentcolor": "#000000", - * "header": "https://addons.mozilla.org/_files/….jpg", - * "version": "1.0", - * "detailURL": "https://addons.mozilla.org/firefox/addon/…", - * "textcolor": "#ffffff", - * "id": "18066", - * "description": "My awesome theme.", - * … - * }; - * - * Mozilla.UITour.previewTheme(theme); - */ - Mozilla.UITour.previewTheme = function(theme) { - _stopCyclingThemes(); - - _sendEvent("previewTheme", { - theme: JSON.stringify(theme), - }); - }; - - /** - * Stop previewing and cycling themes, returning to the user's previous theme. - * @see Mozilla.UITour.cycleThemes - * @see Mozilla.UITour.previewTheme - */ - Mozilla.UITour.resetTheme = function() { - _stopCyclingThemes(); - - _sendEvent("resetTheme"); - }; - - /** - * Cycle between an array of themes using the given delay. - * - * @see Mozilla.UITour.previewTheme - * @see Mozilla.UITour.resetTheme - * - * @param {Object[]} themes - Array of themes - * @param {Number} [delay=Mozilla.UITour.DEFAULT_THEME_CYCLE_DELAY] - * - Time in milliseconds between rotating themes - * @param {Function} callback - Function called at each rotation - */ - Mozilla.UITour.cycleThemes = function(themes, delay, callback) { - _stopCyclingThemes(); - - if (!delay) { - delay = Mozilla.UITour.DEFAULT_THEME_CYCLE_DELAY; - } - - function nextTheme() { - const theme = themes.shift(); - themes.push(theme); - - _sendEvent("previewTheme", { - theme: JSON.stringify(theme), - state: true, - }); - - callback(theme); - } - - themeIntervalId = setInterval(nextTheme, delay); - nextTheme(); - }; - - /** - * @typedef {String} Mozilla.UITour.MenuName - * Valid values:
        - *
      • appMenu - *
      • bookmarks - *
      • controlCenter - *
      • pocket - *
      - * - * @see Mozilla.UITour.showMenu - * @see Mozilla.UITour.hideMenu - * @see Mozilla.UITour.openSearchPanel - */ - - /** - * Open the named application menu. - * - * @see Mozilla.UITour.hideMenu - * - * @param {Mozilla.UITour.MenuName} name - Menu name - * @param {Function} [callback] - Callback to be called with no arguments when - * the menu opens. - * - * @example - * Mozilla.UITour.showMenu('appMenu', function() { - * console.log('menu was opened'); - * }); - */ - Mozilla.UITour.showMenu = function(name, callback) { - let showCallbackID; - if (callback) - showCallbackID = _waitForCallback(callback); - - _sendEvent("showMenu", { - name, - showCallbackID, - }); - }; - - /** - * Close the named application menu. - * - * @see Mozilla.UITour.showMenu - * - * @param {Mozilla.UITour.MenuName} name - Menu name - */ - Mozilla.UITour.hideMenu = function(name) { - _sendEvent("hideMenu", { - name, - }); - }; - - /** - * Loads about:newtab in the tour tab. - * @since 51 - */ - Mozilla.UITour.showNewTab = function() { - _sendEvent("showNewTab"); - }; - - - /** - * @typedef Mozilla.UITour.ConfigurationName - * @description Valid values:
        - *
      • {@link Mozilla.UITour.Configuration.AppInfo|appinfo}
      • - *
      • {@link Mozilla.UITour.Configuration.CanReset|canReset}
      • - *
      • {@link Mozilla.UITour.Configuration.AvailableTargets|availableTargets}
      • - *
      • {@link Mozilla.UITour.Configuration.Search|search}
      • - *
      • {@link Mozilla.UITour.Configuration.Search|selectedSearchEngine} - * - DEPRECATED, use 'search'
      • - *
      • {@link Mozilla.UITour.Configuration.Sync|sync}
      • - *
      - */ - - /** - * @namespace Mozilla.UITour.Configuration - * @see Mozilla.UITour.getConfiguration - * @see Mozilla.UITour.ConfigurationName - */ - - /** - * Indicate whether a user can refresh their Firefox profile via {@link Mozilla.UITour.resetFirefox}. - * @typedef {Boolean} Mozilla.UITour.Configuration.CanReset - * @see Mozilla.UITour.resetFirefox - * @since 48 - */ - - /** - * @typedef {Object} Mozilla.UITour.Configuration.AppInfo - * @property {Boolean} canSetDefaultBrowserInBackground - Whether the application can be set as - * the default browser in the background - * without user interaction. - * @property {Boolean} defaultBrowser - Whether the application is the default browser. Since Fx40. - * @property {String} defaultUpdateChannel - Update channel e.g. 'release', 'beta', 'aurora', - * 'nightly', 'default' - * (self-built or automated testing builds) - * @property {String} distribution - Contains the distributionId property. This value will be - * "default" in most cases but can differ for repack or - * funnelcake builds. Since Fx48 - * @property {Number} profileCreatedWeeksAgo - The number of weeks since the profile was created, - * starting from 0 for profiles dating less than - * seven days old. Since Fx56. - * @property {Number} profileResetWeeksAgo - The number of weeks since the profile was last reset, - * starting from 0 for profiles reset less than seven - * days ago. If the profile has never been reset it - * returns null. Since Fx56. - * @property {String} version - Version string e.g. "48.0a2" - * @since 35 - */ - - /** - * @summary Search service configuration. - * - * @description From version 34 through 42 inclusive, a string was returned for the 'selectedSearchEngine' - * configuration instead of the object like 'search'. - * - * @typedef {String|Object} Mozilla.UITour.Configuration.Search - * @property {String} searchEngineIdentifier - The default engine's identifier - * @property {String[]} engines - Identifiers of visible engines - * @since 43 - */ - - /** - * Sync status and device counts. - * @typedef {Object} Mozilla.UITour.Configuration.Sync - * @property {Boolean} setup - Whether sync is setup - * @property {Number} desktopDevices - Number of desktop devices - * @property {Number} mobileDevices - Number of mobile devices - * @property {Number} totalDevices - Total number of connected devices - * @since 50 - */ - - /** - * Array of UI {@link Mozilla.UITour.Target|Targets} currently available to be annotated. - * @typedef {Mozilla.UITour.Target[]} Mozilla.UITour.Configuration.AvailableTargets - */ - - /** - * Retrieve some information about the application/profile. - * - * @param {Mozilla.UITour.ConfigurationName} configName - Name of configuration to retrieve - * @param {Function} callback - Called with one argument containing the value of the configuration. - */ - Mozilla.UITour.getConfiguration = function(configName, callback) { - _sendEvent("getConfiguration", { - callbackID: _waitForCallback(callback), - configuration: configName, - }); - }; - - /** - * Set some value or take some action. - * - *

      Valid configuration names:

      - *
      defaultBrowser
      - *
      Try to set the application as the default web browser. Since Fx40
      - *

      - * - * @param {String} configName - Configuration name to set (e.g. "defaultBrowser") - * @param {String|Number|Boolean} [configValue] - Not currently used - * - * @since 40 - * @example - * Mozilla.UITour.setConfiguration('defaultBrowser'); - */ - Mozilla.UITour.setConfiguration = function(configName, configValue) { - _sendEvent("setConfiguration", { - configuration: configName, - value: configValue, - }); - }; - - /** - * Request the browser open the Firefox Accounts page. - * - * @param {Object} extraURLCampaignParams - An object containing additional - * parameters for the URL opened by the browser for reasons of promotional - * campaign tracking. Each attribute of the object must have a name that - * is a string, begins with "utm_" and contains only only alphanumeric - * characters, dashes or underscores. The values may be any string and will - * automatically be encoded. - * @param {String} email - A string containing the default email account - * for the URL opened by the browser. - * @since 31, 47 for `extraURLCampaignParams` - * @example - * // Will open about:accounts?action=signup&entrypoint=uitour - * Mozilla.UITour.showFirefoxAccounts(); - * @example - * // Will open: - * // about:accounts?action=signup&entrypoint=uitour&utm_foo=bar&utm_bar=baz - * Mozilla.UITour.showFirefoxAccounts({ - * 'utm_foo': 'bar', - * 'utm_bar': 'baz' - * }); - * @example - * // Will open: - * // about:accounts?action=signup&entrypoint=uitour&email=foo%40bar.com - * Mozilla.UITour.showFirefoxAccounts(null, "foo@bar.com"); - */ - Mozilla.UITour.showFirefoxAccounts = function(extraURLCampaignParams, email) { - _sendEvent("showFirefoxAccounts", { - extraURLCampaignParams: JSON.stringify(extraURLCampaignParams), - email, - }); - }; - - /** - * Show a profile refresh/reset dialog, allowing users to choose to reomve - * add-ons and customizations as well as restore browser defaults, if possible. - * `getConfiguration('canReset')` should first be used to determine whether - * Refresh/Reset is possible for the user's build/profile. - * @since 48 - * @see Mozilla.UITour.Configuration.CanReset - */ - Mozilla.UITour.resetFirefox = function() { - _sendEvent("resetFirefox"); - }; - - /** - * Add the specified customizable widget to the navigation toolbar. - * - * @param {Mozilla.UITour.Target} name - Identifier of the customizable widget. - * @param {Function} callback - Called with no arguments once the icon was successfully added to - * the toolbar. Not called if it doesn't succeed. - * @since 33.1 - * @example - * Mozilla.UITour.addNavBarWidget('forget', function () { - * console.log('forget button added to toolbar'); - * }); - */ - Mozilla.UITour.addNavBarWidget = function(name, callback) { - _sendEvent("addNavBarWidget", { - name, - callbackID: _waitForCallback(callback), - }); - }; - - /** - * Set the specified search engine as the user-set default. - * - * @see {@link https://dxr.mozilla.org/mozilla-release/source/browser/locales/search/list.json} - * - * @param {String} identifier - Identifier of the engine (e.g. 'yahoo'). - * @see Mozilla.UITour.Configuration.Search - * @since 34 - */ - Mozilla.UITour.setDefaultSearchEngine = function(identifier) { - _sendEvent("setDefaultSearchEngine", { - identifier, - }); - }; - - /** - * Sets a key+value pair as a treatment tag for recording in FHR. - * @param {String} name - tag name for the treatment - * @param {String} value - tag value for the treatment - * @since 34 - * @see Mozilla.UITour.getTreatmentTag - * @example - * Mozilla.UITour.setTreatmentTag('srch-chg-action', 'Switch'); - */ - Mozilla.UITour.setTreatmentTag = function(name, value) { - _sendEvent("setTreatmentTag", { - name, - value, - }); - }; - - /** - * Retrieved the value for a set FHR treatment tag. - * - * @param {String} name - Tag name to be retrieved - * @param {Function} callback - Called once the data has been retrieved - * @since 34 - * @see Mozilla.UITour.setTreatmentTag - * @example - * Mozilla.UITour.getTreatmentTag('srch-chg-action', function(value) { - * console.log(value); - * }); - */ - Mozilla.UITour.getTreatmentTag = function(name, callback) { - _sendEvent("getTreatmentTag", { - name, - callbackID: _waitForCallback(callback), - }); - }; - - /** - * Set the search term in the search box. - * - * This should have been implemented via `setConfiguration("searchTerm", …)`. - * - * @param {String} term - Search string e.g. 'Firefox' - * @since 34 - */ - Mozilla.UITour.setSearchTerm = function(term) { - _sendEvent("setSearchTerm", { - term, - }); - }; - - /** - * @summary Opens the search box's panel. - * - * @description This should have been implemented via `showMenu("search", …)`. - * - * @param {Function} callback - Called once the panel has opened. - * @since 34 - */ - Mozilla.UITour.openSearchPanel = function(callback) { - _sendEvent("openSearchPanel", { - callbackID: _waitForCallback(callback), - }); - }; - - /** - * @summary Force the reader mode icon to appear in the address bar regardless of whether - * heuristics determine it's appropriate. - * - * @description This is useful if you want to target an annotation (panel/highlight) on it - * but the tour page doesn't have much textual content. - */ - Mozilla.UITour.forceShowReaderIcon = function() { - _sendEvent("forceShowReaderIcon"); - }; - - /** - * Toggle into reader mode for the current tab. Once the user enters reader - * mode, the UITour document will not be active and therefore cannot call other - * UITour APIs. - */ - Mozilla.UITour.toggleReaderMode = function() { - _sendEvent("toggleReaderMode"); - }; - - /** - * @param {String} pane - Pane to open/switch the preferences to. - * Valid values match fragments on about:preferences and are subject to change e.g.: - * - *
        - * For the Preferences - *
      • general - *
      • applications - *
      • sync - *
      • privacy - *
      • advanced - *
      - * - * To open to the options of sending telemetry, health report, crach reports, - * that is, the privcacy pane > reports on the preferences. - * Please call `Mozilla.UITour.openPreferences("privacy-reports")`. - * UITour would do route mapping automatically. - * - * @since 42 - */ - Mozilla.UITour.openPreferences = function(pane) { - _sendEvent("openPreferences", { - pane, - }); - }; - - /** - * @summary Closes the tab where this code is running. As usual, if the tab is in the - * foreground, the tab that was displayed before is selected. - * - * @description The last tab in the current window will never be closed, in which case - * this call will have no effect. The calling code is expected to take an - * action after a small timeout in order to handle this case, for example by - * displaying a goodbye message or a button to restart the tour. - * @since 46 - */ - Mozilla.UITour.closeTab = function() { - _sendEvent("closeTab"); - }; -})(); - -// Make this library Require-able. -/* eslint-env commonjs */ -if (typeof module !== "undefined" && module.exports) { - module.exports = Mozilla.UITour; -} diff --git a/static/js/parent-helper.js b/static/js/parent-helper.js deleted file mode 100644 index 3e6073dfad..0000000000 --- a/static/js/parent-helper.js +++ /dev/null @@ -1,68 +0,0 @@ -/* global console,CONTENT_HOSTING_ORIGIN */ - -let loaded = false; -let height = null; - -function sendToChild(message) { - if (!sendToChild.childReference) { - sendToChild.queue.push(message); - return; - } - sendToChild.childReference.postMessage(message, CONTENT_HOSTING_ORIGIN); -} - -sendToChild.queue = []; - -function doResize() { - document.getElementById("frame").height = height; -} - -window.onmessage = function(m) { - if (m.origin !== CONTENT_HOSTING_ORIGIN) { - console.warn("Parent iframe received message from unexpected origin:", m.origin, "instead of", CONTENT_HOSTING_ORIGIN); - return; - } - if (!sendToChild.childReference) { - sendToChild.childReference = m.source; - while (sendToChild.queue.length) { - const msg = sendToChild.queue.shift(); - sendToChild(msg); - } - } - const message = m.data; - const type = message.type; - if (!type) { - console.warn("Parent iframe received message with no type:", message); - return; - } - if (type === "setHeight") { - setHeight(message.height); - } else if (type === "scrollToMiddle") { - scrollPageToMiddle(message.position); - } else { - console.warn("Parent iframe received message with unknown .type:", message); - } -}; - -function setHeight(h) { - height = h; - if (loaded) { - doResize(); - } -} - -function scrollPageToMiddle(pos) { - const frameOffset = document.getElementById("frame").getBoundingClientRect().top + window.scrollY; - const toolbarHeight = document.getElementById("toolbar").clientHeight; - const visibleHeight = window.innerHeight - toolbarHeight; - const frameTop = frameOffset - toolbarHeight; - const scrollY = frameTop + (pos.top + pos.bottom) / 2 - (visibleHeight / 2); - window.scroll(0, scrollY); -} - -window.addEventListener("load", function() { - loaded = true; - if (height) { - doResize(); - } -}); diff --git a/static/js/wantsauth.js b/static/js/wantsauth.js deleted file mode 100644 index 799232c63f..0000000000 --- a/static/js/wantsauth.js +++ /dev/null @@ -1,93 +0,0 @@ -/* globals Raven */ -/** This allows for early communication with the add-on to ask for authentication information - Including this script on a page indicates that the page would like to be authenticated - (and that it isn't currently authenticated) - - A controller might use this like: - - if (window.wantsauth) { - if (window.wantsauth.getAuthData()) { - add window.wantsauth.getAuthData() to model - } else { - window.wantsauth.addAuthDataListener((data) => { - add data to model - }); - } - } -*/ -window.wantsauth = (function() { - const exports = {}; - - let savedAuthData = null; - const authDataCallbacks = []; - - // Note that this module is only loosely bound to any controller, but there - // is special logic for view pages where ownership is interesting in addition to - // authentication. As a result we have to parse the URL on our own: - let maybeShotId = location.href.replace(/^https?:\/\/[^/]{1,4000}\//i, ""); - maybeShotId = maybeShotId.replace(/\?.*/, "").replace(/#.{0,4000}/, ""); - if (maybeShotId.search(/[a-z0-9]+\/[a-z0-9._-]{1,4000}$/i) === -1) { - // Not a shot ID, which should look like {stuff}/{stuff} - maybeShotId = null; - } - - // These events are used to communicate with sitehelper.js: - document.addEventListener("login-successful", (event) => { - const {deviceId, isOwner, accountId, backupCookieRequest} = JSON.parse(event.detail); - savedAuthData = { - deviceId, - isOwner, - loginFailed: false, - accountId, - }; - - let promise = Promise.resolve(true); - if (!backupCookieRequest) { - // The client may not support login with third party cookies turned off. - // We will do a request to confirm authentication really worked. - promise = checkLogin(); - } - promise.then((loginWorked) => { - if (!loginWorked) { - savedAuthData.loginFailed = true; - } - }, (e) => { // Exception branch - console.warn("Error checking login:", e); - savedAuthData.loginFailed = true; - if (typeof Raven !== "undefined") { - Raven.captureException(e); - } - }).then(() => { - for (const callback of authDataCallbacks) { - callback(savedAuthData); - } - }).catch((e) => { - if (typeof Raven !== "undefined") { - Raven.captureException(e); - } - }); - }); - - function checkLogin() { - return fetch("/api/check-login-cookie", {credentials: "include"}).then((resp) => { - // The server only returns 200 if the user is logged in - return resp.ok; - }); - } - - document.addEventListener("addon-present", () => { - document.dispatchEvent(new CustomEvent("request-login", {detail: maybeShotId})); - }); - - document.dispatchEvent(new CustomEvent("request-addon-present")); - - exports.getAuthData = function() { - return savedAuthData; - }; - - exports.addAuthDataListener = function(func) { - authDataCallbacks.push(func); - }; - - return exports; -})(); diff --git a/webextension/background/main.js b/webextension/background/main.js index 242bcb0a0e..3944e2b323 100644 --- a/webextension/background/main.js +++ b/webextension/background/main.js @@ -217,21 +217,11 @@ this.main = (function() { }); }); - // A Screenshots page wants us to start/force onboarding - communication.register("requestOnboarding", (sender) => { - return startSelectionWithOnboarding(sender.tab); - }); - communication.register("getPlatformOs", () => { return catcher.watchPromise(browser.runtime.getPlatformInfo().then(platformInfo => { return platformInfo.os; })); }); - // This allows the web site show notifications through sitehelper.js - communication.register("showNotification", (sender, notification) => { - return browser.notifications.create(notification); - }); - return exports; })(); diff --git a/webextension/manifest.json.template b/webextension/manifest.json.template index 6d31f28a48..c148cf86b5 100644 --- a/webextension/manifest.json.template +++ b/webextension/manifest.json.template @@ -27,18 +27,6 @@ "description": "Open the Firefox Screenshots UI" } }, - "content_scripts": [ - { - "matches": ["http://localhost/*"], - "js": [ - "build/buildSettings.js", - "log.js", - "catcher.js", - "selector/callBackground.js", - "sitehelper.js" - ] - } - ], "page_action": { "browser_style": true, "default_icon" : { diff --git a/webextension/sitehelper.js b/webextension/sitehelper.js deleted file mode 100644 index c4d5eb4b94..0000000000 --- a/webextension/sitehelper.js +++ /dev/null @@ -1,94 +0,0 @@ -/* globals catcher, callBackground, content */ -/** This is a content script added to all screenshots.firefox.com pages, and allows the site to - communicate with the add-on */ - -"use strict"; - -this.sitehelper = (function() { - - // This gives us the content's copy of XMLHttpRequest, instead of the wrapped - // copy that this content script gets: - const ContentXMLHttpRequest = content.XMLHttpRequest; - - catcher.registerHandler((errorObj) => { - callBackground("reportError", errorObj); - }); - - - const capabilities = {}; - function registerListener(name, func) { - capabilities[name] = name; - document.addEventListener(name, func); - } - - function sendCustomEvent(name, detail) { - if (typeof detail === "object") { - // Note sending an object can lead to security problems, while a string - // is safe to transfer: - detail = JSON.stringify(detail); - } - document.dispatchEvent(new CustomEvent(name, {detail})); - } - - /** Set the cookie, even if third-party cookies are disabled in this browser - (when they are disabled, login from the background page won't set cookies) */ - function sendBackupCookieRequest(authHeaders) { - // See https://bugzilla.mozilla.org/show_bug.cgi?id=1295660 - // This bug would allow us to access window.content.XMLHttpRequest, and get - // a safer (not overridable by content) version of the object. - - // This is a very minimal attempt to verify that the XMLHttpRequest object we got - // is legitimate. It is not a good test. - if (Object.toString.apply(ContentXMLHttpRequest) !== "function XMLHttpRequest() {\n [native code]\n}") { - console.warn("Insecure copy of XMLHttpRequest"); - return; - } - const req = new ContentXMLHttpRequest(); - req.open("POST", "/api/set-login-cookie"); - for (const name in authHeaders) { - req.setRequestHeader(name, authHeaders[name]); - } - req.send(""); - req.onload = () => { - if (req.status !== 200) { - console.warn("Attempt to set Screenshots cookie via /api/set-login-cookie failed:", req.status, req.statusText, req.responseText); - } - }; - } - - registerListener("delete-everything", catcher.watchFunction((event) => { - // FIXME: reset some data in the add-on - }, false)); - - registerListener("request-login", catcher.watchFunction((event) => { - const shotId = event.detail; - catcher.watchPromise(callBackground("getAuthInfo", shotId || null).then((info) => { - if (info) { - sendBackupCookieRequest(info.authHeaders); - sendCustomEvent("login-successful", {deviceId: info.deviceId, accountId: info.accountId, isOwner: info.isOwner, backupCookieRequest: true}); - } - })); - })); - - registerListener("request-onboarding", catcher.watchFunction((event) => { - callBackground("requestOnboarding"); - })); - - registerListener("copy-to-clipboard", catcher.watchFunction(event => { - catcher.watchPromise(callBackground("copyShotToClipboard", event.detail)); - })); - - registerListener("show-notification", catcher.watchFunction(event => { - catcher.watchPromise(callBackground("showNotification", event.detail)); - })); - - // Depending on the script loading order, the site might get the addon-present event, - // but probably won't - instead the site will ask for that event after it has loaded - registerListener("request-addon-present", catcher.watchFunction(() => { - sendCustomEvent("addon-present", capabilities); - })); - - sendCustomEvent("addon-present", capabilities); - -})(); -null; From 39fbe91f7998cc1c3b78265468c7871f140f0639 Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Fri, 22 Mar 2019 14:21:48 -0500 Subject: [PATCH 05/15] Mark some strings as unneeded --- locales/en-US/webextension.properties | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/locales/en-US/webextension.properties b/locales/en-US/webextension.properties index e167f51c0c..d70d194bd9 100644 --- a/locales/en-US/webextension.properties +++ b/locales/en-US/webextension.properties @@ -1,33 +1,46 @@ # Clip in this context refers to a portion of an image +# FIXME-server: string isn't good addonDescription = Take clips and screenshots from the Web and save them temporarily or permanently. addonAuthorsList = Mozilla # Also used for the title on the toolbar button contextMenuLabel = Take a Screenshot +# FIXME-server: remove string myShotsLink = My Shots screenshotInstructions = Drag or click on the page to select a region. Press ESC to cancel. +# FIXME-server: remove saveScreenshotSelectedArea = Save +# FIXME-server: remove uploadScreenshotSelectedArea = Upload saveScreenshotVisibleArea = Save visible saveScreenshotFullPage = Save full page cancelScreenshot = Cancel downloadScreenshot = Download downloadScreenshotTitle = Download screenshot +# FIXME-server: remove downloadOnlyNotice = You are currently in Download-Only mode. # The downloadOnlyDetails string introduces a list of items. The keys # downloadOnlyDetailsPrivate, downloadOnlyDetailsThirdParty, # downloadOnlyDetailsNeverRemember, downloadOnlyDetailsESR, and # downloadOnlyDetailsNoUploadPref are list items in that list. +# FIXME-server: remove downloadOnlyDetails = Firefox Screenshots automatically changes to Download-Only mode in these situations: +# FIXME-server: remove downloadOnlyDetailsPrivate = In a Private Browsing window. +# FIXME-server: remove downloadOnlyDetailsThirdParty = Third-party cookies are disabled. +# FIXME-server: remove downloadOnlyDetailsNeverRemember = “Never remember history” is enabled. +# FIXME-server: remove downloadOnlyDetailsESR = You are using Firefox ESR. +# FIXME-server: remove downloadOnlyDetailsNoUploadPref = Uploads have been disabled. +# FIXME-server: remove notificationLinkCopiedTitle = Link Copied # The string "{meta_key}-V" should be translated to the region-specific # shorthand for the Paste keyboard shortcut. {meta_key} is a placeholder for the # modifier key used in the shortcut (do not translate it): for example, Ctrl-V # on Windows systems. +# FIXME-server: remove notificationLinkCopiedDetails = The link to your shot has been copied to the clipboard. Press {meta_key}-V to paste. # This is a verb, as in "Copy image to the system clipboard." copyScreenshot = Copy @@ -40,21 +53,30 @@ notificationImageCopiedTitle = Shot Copied notificationImageCopiedDetails = Your shot has been copied to the clipboard. Press {meta_key}-V to paste. # This is displayed as a warning when a Full Page save will be cropped. # {pixels} will be a number like 5000. +# FIXME-server: remove (I think?) imageCropPopupWarning = Saved image will be cropped to {pixels}px in height. # Section for error strings # "Out of order" is an humorous way to indicate that the service is not working # properly. +# FIXME-server: remove requestErrorTitle = Out of order. +# FIXME-server: remove requestErrorDetails = Sorry! We couldn’t save your shot. Please try again later. +# FIXME-server: remove connectionErrorTitle = We can’t connect to your screenshots. +# FIXME-server: remove connectionErrorDetails = Please check your Internet connection. If you are able to connect to the Internet, there may be a temporary problem with the Firefox Screenshots service. +# FIXME-server: remove loginErrorDetails = We couldn’t save your shot because there is a problem with the Firefox Screenshots service. Please try again later. unshootablePageErrorTitle = We can’t screenshot this page. unshootablePageErrorDetails = This isn’t a standard Web page, so you can’t take a screenshot of it. +# FIXME-server: remove selfScreenshotErrorTitle = You can’t take a shot of a Firefox Screenshots page! # Fired when someone makes a zero-width or zero-height selection emptySelectionErrorTitle = Your selection is too small +# FIXME-server: remove (maybe?) privateWindowErrorTitle = Screenshots is disabled in Private Browsing Mode +# FIXME-server: remove (maybe?) privateWindowErrorDetails = Sorry for the inconvenience. We are working on this feature for future releases. genericErrorTitle = Whoa! Firefox Screenshots went haywire. genericErrorDetails = We’re not sure what just happened. Care to try again or take a shot of a different page? @@ -83,4 +105,5 @@ termsAndPrivacyNoticeTermsLink = Terms # This string is used as the text for a link in termsAndPrivacyNoticeCloudServices termsAndPrivacyNoticyPrivacyLink = Privacy Notice # This string is used to label the item in the Library panel that opens the screenshots page +# FIXME-server: remove libraryLabel = Screenshots From 3ab92cabda78a0c934d1fdc7df44f65880ffcae8 Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Fri, 22 Mar 2019 14:22:02 -0500 Subject: [PATCH 06/15] Remove webexperiment code --- webextension/experiments/screenshots/api.js | 115 ------------------ .../experiments/screenshots/schema.json | 36 ------ webextension/manifest.json.template | 12 +- 3 files changed, 1 insertion(+), 162 deletions(-) delete mode 100644 webextension/experiments/screenshots/api.js delete mode 100644 webextension/experiments/screenshots/schema.json diff --git a/webextension/experiments/screenshots/api.js b/webextension/experiments/screenshots/api.js deleted file mode 100644 index d3c5fe314c..0000000000 --- a/webextension/experiments/screenshots/api.js +++ /dev/null @@ -1,115 +0,0 @@ -/* globals browser, AppConstants, CustomizableUI, ExtensionCommon, Services, ExtensionAPI */ - -"use strict"; - -ChromeUtils.defineModuleGetter(this, "AppConstants", - "resource://gre/modules/AppConstants.jsm"); -ChromeUtils.defineModuleGetter(this, "CustomizableUI", - "resource:///modules/CustomizableUI.jsm"); -ChromeUtils.defineModuleGetter(this, "ExtensionCommon", - "resource://gre/modules/ExtensionCommon.jsm"); -ChromeUtils.defineModuleGetter(this, "PageActions", - "resource:///modules/PageActions.jsm"); -ChromeUtils.defineModuleGetter(this, "Services", - "resource://gre/modules/Services.jsm"); - -const LibraryButton = { - ITEM_ID: "appMenu-library-screenshots", - - init(webExtension) { - this._initialized = true; - const permissionPages = [...webExtension.permissions].filter(p => (/^https?:\/\//i).test(p)); - if (permissionPages.length > 1) { - Cu.reportError(new Error("Should not have more than 1 permission page, but got: " + JSON.stringify(permissionPages))); - } - this.PAGE_TO_OPEN = permissionPages.length === 1 ? permissionPages[0].replace(/\*$/, "") : "https://screenshots.firefox.com/"; - this.PAGE_TO_OPEN += "shots"; - this.ICON_URL = webExtension.getURL("icons/icon-v2.svg"); - this.LABEL = webExtension.localizeMessage("libraryLabel"); - CustomizableUI.addListener(this); - for (const win of CustomizableUI.windows) { - this.onWindowOpened(win); - } - }, - - uninit() { - if (!this._initialized) { - return; - } - for (const win of CustomizableUI.windows) { - const item = win.document.getElementById(this.ITEM_ID); - if (item) { - item.remove(); - } - } - CustomizableUI.removeListener(this); - this._initialized = false; - }, - - onWindowOpened(win) { - const libraryViewInsertionPoint = win.document.getElementById("appMenu-library-remotetabs-button"); - // If the library view doesn't exist (on non-photon builds, for instance), - // this will be null, and we bail out early. - if (!libraryViewInsertionPoint) { - return; - } - const parent = libraryViewInsertionPoint.parentNode; - const {nextSibling} = libraryViewInsertionPoint; - const item = win.document.createXULElement("toolbarbutton"); - item.className = "subviewbutton subviewbutton-iconic"; - item.addEventListener("command", () => win.openWebLinkIn(this.PAGE_TO_OPEN, "tab")); - item.id = this.ITEM_ID; - const iconURL = this.ICON_URL; - item.setAttribute("image", iconURL); - item.setAttribute("label", this.LABEL); - - parent.insertBefore(item, nextSibling); - }, -}; - -this.screenshots = class extends ExtensionAPI { - getAPI(context) { - const {extension} = context; - return { - experiments: { - screenshots: { - // If you are checking for 'nightly', also check for 'nightly-try'. - // - // Otherwise, just use the standard builds, but be aware of the many - // non-standard options that also exist (as of August 2018). - // - // Standard builds: - // 'esr' - ESR channel - // 'release' - release channel - // 'beta' - beta channel - // 'nightly' - nightly channel - // Non-standard / deprecated builds: - // 'aurora' - deprecated aurora channel (still observed in dxr) - // 'default' - local builds from source - // 'nightly-try' - nightly Try builds (QA may occasionally need to test with these) - getUpdateChannel() { - return AppConstants.MOZ_UPDATE_CHANNEL; - }, - isHistoryEnabled() { - return Services.prefs.getBoolPref("places.history.enabled", true); - }, - isUploadDisabled() { - return Services.prefs.getBoolPref("extensions.screenshots.upload-disabled", false); - }, - initLibraryButton() { - context.callOnClose({ - close: () => { - try { - LibraryButton.uninit(); - } catch (ex) { - Services.console.logStringMessage("Firefox Screenshots LibraryButton shutdown error: ", ex); - } - }, - }); - return LibraryButton.init(extension); - }, - }, - }, - }; - } -}; diff --git a/webextension/experiments/screenshots/schema.json b/webextension/experiments/screenshots/schema.json deleted file mode 100644 index 7a95646d5a..0000000000 --- a/webextension/experiments/screenshots/schema.json +++ /dev/null @@ -1,36 +0,0 @@ -[ - { - "namespace": "experiments.screenshots", - "description": "Firefox Screenshots internal API", - "functions": [ - { - "name": "getUpdateChannel", - "type": "function", - "description": "Returns the Firefox channel (AppConstants.MOZ_UPDATE_CHANNEL)", - "parameters": [], - "async": true - }, - { - "name": "isHistoryEnabled", - "type": "function", - "description": "Returns the value of the 'places.history.enabled' preference", - "parameters": [], - "async": true - }, - { - "name": "isUploadDisabled", - "type": "function", - "description": "Returns the value of the 'extensions.screenshots.upload-disabled' preference", - "parameters": [], - "async": true - }, - { - "name": "initLibraryButton", - "type": "function", - "description": "Initializes the Photon-based Library menu item for Screenshots", - "parameters": [], - "async": true - } - ] - } -] diff --git a/webextension/manifest.json.template b/webextension/manifest.json.template index c148cf86b5..149adbc973 100644 --- a/webextension/manifest.json.template +++ b/webextension/manifest.json.template @@ -73,15 +73,5 @@ "", "resource://pdf.js/", "about:reader*" - ], - "experiment_apis": { - "screenshots": { - "schema": "experiments/screenshots/schema.json", - "parent": { - "scopes": ["addon_parent"], - "script": "experiments/screenshots/api.js", - "paths": [["experiments", "screenshots"]] - } - } - } + ] } From fe8a294490f886404e56a52a2e4698cc353b6fa7 Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Fri, 22 Mar 2019 14:26:50 -0500 Subject: [PATCH 07/15] Remove static/img which was only used by server --- Makefile | 3 --- static/img/annotation-highlight-active.svg | 1 - static/img/annotation-highlight.svg | 1 - static/img/annotation-pen-active.svg | 1 - static/img/annotation-pen.svg | 1 - static/img/annotation-redo.svg | 1 - static/img/annotation-text.svg | 1 - static/img/arrowhead-left-16.svg | 1 - static/img/arrowhead-right-16.svg | 1 - static/img/banner-back.svg | 1 - static/img/banner-front.svg | 1 - static/img/btn-email.svg | 1 - static/img/btn-fb.svg | 1 - static/img/btn-pinterest.svg | 1 - static/img/btn-twitter.svg | 1 - static/img/close-16.svg | 1 - static/img/crop.svg | 1 - static/img/cursor-highlight.png | Bin 625 -> 0 bytes static/img/cursor-pen.png | Bin 580 -> 0 bytes static/img/default-profile.svg | 1 - static/img/download-sprite.svg | 1 - static/img/download-white.svg | 1 - static/img/edit-highlight.svg | 1 - static/img/favicon-16.png | Bin 307 -> 0 bytes static/img/favicon-32.png | Bin 459 -> 0 bytes static/img/favicon.svg | 1 - static/img/firefox-logo.svg | 1 - static/img/fxa-sync.svg | 1 - static/img/github-icon.svg | 1 - static/img/glyph-history-16.svg | 1 - static/img/glyph-stop-16.svg | 1 - static/img/icon-clear.svg | 1 - static/img/icon-copy.svg | 1 - static/img/icon-download.svg | 1 - static/img/icon-dropdown.svg | 1 - static/img/icon-edit.svg | 1 - static/img/icon-heart-outline.svg | 1 - static/img/icon-heart.svg | 1 - static/img/icon-pen.svg | 1 - static/img/icon-promo.svg | 1 - static/img/icon-screenshot.svg | 1 - static/img/icon-search.svg | 1 - static/img/icon-settings.svg | 1 - static/img/icon-share-alternate.svg | 1 - static/img/icon-share.svg | 1 - static/img/icon-shots.svg | 1 - static/img/icon-sprite.svg | 1 - static/img/icon-sync.svg | 1 - static/img/icon-trash.svg | 1 - static/img/image-expired_screenshots.svg | 1 - static/img/image-nope_screenshots.svg | 1 - static/img/image-noshots_screenshots.svg | 1 - static/img/image-search_screenshots.svg | 1 - static/img/landing-Screenshot-logo.svg | 1 - static/img/landing-download-icon@2x.png | Bin 213 -> 0 bytes static/img/landing-icon-chrome.svg | 1 - static/img/landing-icon-github.svg | 1 - static/img/landing-icon-screenshots.svg | 1 - static/img/landing-icon-twitter.svg | 1 - static/img/landing-screenshots_image_01.svg | 1 - static/img/landing-screenshots_image_01_57.svg | 1 - static/img/landing-screenshots_image_02.svg | 1 - static/img/landing-screenshots_image_03.svg | 1 - static/img/landing-screenshots_image_04.svg | 1 - static/img/landing-screenshots_mobile.svg | 1 - static/img/landing-small-firefox-logo@2x.png | Bin 15817 -> 0 bytes static/img/mozilla-white.svg | 1 - static/img/mozilla.svg | 1 - static/img/og-image.png | Bin 39175 -> 0 bytes static/img/pencil.svg | 1 - static/img/preferences-16.svg | 1 - static/img/question-mark.svg | 1 - static/img/reset.svg | 1 - static/img/shots.svg | 1 - static/img/twitter-image.png | Bin 29080 -> 0 bytes 75 files changed, 69 deletions(-) delete mode 100644 static/img/annotation-highlight-active.svg delete mode 100644 static/img/annotation-highlight.svg delete mode 100644 static/img/annotation-pen-active.svg delete mode 100644 static/img/annotation-pen.svg delete mode 100644 static/img/annotation-redo.svg delete mode 100644 static/img/annotation-text.svg delete mode 100644 static/img/arrowhead-left-16.svg delete mode 100644 static/img/arrowhead-right-16.svg delete mode 100644 static/img/banner-back.svg delete mode 100644 static/img/banner-front.svg delete mode 100644 static/img/btn-email.svg delete mode 100644 static/img/btn-fb.svg delete mode 100644 static/img/btn-pinterest.svg delete mode 100644 static/img/btn-twitter.svg delete mode 100644 static/img/close-16.svg delete mode 100644 static/img/crop.svg delete mode 100644 static/img/cursor-highlight.png delete mode 100644 static/img/cursor-pen.png delete mode 100644 static/img/default-profile.svg delete mode 100644 static/img/download-sprite.svg delete mode 100644 static/img/download-white.svg delete mode 100644 static/img/edit-highlight.svg delete mode 100644 static/img/favicon-16.png delete mode 100644 static/img/favicon-32.png delete mode 100644 static/img/favicon.svg delete mode 100644 static/img/firefox-logo.svg delete mode 100644 static/img/fxa-sync.svg delete mode 100644 static/img/github-icon.svg delete mode 100644 static/img/glyph-history-16.svg delete mode 100644 static/img/glyph-stop-16.svg delete mode 100644 static/img/icon-clear.svg delete mode 100644 static/img/icon-copy.svg delete mode 100644 static/img/icon-download.svg delete mode 100644 static/img/icon-dropdown.svg delete mode 100755 static/img/icon-edit.svg delete mode 100644 static/img/icon-heart-outline.svg delete mode 100644 static/img/icon-heart.svg delete mode 100755 static/img/icon-pen.svg delete mode 100644 static/img/icon-promo.svg delete mode 100755 static/img/icon-screenshot.svg delete mode 100644 static/img/icon-search.svg delete mode 100644 static/img/icon-settings.svg delete mode 100644 static/img/icon-share-alternate.svg delete mode 100755 static/img/icon-share.svg delete mode 100755 static/img/icon-shots.svg delete mode 100644 static/img/icon-sprite.svg delete mode 100755 static/img/icon-sync.svg delete mode 100755 static/img/icon-trash.svg delete mode 100755 static/img/image-expired_screenshots.svg delete mode 100755 static/img/image-nope_screenshots.svg delete mode 100755 static/img/image-noshots_screenshots.svg delete mode 100755 static/img/image-search_screenshots.svg delete mode 100755 static/img/landing-Screenshot-logo.svg delete mode 100644 static/img/landing-download-icon@2x.png delete mode 100644 static/img/landing-icon-chrome.svg delete mode 100644 static/img/landing-icon-github.svg delete mode 100644 static/img/landing-icon-screenshots.svg delete mode 100644 static/img/landing-icon-twitter.svg delete mode 100644 static/img/landing-screenshots_image_01.svg delete mode 100644 static/img/landing-screenshots_image_01_57.svg delete mode 100644 static/img/landing-screenshots_image_02.svg delete mode 100644 static/img/landing-screenshots_image_03.svg delete mode 100644 static/img/landing-screenshots_image_04.svg delete mode 100644 static/img/landing-screenshots_mobile.svg delete mode 100644 static/img/landing-small-firefox-logo@2x.png delete mode 100644 static/img/mozilla-white.svg delete mode 100644 static/img/mozilla.svg delete mode 100644 static/img/og-image.png delete mode 100644 static/img/pencil.svg delete mode 100644 static/img/preferences-16.svg delete mode 100644 static/img/question-mark.svg delete mode 100644 static/img/reset.svg delete mode 100644 static/img/shots.svg delete mode 100644 static/img/twitter-image.png diff --git a/Makefile b/Makefile index abbd90db06..54f226eaa1 100644 --- a/Makefile +++ b/Makefile @@ -15,9 +15,6 @@ shared_source := $(wildcard shared/*.js) sass_source := $(wildcard static/css/*.scss) partials_source := $(wildcard static/css/partials/*.scss) -# And static images get placed somewhat eclectically: -imgs_source := $(wildcard static/img/*) - raven_source := $(shell node -e 'console.log(require.resolve("raven-js/dist/raven.js"))') l10n_source := $(wildcard locales/*) diff --git a/static/img/annotation-highlight-active.svg b/static/img/annotation-highlight-active.svg deleted file mode 100644 index 2c661f0614..0000000000 --- a/static/img/annotation-highlight-active.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/annotation-highlight.svg b/static/img/annotation-highlight.svg deleted file mode 100644 index 13298b5c1e..0000000000 --- a/static/img/annotation-highlight.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/annotation-pen-active.svg b/static/img/annotation-pen-active.svg deleted file mode 100644 index 2e5889b70a..0000000000 --- a/static/img/annotation-pen-active.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/annotation-pen.svg b/static/img/annotation-pen.svg deleted file mode 100644 index 57d693f9c0..0000000000 --- a/static/img/annotation-pen.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/annotation-redo.svg b/static/img/annotation-redo.svg deleted file mode 100644 index cbcd7b5472..0000000000 --- a/static/img/annotation-redo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/annotation-text.svg b/static/img/annotation-text.svg deleted file mode 100644 index ece706c135..0000000000 --- a/static/img/annotation-text.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/arrowhead-left-16.svg b/static/img/arrowhead-left-16.svg deleted file mode 100644 index d5dc9a762e..0000000000 --- a/static/img/arrowhead-left-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/arrowhead-right-16.svg b/static/img/arrowhead-right-16.svg deleted file mode 100644 index 4d51572dc0..0000000000 --- a/static/img/arrowhead-right-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/banner-back.svg b/static/img/banner-back.svg deleted file mode 100644 index 9dc8657556..0000000000 --- a/static/img/banner-back.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/banner-front.svg b/static/img/banner-front.svg deleted file mode 100644 index 3b4f542544..0000000000 --- a/static/img/banner-front.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/btn-email.svg b/static/img/btn-email.svg deleted file mode 100644 index 6886179d3a..0000000000 --- a/static/img/btn-email.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/btn-fb.svg b/static/img/btn-fb.svg deleted file mode 100644 index c37fbc927a..0000000000 --- a/static/img/btn-fb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/btn-pinterest.svg b/static/img/btn-pinterest.svg deleted file mode 100644 index 0689b3a079..0000000000 --- a/static/img/btn-pinterest.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/btn-twitter.svg b/static/img/btn-twitter.svg deleted file mode 100644 index 7f99b3c395..0000000000 --- a/static/img/btn-twitter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/close-16.svg b/static/img/close-16.svg deleted file mode 100644 index 4fcd431894..0000000000 --- a/static/img/close-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/crop.svg b/static/img/crop.svg deleted file mode 100644 index c392be101d..0000000000 --- a/static/img/crop.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/cursor-highlight.png b/static/img/cursor-highlight.png deleted file mode 100644 index 20cdb637accf5439ece758b57f9551076c39dbd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 625 zcmV-%0*?KOP)Px%D@jB_RCobmfB^*s1wb+N6lF&c1ORlZ#%sm4ZQHhO+xAy%C*QGc+qS*dW98M_ zMxE2{zQb-!1vtT_kQSjLj#B_gL!6&BAizfkZOLFu`&59F3gS*(maC-*)DV|47-vG9 zm3&YX`-TAl!v+t&uz&CV2R*uVzn}mZxnCE>uE_!wfE&DU>7qqf0|J65JWZcE?GpE^ z0Dn}(^@=EVsZ^%)f(xnL(rU&HSBMV2gC9O8du#JM~%XO=AY8Hq2wef#D|?kv*p5EOAm zyr7ellN-M$p16JM_SKE}ouk+g2?@(2XgiY}A@$oZ+W5IuSll5ITMxvz;=Ye#-OI{<2 z9b$p@vRsY_`K2=y=<}G&pBlt~I05Zi29(1!;tmbEB-M@uX3Lh%K5X03)2n?wt*_-+ z*wdpx4Jt=KRHr<65AH72N$5-O;)y+4Kr|@e5zzF(eD|SHZV#|b?1$Tk1P~GmUDxwy z2!Xul^o~&U;Ci4!IYJ=~fx0w>7aQhl1(S1(P3FZV@&dJQ5cznOibLSS@#0`1xlzA< zeaT*i=iyKmC$Ns}0SBHvE2Ri24PBP2x;wzXHud21>N#>HAv5DY7>aq!J|^zB00000 LNkvXXu0mjf7O5j@ diff --git a/static/img/cursor-pen.png b/static/img/cursor-pen.png deleted file mode 100644 index 4625af039caf3e2cee386fd05dc963cbece3727d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmV-K0=xZ*P)Px${z*hZRCocUlmo0DK@i99_V}G@+qP}nc2u`LRvR#R(SZ}A(%UBHh)H78P;}K!cY`FB_VdXV(aED@b_;n6ciLeetsd$nl_z7 zU9y~ODoWS5Fhfy#kf3h$>LrgJJ>j6h(Z;$edZ{|$xF z@$K6WSg~{|1kCFX+qP>)2kLrLDmFk?sJjm`yH zxNpy14tn|W6-=Kz#TQk-UcKSY?Yr>l(-&w^yEcDEfy5e}`Lw8IlP0CvnORWXwz;T= z<3LVUHg8UDZa#Nd#V{&)>YCOjDzItOraCSv3mhGakRqjsuU)<7OP9kK%TDBv`ACbK z)NcT1&z$u&WbLZe1gP{hVHouj)%*vhDi$SA S+z-D10000 diff --git a/static/img/download-sprite.svg b/static/img/download-sprite.svg deleted file mode 100644 index e99373b4bd..0000000000 --- a/static/img/download-sprite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/download-white.svg b/static/img/download-white.svg deleted file mode 100644 index e6aeaee905..0000000000 --- a/static/img/download-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/edit-highlight.svg b/static/img/edit-highlight.svg deleted file mode 100644 index 397dc5c1a2..0000000000 --- a/static/img/edit-highlight.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/favicon-16.png b/static/img/favicon-16.png deleted file mode 100644 index a6cab5622fe2a972137803e45e2dc1ceb662e7c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!M}SX=>;M1%8Tyt$kne{5GcVm1 zp0>L9;90IoD-w1d1BwT1Jow?qFNm@SAHNtZ-s-SwH&EPb{k{W_Uji8lbJhdNQ%C26 z%#pC z*+!!;#&6l;)|aH;%06ZM*3xW?=Gne$gJFk2DlewjigP+4ClLP1)22WQ%mvv4FO#lVCkzW7+ diff --git a/static/img/favicon-32.png b/static/img/favicon-32.png deleted file mode 100644 index e6c524dbf05024fda55e5b3d0d9ef71415a13a6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy;Q>A&uK)l4XXsl3M+S?xww=5( z^U`ggNbS*!T$5G+8M3q20ZD05u)>|6k$%1Rw(lHh_o^{~s7!I#U0Vfq{|D z)5S5Qg0Xc{dtQ?v51XuB^Ir2k|BJ=kH`eXcd$sYW-eob>vp*(BPV#%E9r>AM>9%VN zetwT~cs?UAs=Fy@MmNWmZ5rNn!D4HhPIQ%KXDeB4m|nD>U;Lo>k&qt$>?;SJ zKAdq(HAdv`qNKk4ue?uq3&iZ(QWUN0R=4}o# \ No newline at end of file diff --git a/static/img/firefox-logo.svg b/static/img/firefox-logo.svg deleted file mode 100644 index 900ac92af8..0000000000 --- a/static/img/firefox-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/fxa-sync.svg b/static/img/fxa-sync.svg deleted file mode 100644 index 979e9b9903..0000000000 --- a/static/img/fxa-sync.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/github-icon.svg b/static/img/github-icon.svg deleted file mode 100644 index 907fbc901b..0000000000 --- a/static/img/github-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/glyph-history-16.svg b/static/img/glyph-history-16.svg deleted file mode 100644 index 94b390ad98..0000000000 --- a/static/img/glyph-history-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/glyph-stop-16.svg b/static/img/glyph-stop-16.svg deleted file mode 100644 index 6e2140d183..0000000000 --- a/static/img/glyph-stop-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-clear.svg b/static/img/icon-clear.svg deleted file mode 100644 index e9a3c68389..0000000000 --- a/static/img/icon-clear.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-copy.svg b/static/img/icon-copy.svg deleted file mode 100644 index 204b2ac5e0..0000000000 --- a/static/img/icon-copy.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-download.svg b/static/img/icon-download.svg deleted file mode 100644 index 2cb09e3c4c..0000000000 --- a/static/img/icon-download.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-dropdown.svg b/static/img/icon-dropdown.svg deleted file mode 100644 index 3fe0bae27d..0000000000 --- a/static/img/icon-dropdown.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-edit.svg b/static/img/icon-edit.svg deleted file mode 100755 index a6c60cde0b..0000000000 --- a/static/img/icon-edit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-heart-outline.svg b/static/img/icon-heart-outline.svg deleted file mode 100644 index 0858cc9f9c..0000000000 --- a/static/img/icon-heart-outline.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-heart.svg b/static/img/icon-heart.svg deleted file mode 100644 index 14321db831..0000000000 --- a/static/img/icon-heart.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-pen.svg b/static/img/icon-pen.svg deleted file mode 100755 index a6c60cde0b..0000000000 --- a/static/img/icon-pen.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-promo.svg b/static/img/icon-promo.svg deleted file mode 100644 index 2ff99b3b99..0000000000 --- a/static/img/icon-promo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-screenshot.svg b/static/img/icon-screenshot.svg deleted file mode 100755 index eb89e3aabb..0000000000 --- a/static/img/icon-screenshot.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-search.svg b/static/img/icon-search.svg deleted file mode 100644 index 1b46188ba7..0000000000 --- a/static/img/icon-search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-settings.svg b/static/img/icon-settings.svg deleted file mode 100644 index b15fadb8d6..0000000000 --- a/static/img/icon-settings.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-share-alternate.svg b/static/img/icon-share-alternate.svg deleted file mode 100644 index b3c4ab31c7..0000000000 --- a/static/img/icon-share-alternate.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-share.svg b/static/img/icon-share.svg deleted file mode 100755 index c86941bd55..0000000000 --- a/static/img/icon-share.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-shots.svg b/static/img/icon-shots.svg deleted file mode 100755 index c946c315bb..0000000000 --- a/static/img/icon-shots.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-sprite.svg b/static/img/icon-sprite.svg deleted file mode 100644 index 8afb0f7b30..0000000000 --- a/static/img/icon-sprite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-sync.svg b/static/img/icon-sync.svg deleted file mode 100755 index 94efe0ce5e..0000000000 --- a/static/img/icon-sync.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/icon-trash.svg b/static/img/icon-trash.svg deleted file mode 100755 index a0b56811c8..0000000000 --- a/static/img/icon-trash.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/image-expired_screenshots.svg b/static/img/image-expired_screenshots.svg deleted file mode 100755 index f4b0947a36..0000000000 --- a/static/img/image-expired_screenshots.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/image-nope_screenshots.svg b/static/img/image-nope_screenshots.svg deleted file mode 100755 index 828ccef9a9..0000000000 --- a/static/img/image-nope_screenshots.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/image-noshots_screenshots.svg b/static/img/image-noshots_screenshots.svg deleted file mode 100755 index fe32ea4c69..0000000000 --- a/static/img/image-noshots_screenshots.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/img/image-search_screenshots.svg b/static/img/image-search_screenshots.svg deleted file mode 100755 index a84e316907..0000000000 --- a/static/img/image-search_screenshots.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/img/landing-Screenshot-logo.svg b/static/img/landing-Screenshot-logo.svg deleted file mode 100755 index 187653a2a0..0000000000 --- a/static/img/landing-Screenshot-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/landing-download-icon@2x.png b/static/img/landing-download-icon@2x.png deleted file mode 100644 index b1768f0930da4d6637d5c7b413a6c8c0cc339cf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=>VS)S0Ej}*Ay#SEXWcDl;$W2 z@(X4VFi4nx{{DNGEjuiMVu_wEjv*T7lM@v9DoPj}xhFZWOYqn;9_!*$xzML~fh{Dd zQ73>!B*E?4!UGMfmT=_g7|&u-QFRRnHwa&#m5>nN9(v%wfsn>k469T)PU \ No newline at end of file diff --git a/static/img/landing-icon-github.svg b/static/img/landing-icon-github.svg deleted file mode 100644 index 4ee64a7b5a..0000000000 --- a/static/img/landing-icon-github.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/landing-icon-screenshots.svg b/static/img/landing-icon-screenshots.svg deleted file mode 100644 index 3e39ea3b0b..0000000000 --- a/static/img/landing-icon-screenshots.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/landing-icon-twitter.svg b/static/img/landing-icon-twitter.svg deleted file mode 100644 index fca8f3d5d4..0000000000 --- a/static/img/landing-icon-twitter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/landing-screenshots_image_01.svg b/static/img/landing-screenshots_image_01.svg deleted file mode 100644 index 78881baefa..0000000000 --- a/static/img/landing-screenshots_image_01.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/img/landing-screenshots_image_01_57.svg b/static/img/landing-screenshots_image_01_57.svg deleted file mode 100644 index 95a231d8a7..0000000000 --- a/static/img/landing-screenshots_image_01_57.svg +++ /dev/null @@ -1 +0,0 @@ -Take a Screenshot \ No newline at end of file diff --git a/static/img/landing-screenshots_image_02.svg b/static/img/landing-screenshots_image_02.svg deleted file mode 100644 index 49dbe8d8f8..0000000000 --- a/static/img/landing-screenshots_image_02.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/landing-screenshots_image_03.svg b/static/img/landing-screenshots_image_03.svg deleted file mode 100644 index 81bb4de9b5..0000000000 --- a/static/img/landing-screenshots_image_03.svg +++ /dev/null @@ -1 +0,0 @@ -VisibleFull Page \ No newline at end of file diff --git a/static/img/landing-screenshots_image_04.svg b/static/img/landing-screenshots_image_04.svg deleted file mode 100644 index 49a820bca8..0000000000 --- a/static/img/landing-screenshots_image_04.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/landing-screenshots_mobile.svg b/static/img/landing-screenshots_mobile.svg deleted file mode 100644 index 5cdb8d9e70..0000000000 --- a/static/img/landing-screenshots_mobile.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/img/landing-small-firefox-logo@2x.png b/static/img/landing-small-firefox-logo@2x.png deleted file mode 100644 index 83c495d6da92964fd3780ed96e5c9d4d861168f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15817 zcmV;)JvPFLP)PydgGod|RCodH{RgxhSDEjBf1hXXs_v7OlOTM_%a*Mij>5^^T~+&etvPxPTyn{R#3vGh$gfZ703> zIX`A_`NPPzLSy(QZ24nk!JWJ9CQ?~N>rasXiA$=iBLLW5-oort-_7Ky1^Hb@-}Roc zz7Na%iPy#8e}eqaoW_HkMaC8MJ#>&_NkJGf?025*P(WrsRpuZ3u3d&_4TT8yp9}I& zh$?aj`tYf;r3E=`@ zBSPnOI>x2IDvY;d2!L2+8uz&;Va4}I&IGrzAQTP}0LZsy^k17W;w~f1d$KIrGhtVg z$T?(xf}8b#o0)QwG0@)^`f0JV@`GU;Po)fP*skjV8!2X9qnoPr8DsTZ@N+=UleXX-zn)Fel z2S<$pM+!ioXk^stQ`DJc5ffY}1=Sa}GkrQq>+84$pbsdJ#9^VNFc1f11+AMMeYe9z z@(*`oz9wF>bVvM825BJg09gm&{}a4RE(k~k+)IX!qbEHPaVO(giPL4MEJAe-Dg&t2 z5lK-|!~|ynu^bl~IL2||5W+ru*p9FT$u>W@mfdmX^XJ|MQrPbF`wX?7$i#gLl2f$f z|5p)aE2r4xNj5`6-!AjRJF79PQU6mw8mQdcfNRz})~pGgrIHtIUkZLT&OaFM?vKhT zIJbzjRwGHk0~$4nnkzqZQH%dQ0g6dG)fWdgP4#a4)G1f*dBK?vc|4wevxf)q^VBRL z0+pDS<#4-)o1w|;Wg#DmG0hMW%s$3bDY!#k#tkv(e<-A}PK9*=;NbE#vu547epDd* zasSJ$Q`S6ES-&VwA{lCw-i~kIA%=}|TTpv&X0#su{$dGLb`8CkuRkDbG z0{2Fw|!`GQ-TJ^bVHo9q>5J{70iCD>VLx(vhv0g!I9-xAtoxUq!nHfY@W zdRfeej0+r}zw}D_cmNsT`3rd_Ux~)i|M!r#dUYZjHe?2}|M*A$aBi*sxI@L*muBB_ z#a|s8BvJlu)vG_2Y}oMP3}E47f83X5JhyPk%dIx+^xP-p)(VC5Md1=xxKwiIrSJ*n z+%%Ri`>LiDi9CW=_8owthB;%2E7*yn?pxfj`rkNt{@V!I0@N>oWI5GCzJbM$fKc`Z z_>8(GwDwJL*R`9tW^xs^B%z)geJ13*O`gEJ|6fCvi0edH7j`av{L@73YfcMIU7(;C zN5Z*tH~(^DHKfVv)gSjIA}b&E?Z+3IyfLKxk1Ucp*W ze*~=Vm03lj+cK??svZc6W z5%^_5s7_$@6=7D_Tzc9Jc{eP>uVsCH%e4_C zleDZsa7in7J~;~LIo#)E6Q3Z?G2n&SUO1$l1DZmaQq+SAc%YmE6{00rbrRcs1bKRr zv$0j@y^C+*HD|qmG`WG0FGQ2&;FkaeboJ|kX%cYGU{cw>S-9hNLnJU?924Q&vX-X; z{CkrrGhJ$ITl#0O?{)ft2F+Zwa4NyPng)s>$W!NUzWlqFaDlskOM|Sr%#}+DRz2X$ zkI&VAkaXybTmre!D!g~?GOE5z;B?E%e!zQryvIAoT`mFY;Dyz-DTaKY-wR8U7MXgs z)5DeYFe-{F1f^qqjQTRE;tX?vQ<8#P8#O++@+zKlpYuQ<6a#2-I{3w4;g8;ZM<^F% z4qRsJy;In-vB2Z#br6b+(8hISh$}Vz%@C zP-y)wZ)9thZNGBr2PgeY?TMTJwh3_d*`IrR;r&}k2a{HN988PM`{XcKuAbl%tc~Ys zx&(CzbG&DptAX@@OCZg7*T7C5HFN_@d;fsCjGAxKn`{GDaDC&iS$F73{5142M~#E! z_}78g0XiL)MLw{j>Gs$1a65O3o zJVwspcDsaBE~ItuLw0Pz-EsVrFHDe&Gs#dXOeKH>Q6WIEUZ-x9Shwnf zi+<|oe56PQo}LNhN*0`VxJ1o)f}1X*4VN(HQYKu&Z0{L#o?E3CyyuMr`#7;@gon-k zEhqPX9G`54c&8?TKaBq~A3pHsTwKfnr?dn@=W?UE%+ga1__&=W4g@&&+N#GM7coV9ibJZ9(;(@=!*ojC_KcmRCQv*q-ui{lb|uR8Zqh153WrRO+k%0Z6{427LZ^fsUzGE*o72V1PjjPTZemvV=EN(R zt1+TI?52-frJtYE2U0I*rU`h*s|OD9vPIuz<?&XeWCyW&~wy#*;&E;%+I_ms6w;b%^RniK&kRKyShK_CEVpzgCUr`}Sn z4bn<{F_7%lBpDS=Mj)92Unlo-Xu3s=>QeUDa<+sM_+9IGzLhWFee-YPNekXZQo9Xv zgP89}d<*fz1YLys-QeKc`+mSv_pXIBup(8qxCB%X6>J8H9Q1)n3FM7}E6)Bd4`1;j zET01$K=e59XU97`#|~)F9oGN_HDh9XfnM(!(|?px!>j+8S*#rE2Efh7J>}JjbALZc z(^Skv3N?%ZPzm(A7PHbR`fF48q!~!}8~&i;X9-CHULY~>O-M!|;b`+PB@f{Mt60?g zBV278L6;%PAtV_CH=Rgv2O)tg4t$A6Zhs1-#z{5D<`NOrcr)Ob#>kpCh9qb2gz=-Z ze#+xc{!1tvW*!j(|47hYumIc}fSrS;3L0{nTRfvTXK4L#a#G{6a;&^}AlHGG=Zsu; z+><}k>yqb9&?r<2EkKOGpk~bTlMLP6B+bAZ=D`vH50d1N1n{BkZ5lKY%qw_7k_M9Q zfdp_6{4zAz1wIE4I8Sg3(R2rQOuU^(Zh2XIxp8U_Y;rY3!OCqqL`u{EU1zQ3vo}_1 z&h4Y{)m2yWtka(|?P2o}83y-I(0M=s$h`yzU=gMh$XobLDf_luj$8A1S+Tw`6HGal ziH@S6U6Zuy&1V9A4S0Jyxd;M65{5n-R zW!$o2$hF)uKhBVwM8q%wd_a<-D`0ob;&3Yy%aPB_4Iys4egCWdpW)$K&SzmgFq+nw zat@q;)2fq?ZfT5mcHmUsV$-PclDWHh|3luvQ13S=vJ-K72QU}>IUseQh!JKEXjFeD zSh;Y`Nk=>ff3=-p50@3(d910FW0|pTSo)NcCe41WA`9l|M6oOxb3NJuF~CsQ9j!ZN zci^Cl(R3H%#glmBZ6D+#6N^~c2erL;zn$GMyxlP#9GDXw_&hN{Ic}F8}i4CpSs#faoKX; z7+B&*i$pVLVmJw?1aMaVKfbsZF$>K1f=iHOgzFFfJ!fzFO9py`W?Cn6in;hWt0I-1 zrL`Isr^cduk{#pllXHL0d8hm}6ks+7;Q+`o@b?Ac+3QRJt?ashiW#N>9~=|6H)w8t zw4B6mI#W4g$g5eMoWq9flDi@A>nDDFqMxjZWQA$roD^+H5$gmwM!;hz!_H%VHlq93 zy5)7O-TgP*G0@L(-mycYvg#D+IFGcdakAY<_faZO3zOV(2;O<(7T)lnmy;&f5{iyg z>Ovr|#+xBv*;Rm=AuiC@a17t@Z8>58Q;#K;ax6PKdzU@xT?4LoYmgSId2mvwYCs8y zc0yLCa_0Bb2@2_aG}{L^!{?em;d%9kvdT9ZagGDd(Nv{~Q>hZoUJY@EY2~4Elu%e` zP4-MQ@jheI+K+SMg7*>f#i$H}WgrW|odr?@D*(AS0OPJqBmxvTbu@-y>gx05WWHmz z#*3`aXAW6zl6Y?df>;?h==tDv0faP6MIRj9u_|Oo< za-4cv6EJrDv*fh#OYG{^iJY?`>k8SKL}Q)qT5{D7=XrVTgiK~ma_=-3*G4SR5>h%R zI`>vO9pC{6cE=Fx>4%;Kad$H19?v!Iuen7}V!!L>fa_(i_Oe~-T&H#RNeTi0I2d$+ z(azEuBWeIAILlZvHOjUL&vzdDE1taSS>=(|EJQ{C1DOMQHb^f}%)ESdeU9$M45Xl6 zJ;TGlV8u0EQz`fKCcySZPkL#Ol5 z6s$)v*N^(m;DH2!KaMOpnTB7+q&tpLw}kz=gqMTogwh84+SJjZ- za+XXUV(Yl$lV{(^3m@<1iBfSw9&1)vdTH?SFE0#K%MzOuc55WwqVUXvTUhCAD)uR?G1*_t?fc$dn+p64+U} zSDQlOG4ILuv)27&w@hO)@+_0l>A7 zzLc|P(_%}m9i)OH989gpxygA0mfhWmX8-Hmxtx9Fp zO|5FkGL5&+eb#*vm;H3mh2t`vYI)7lL^GQnAM-Zk(WOTKZ!zF8AQs(!9#3?V67r_G zNJEfX00n&65(8h3(TSD4KsrX@&%pIu$KLQtUb$->Uug|-YErOCsv(iGS3r#8rw*}o ztl+|VqkQDN4=``&3(>Zn0s)K?b7_p(9jq&0{BNREiUj)9v48Sk3O)I1d>w6WIyrElQ(eNkZ`R zaXmLMDUak`JN_^4Z=KFb^@7c&<-zkkA=2(e40FP)yn&7#c(eC~t@ghDG)!4fT^%38)x^(C^S4@f7tJM`u&~(Kq!`@ zZA`!fFp%TGuLP-sg>Gq#KJNmE0Y_%AEoS+Y{jG2Dh2K0w))DNoHD1=P&jF-dZsc2d zUVU;->-+PZK5A0OT1h!JdKZ<}W7-Vpgqcxd%hC!cN0%6P&4IgWXuSX@;7UNB5PUC^ z1SGlh$c*)nJ&P|7U&PA~odJV=%t=!YK$*r86DiT?04-6)5Cs!qS!;}KhcR1@Z$11f z&OiG?5T?tlYymi0YGoF<(?AD+(1|v~R2o1u>CuGAVwi&Sh?Gbz?1`AH6S^wC2G;oq6?MhDC@Gk+KOL>5P*Ja1`_S))-qyMqo<0Q!_--^=M9dhO+wff)1&z;{aHWa&gE^{4?ajOA9N@s{mZn|NQx?^25Zn zR;I4ele)a-wKW6CnU>Tp;4x&J%6&c9P4m$D7$k?Igo&^N$68tW+uN+%e-(h=54`AnhrO}x8)3kQhZHi|F0IoOo=pBj zAyptXEc7Ec=Ww9G_VgmYH}P0rI=K>xUPz6VJqZ(OABPSDs$wx-j42&`3`q=HBEk_+ z!7z2qvy8!!z1*=|c>Ae$@}{+~ptkTDLa`7Hdq4o>Xjzp$@TY(dmN=E02iGTI2XCBKuW=w9U~f|II0exTMC}4eH7N1D0hE}^{H#HJbQjwWB>eQ$pYxap zJr9<8OnQ)f3=}XRF17x2@X@$ABS3PXvQpdktUSF`oy`DY(lIu`B5Xmq7gW z^BB>^fSn~45Q!QUm{NVbAj0wE!)zTL;|T+keBt!>Gk5M62`4Q;{XWPIgz|D=WvTTi zf?o)9ZXQ_o9y_`W8FDEH^Y3w=Yt9!bmm$Bdy<(;F+E;g@@0sWI&n9IwOI((uu4OZV z^!HMU^&y_RM>PR{PInfnw9vlbBana_%Od!i~a=f^Okgbt3 z{;;P#PF}`3-`BtIRIgL(2V61Fbh1cX<`UP!Yex4C0qcTw?B|nK-bl-uUB=3?p#U*#b(xJ*xnyiNJ9mup z^fM>;C^1i{YGTDu=(9a9OFG;bqjR%5(XXR?u!=U~C%wMotI zW=nWB`-T=XVRg<}yp>ZHeU+d++_d*Ec+d~eqnQqId`~ZjMEr5({8iZ4m_4C6pYzN!+jI(B8i?6)uBP_Dd5`MH8o!kWrfK@;b5WnVQ(egy+L%I}1!9qnU ztSNX6cxNQu=u2+p50lU5aa$ftt|_R1cYON6TY2CKw{r1K z=kl(Ni#ch2KclXfpwh-GDgdWZwZwGYAS-6D0MdQJ1BijCWAW5Jb`9@^Nyk;M{xRpC z^#;Ok7NfWA0s-a%rveF3be7o?%PoO)AwY~7^&R(KjJu|U+a_T_@SrpkfTV+a!6*yJ3yU)N8uBUyIKVs zCq2v4tK{<9tDl%^{{7T7NL(`{uBGiXYKs^#9w)oKd=+EH)P+VSV`@U0JIxq~@rji&D>@eXsI>l=>LwOCe5X!t&?0xo)v(pWx=miG$M ziAe-{Po=eLwgZTwd4nY*cd~uE@UAEB;7!lF2xoh+4MWI|5lDe1a6GV}Bb5eFmQ;ZB z6mazl%;-L}Az^E);Kruol=McqJbCqt`yBsfe%w;mvNmKJaT+qw60=0Cd>yi~td@vL zfV5!G_#nFv_Rv!+NL+!_Fx@-aeQ&abUyQt%CvIKE8L1#iKZQ#vR1xR!-qS>Bih@f^ zsB*R%gT;_irZIXp)e^M?ozY|`#*98Ia#oDr$(F4-FFJRGe|YH!7?|@5!tD#tKkNk; z;hg~Vb-~m@NRIraKgBu7xiXnYL4zag5t^ z5oQNuEoUmEY}-GGVbqgpMDL1r8hslwqsMRMCkJ1`6Ye^d)jgiV_fd4>#AURqNj%BX z=(94768DNp*}5)2x=(lnFf&e^xRX1!HF*4~O+Nd|Pq1*=R|&(5(HnQc7?1#s5^)Kj zC7{KiQkKo*AQ>tl;|Wg$ngCn!f*T9R19h|fB6;1%yk;+``$mztRxNc+OI#*pDvwTf zT!yb+OLm{FrUk<$d{#lxLQ7NhL9;AqZx$Vsa~6wvThxl7er&;ma&P@sku&OK`XC zgzZ3DrZ5NQ0JE!7SwiBWb^>SuA;gG4R9bH<3O1YLLEI)kb8q-e;#()wT;sttm(>&3 zu(X}bOpcC|@e-tHr?T@)Johv<7OLzS=_kvTT9V^jAaNz41`=O@Cb*tE*q=X?*W7v@ zpPQJ&dHo5yEkR3wZp|voX?!2!xe7?ZqP_&3?y10xt`d^vjcweyV}wO>jLYBh4Nf`v z|59X2aJzQG<|xQHpuqexrGZY&5^6y?@v$h87EO!{ZVCl^#qmJfC_mLVf3W5omip%F z6W638k!5+!J7=z)FDbWM=kAT91+i?? z25R&t${}-Tcfc}z5n5DEO`;^0c-QLm4Knd>;;CplvnXkTiWhBQ`v5*8CMfP9A_3Aq`8~DC-aZZg$J_+9=?RZi z&s^_e!lOoYSXp$5Xht~EJl7ug9eF4wea0(BYE7Ve9%siBE zMF&_VV2N9(qd44`Nh~Kgh$V?}Gde2;go9!wA2r%&Yzg&S`t zGM$DjXRWO`kL6IKk^Q95Vg0rYIApWa98TjTd6X7_u^zKnLWM z87muGxqa&dXCGhi&9{Do<;%ZF(Oig=J+K8h5J3VIKn>`N;OOYJ2hs&GU|eR6E0e$( z!7(fQx_pBVEts9|en_9nH)%t*f_F_VXRT!-tM^>1zwBDJbQ-eJOevaYF`{qs)5 z!>uSWYiQ3N7=%kUzlvvFax%Y~+J;SzV3sA8c#H(%R7xkL&PpUZ zq6%@KigONCZA0(KJ$o7+S{|H2U7!YtLhhmErtb&fKK+3VWly2hv_y z9~f5Q^p=o?*9yST{Oca>wfK3j%M#}rA#qJTQd&#QV;(0vCq22gAtf!qSylOs5*eVD zw_E6`qxC~jgIyzQ`S|bFvhHUKU_fC&II*sHr%d74mOE&A$Q=yA`O7lSJ${^179C>Y z>=F8UnxMjXtB+kHbGd%ULcVa@9JcMP!@Po3bz@iVa9UMPE5^t85=HU}h9>V~%dZ^o zf6H!O_nbGNu7wpnh@XOCU{}2GjG6+qD#Wt6-f~T8U=if*B%mnsno!77ry;(^K)PQE|K5W_d z7=C=?IlS_UO+51n@5ZtetU!DL z2Y{U=qEt+7(kQKT^pZd_J9^Kj6drX2{lOvmA%Z?k0KU)b7S$837;>CkxUoESE#F>- zXx5(e_=>GMUm|vFphs9GR1hdCA&=rEF=B~YmR@rX^L4Z~3LYk#r?PkQ6b?4#(6Sn7 zQZUp%%G|*nclW=6+EFm0j>$l|Q4Tmm+z8^Ekb-6Kn_J(`8@_!mzur^ljJXASbH&GH zwFD(jWfZO)WmdME&3g|(?zr|tzvApOKSP+Bjmkmrz@ZWnKq_XZ9&q;rsgTS9TzvR! z6c*@hPXMl^o<2eVe!#!fQorLzbDXYexkFjvT1m~d%$Mhqo$E;_hx;gz-O8)jG^CGy zR#j5tRQh&{5+0`CEO#v=Z9qZ^Q#LJ|L0~SZL);YNCczbPA~E%t3}VucOSeJ_8}IlV zUh$R3@{3(PoG~Y7ICFR{0V~GF61H4J1_oN&xb>C>7d*1bzrF5a=FI&KAsav$0|$%% zyShL+z(>z?fchcOBkM^kQ(4f9XUsk;e>V1fp}cFzLiB-{o=IPMEm_X#)jt4r{|%8?KF~F>pn5fIz`w z)Ez>4rnu@4Z{We7csO&su&`!K6pBdqL?VhSrjV)aZ22Ah+q-t~;%C06Tpc6`893k| zu(u0j^uJT(QpERnY}b{THH1dENS-|TiKCGEme&qC{ZQr(9Udd~?#9uLffDjq%B!pR z_A!7)<7WBF2We5hF<{^;ADT@q=4BP|Ya>;AnkuH5jizu}D2FD5kmQJDY?w1nIjjggh9i=I1s-vgS) zkOkhRU%;~PFnMb0Mk#+yS@A>O`oz@d->}bX+>}4zcGSzw=ML=99~K@HtKPG#pL@ z6QIi&ndZCL_}fWdf6*xK{9m7@R^NsdbwnBfpulj6snuA}J(0LNy2rQNp;qFWX&UdlmWYYQ zry)grK3Os8i7~4-4GIcLnaT$!aA=yfLB&ra%2CJ?wxE3XwS+XJEVt!zi5$RD0xHf= zLJE04kBvJY!cYIOf*;>F#D+Zy4?DiaoPOhqyN>5j=;MUGf@V;pqO2MM5oE6(V8d?@ z@z#qD@wVrEk+i-eN@KLt*b7V@100|}=s zPng@+1Cn9_fq-g4z|$%y@uWJ9O!r;|wPCKlZh}kSa~IEi^rykVLW)QWBud#Na3Fr+ zstY95KSy2p90Hi4K+c8oY%V?WZ7hI~aZ&POKAwGp_s;E=iJ#2&djHIgv=Y~vF0Wda z*BH`8<7BiHaT1VdDbjsOG2P5t`PTU)K?a#>En)c3VulY6F<8q zsVk=Y_UD029Q*Sjt{q;&C$3q*6}Q(|xx}$-u$Mrc!W@Nh^bi>^h>xwxo(L2S5OMU^ z#<}9^!{u~8Z~Ck6($jkg@5HZBvQ;Dtk+}Si}(t_GS zau)HGn;yf>w+?ak!i*s=^m(J^%a^u%(ZBLFIn!QPyoTziPM_dmoZUU?lWmtT&x zQjh|XA_9!Y$C1vm+NG~9xrQ*E#@==sucO6djYj<#Fd6;9p*PBd4sm9LpStAd(+N zj1xIgwu&@%2kqFt6ABE62U@&L{+f^4B{(i52pE7={SNc*^LPKdPvxKR<0P)xJ`G8< z^H{4gmC?3cKq(<+NaYV$ce+ac zivec~gB#D1BPSvqV`cSHq+_?I#O#(vSCLF-M@~KPhSc^En9U8t58>;ZR&eRHeHg-$ z{y<;d@ZJysfDjT&2>>8;^kr)SjjAM8+=sGN{yPC@8F^2_HS>PUN0&TS`0Z%b-?5f%f7tB%y#1et zocwJbrLsgU*OcY=C#yFI;>~na4Ai=pRCmv~=E~V@auCvtseC0j4&RsccP-)a&3)Xw z&*Ok0jQ$>@UN@2ioR+vkdC^8If{5#EM1NLjn{K zEJd{iQUTYQ#;NKJfXY;cdrGVrm;f1@mnB?R|2=0H=g9}|7&#`$jv4G}iRA11r&HNp zigc#3M2z~lyhgh{SXpAbjEk=7J}Sq~%5(-K*$)ZiVG-NLPve#Yi`lq$h+Fs7xpPm# zj)Tf5LWmAS00K~y&jT1s1_LLZ)MC|%W1P8SH>WMVl?Agmg9qBFPRen5bOe+TuL#czx(k6{_foaPTx|vF>51gOOwj| z*Su_<<+V$REm6DTmG|*y<^XaiQ@RYT@LR<%pht*ll7D`!60ZDV!e%PrJoYHENg`A~~WV2J8+g zKqwJ8#xw#HRcTa^U^Ja@#mby-)IBd5g|qK`k-UUY*+nGsak~6+`YxD1Vmne-U0UNlMvR}!d)lDp6dZ^v5Z?gTJPNB(6G}J-8jen4 z)T#ixmsE>TBu1NQ8Wjj&Sh((F;gf@zK7BIbA$RU#>C_r|Hn)~bkC{Mr?7_<0zB${u zr?%Wko@&dLZ`VnQ8ADe777!Pg*l4`$g4i9iypQ|Nds6`i9O=uSYq?LW5u8GIz%EG) z9jMa1tX8Jc6v_!|!KHzM= zxrxkcyc~&t-@wrlTk$$b$9M_2s_`-EyC$;Refg{v_gbPx?T>=A7^f4kOF9EkbSyIf z5+mPok~KfLM3To&294mq66AMv&q^*H&2xrz4H zU80$be$`oJiH+YPa1zkY@lvbZTiQd2OYY@APzHYJPMEt5Jz1n#p!6 zqrMuhODd!LKs6rsl*+QNKqW%$yyO@VGX<0KSwS+2<^r;V^GOHxqkX$`3g;Em5 z?b#RNbz@h^nPUE!x2;x}{bGL`YUWxQF?6|>s}Cw}e@cubf= zN2#soX9{XS%R#Q4i+>2IAya~coV>@AD712txMQ`49wV#T+&BG59K8qj0JET6lebuX5_>8=#@q!~SR$WK|aIZmj{-xI+>swydF$LIPFKhhraF=LoJ`6-zNZ5; zl!%3Z96>Zd2pEvzG@ZV)f0ln7ev9s}JH|yRdvXj&)YD`Nvp37Xj{Z|M;=Kyl9rG9d z^>3@Iy)$tw(5aSpdD`(Za|{|GR$&@K*_W7I){9*LBjD~c)oQ%z(pr&9tKKYVc*qnW zh74diqA6aWVK-p*8u{qR&$=VttB~C>FH2tgN~gs?4mhLGiB>zAnn_t^anV>=jTuVN z4oryAs#Dl~snH!%suJ0GUkMpuc8rxx4=s&15DdsMaipR&%n&|Gk-Sqrxpze?8Ll0eeGX}?%~=BcB-l9)Mj$!pF$tU7P<9NC4v!C*=fay?@oi zy$he1ueRO6IoeWyCe~y{P!l1 z>2wnT2xf+OQB^|8qb_M_-QwJzQ#yb^7c2@LRkVZyR!&v~(hP&F*f8 zL344(HeQx3f-HL~(%BWSOCqaF>oIHw2w0d-p#%&q1lgBkLw>5c0yO+nPwx#Mmd~>T zpn5{{pAZtD{NAN2$4#!P|Lt0|_2F60-9Ko9AdNiHLY&K;ld4maGMU=BEU759P_Y3J zK$+RvvApk=#JD#E6OaH>7?6XsAoPThspE^WvD1>x!#!VGyYUl$Mfo4_w_mVMScS#g zZU4C;D^5+W;uVA1m%T}(c;y_Y^@dKOl4Xe&&S|c$@@@6<=&Pg5mOVn8&TeIunXer? z;lwbBf7N*a3lIu0M>8K{@8rU;Wq48E9GRbvw(RAN< zGRBn{xd03bM)_XuQ!~sBuV;*#%`bA+c^K^Uw`+et5;u?oU`HM z8Rhj~6fy?Az`>+^ULCMksN^pna=J_;Ba=p-Cg{@L;y%+B=Q(aYtw|`%(1tTa-dP8k)?Q5X4S~%_T(Jj*Gkgb1nBS&={xuextQB8 zV~tF{AT1g+Ih@k=c!{Y>q2*Wiq>V`l881^hK}$>#K)P+q z#i$rk_Ra!g2A1F)h(KN(Dnu_Xvie7ASKfFdfUPEx4P*fSBOv2)yO9f$Rb1Mlysnz_ zmxHq{e<*5Ca#}p5CU)v9r)+*svk~-}`?qWaorvj9YCj@i+sw%zMf}Pok%2D9#oaRx8DQ zo!AQ1VquSv)D*k~kN^aT?@L4^RGe7Ee|sum*tiJW(Xa{RT3qpaG`(J~zrMta08iWy zDz@4F1lhTvZ~^-S)&yZ)pyRsjq$kw+CjCOlj!!h4U{ajm2}?x6LXj|A#Rfz|k6@`v z&@!1p#4-p?5hfHH0oyNPdla@Kww0h;5w~4#-7rja9W9}29BbBxa);(W#r6LKaiTMg Tpy1vJ00000NkvXXu0mjfe1NIA diff --git a/static/img/mozilla-white.svg b/static/img/mozilla-white.svg deleted file mode 100644 index 6ca629ba4a..0000000000 --- a/static/img/mozilla-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/mozilla.svg b/static/img/mozilla.svg deleted file mode 100644 index 6a4510c150..0000000000 --- a/static/img/mozilla.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/og-image.png b/static/img/og-image.png deleted file mode 100644 index 34ef6a110596ebbd3c6e01b58431b1b688318b89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39175 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%0A~3klQy27W5iyrvLUJyBJk@YT{|`@(=b|yktfa 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 \ No newline at end of file diff --git a/static/img/preferences-16.svg b/static/img/preferences-16.svg deleted file mode 100644 index 28acd46022..0000000000 --- a/static/img/preferences-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/question-mark.svg b/static/img/question-mark.svg deleted file mode 100644 index f63aa09dbd..0000000000 --- a/static/img/question-mark.svg +++ /dev/null @@ -1 +0,0 @@ -? \ No newline at end of file diff --git a/static/img/reset.svg b/static/img/reset.svg deleted file mode 100644 index 983c52aa5a..0000000000 --- a/static/img/reset.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/shots.svg b/static/img/shots.svg deleted file mode 100644 index ffa7a6922a..0000000000 --- a/static/img/shots.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/twitter-image.png b/static/img/twitter-image.png deleted file mode 100644 index 89a253ef3c433cefb005713e9957bc454e0f7abf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29080 zcmYg$1z1#Fv^L${f=Ek)w1A{^cb7vqNOwy~NH&HN*N_x^W1 zkB{ff*?aA^-WB`ZhZC))B8!bdjsXV;hb=EBr2z+r;Q99-8UpMWV}8AAI5<~Rc_|4k zZ}@|ykWUN}SjgiKQ1Ipbw?;M$5~iOXn2}^**LEs=?rn^z!^dMQge$kVE1clQmP)Xh z_wd-Wh{Xn-NirK{W#vCh5QoqIdsk(w~}#6*Z(U~Sa{HXj%FkzK|GK-a zc;UcCWH%Xh>;xQCr4%7d%ilt%zU1TP&|3RQyOV=0eg75in#WAW3QonhP z!g`c{C}=)0yAMX?%kTYX?zRg0@Z#d#1Ny(npgt15jcmyO_B-r

      Utk`-z5-Uj_sJ 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%0ACHCS$wY@qh8=ak#N z!j>DL)}a(@B@&ql$B&H*-_+Uz)gyUrAWm4_I(=iZIW_XHqy(u-Q=35QGr!D@+Ecyv zhEKHmUztq5lz_S1fvMpQ>6k_9LyL`$p66Knn6%9yg`wm+0|y6f(FU5>=Ll;JqE-Ux z*%6wN$aqgvD*%Uba6>ak3y;T@FWD&AVjQ04W(~Ww<_!F?8oYOcO=nH~p}zPqX-0An zP)HhX4~VSEGJAT+JRL&EqEMnAU95}tOm_aes+}(M?;R5RIcKa*itC7MDe=DW`$!Y| zNTnY6ZYK03ZVG(LJmv(qDYoV5XK6|F2N1E9ikC@)?uN8K-ct8;A11WleeAAOJtLW- zR8n)Pw)nCnV6m&{cz_sU@N}M@`k=J?g2)gn_zV2rMoVIuNK~Q}rGC1^Yx}F)`VfFW@MI-FI8&%S;sxB`|q7 zf37aPj-Ak4B{+l6l0f(3_h39`*+%okY= zzAgMNHybN?XVIsX`ICg{K&#S!^Lh3Qy3d=~-Qy;AGMv_I#+aCMJ^_*ExcXaxE_6aV zUEj=bH@3dN3xlIWs}DOcF98bmT}_~S5Q29+eotWUIMAt(J4RJ_a_Fj9r-eRVwM(ke z{{Zjh^>F1*zxnX}&`ielqJbO@1IWqY6EQ@f#7bR6SWTN5EzYXxQcT05D=|KG3_5F| zr>8GYX%ADN{5^YE*z_wv`4p?=!_XBqsdwn`Ov88fm3gSAXlsu`!BbXg5u>Bk*q|Z7 zr_b%tS$qi1vvuORO9Ug3$NfCt>c?dBCcPgzC3QzT)f9$?cwMe>y?s@0jyH89M1~2; zQneK^C>D|=Y3AGn{x|7o=?6rl8LP2Jf5O-InVH|Neuoc(KzU?ezo6a-TRxguf9M;B z4vbyqdr4vMqA2hbmk%Y&d{hd_V?J1+54sGvM~Kq7(D5AQfG4dGm}%(RU=mBImldLt z^HCAH6maN~EZm9F)phvuYlH|&f3%y6lGrY8IjB6u?^D)f3*LAnF}|&+;{#%Jv?SZe z{E|TQ$~TFqY#|n(m;7=B%<`fwJ7@+GDAJAzVYLCA*|3lg&A7|QmC(g+>EEnq@_QD~ zIlCrxW$s2lhiNv{d#g(rD{iM6r>95MYUcEI^t0J9bKM?$N!HH?8Rch37|iM9o9es= zgp1GGx0^oq;AEDi&3jAoNNrBWK&gsvs}TWG0~>EPA|ycJs(|m>;`quepb4OE528C^ zd2RjC2>X+g1!-sPt1vip!?Yns$cy`AC`N&M|H)3^kct1L2h4WY9zOa8v z=Qw-^^BZrATEa!MtM*8ca<{A7>FOubbrt5%kn8hVjw!&~OGb185xVO`(-{~Yqn)K- zuK~=v&sHsoD5&EBvcCmsls#+c)V}_*GhAQhmB4Naq!{_~9akf^R}8-rV7C3XkJeBCzveQ0=G&CLjR7y3U*=kTe7kI91@(FAU{{|H=3;|G8vi zOx~K9Zzy(qGW<`|q`9+Pl1hy)lo9C~N@xFw?~7SO0?`+g)@X!i#5M1eFx=~yXrrp% zont;ovgbBT$+A%{BKvPyc(V6-#pV8TZ9oCghk0+vwj~&SrvtJOBnz+*pq;aR#{>PsU@V z&OpyHWEHV-pj^QVV*Kw0+B+B)|ah3w5YeQ zS!}h!aDQ!TF4z^lSd~IAl#^MW68sPCR=#|ag(7`m$P?2^8$462{k*>B-KYVWEK^tWJ`E11sxw52kNGsqLbG0uxa1N zN&}*!id^7<2s2CHRx>lzp7;@vbral;z01Y2Ni1Lj}J>5D%KK5{7DXLZrUkjT}W7Z5{mDhvhgv#XY{CzJQh zEPl67CI=dg>(H=TGNWtUx4n0-v_{!vvKMu=HWwB%=DWE(7BBmz!gZ18f({q#qj9)x zemV40k=u62%IVQWEy;<}E(w0P=@PClHxWdA!4MB!+Hf zH|^J|FO~l>C6UbE!Z$fE5>l&CPwyvjw5#f*XZFZ$M%P2%qHYUUix#Z-9U6ay4)1;v zhAL}LQ=l+z=h7(QZS9!>R+CYV9^9iMJyc0w@oMN9nNk~0S zT+HQY1-t-WV{CIA=0~Cpoz}NqkPoMxZJ9klWi`8E#GA}~+Y7atsdc#do%nXx4Qc>p zYD;TPRq_(lw4&lY*%LF0&Nnn?H@@$*aG2VGH;7xdiBgzctn*% zQ-|Jn3jZlnEqfaUHc-IlTj&QPG}SH-xLalifFO-y|6xbIOOBg-26Z)qs4O3ZHtdRu z$d?NfO^GPdC}+E(xYq-2NrdW2C?2tyEr`Teou<758D%6Fitxopa~ELL2{ZBuD!iL5 zZc^E-m{Qx3)ZrBoBB42*N$m1Of|qRpms1}T7<@Y|S{R-_lIthEB+8#1LdohcI9w0k zMN2v$Ww-9%&WPU$v|dVG4)17WKpEz9J9GYNILw+47M4UWM;|Ymam77CPa~F;3rWWY z_4kkUbH?UV;_IMrjIaTm8^xh{=7z*mmb;A97Y{#uA^Py-Wl!C+_sTu`cwU$_H^flz;6R*nScdZ7J#Z!q_k&Yiy#QUoYYQG*04B*B}k)ZJ!XR zn>4+Pg_f4lgBwx}9gaFEvp5-KKC$3JCiKY|iokNGU}DlSJz+8g@N2o|PH=od@|S8A zS5gk1A!z-q``7z?7vENQieK*P!Zj`R(Tog;0r{%WKn}Y`m08WRAc$k3L|sO4gyLLj zv6f+GRrb}y5l~^bq4RC)T<&Y&Q+$ZJu-NlUDBkpT*+j=#&Uf#a<+@U}(^t?Fjg`2~ z3q%z9^GBd-2wW)2DP}LxWU3CoY}d|9%&c&Pc{i`8T-0ioQOT|AqxYx@5OW$=xzPaL z&(@;kO6vbM+|w}B_T<=dJkrEEIaPP02n*X~p}jh1dF7I4jv%~FmK)5i#%HpVi-3ZydeaxYOyv9-pkzp-t5 zJ^ExczK@Set;&WQUL{^kiWt^6IlZtWxQjV zQ@flx;1f%HeK#@$j8-Qu@Gt=GDbjS(NQUn<@Nk)@yWHr)<#~o_L2`_JLKCBA>#Iz0 z`?JM*zZrK?zf3~Ut-Uaj53L!KGh`F5xxf7oY}F+;4Sl)!*WaDXZUs#kZ@VKWy2KvZd{t3jq+4v<}VOLR^yvVe{q9ACW!liD!8ni|{LRqY&3>{$H zmD^pLolG@-GXn38U3+RGZEbSKB1LPwhR-02`9-UFcW(7p$#Nq7B8;qe&MT~*$syh_ za3t71*rRjMxJ=xB__u-$Lc(UveOj?O9uJbG^HR#1+uIzeSq3n^@q&y79-S>pH8W36 zy3$I~;}Jj!*L{EoQH(9OBnS}=C+NwFFDEKi5cd0SQ5N5D7#95cg^FvFGW7{R&!#ZJ zcdUO>_`CA(pB3CC7{;f_KYKA$PoGeTGDoT%fzz!U5Y=rmc-HhXQ z6<`~RQ)>#zBwd<}PKe`dwGBefZvTfMDg@3tyz89$ztwOfA34+OTEZT6j!3%F&rf97 zKwqLllUk)c5={6cMEo+zlHtV{CyYc*#ANBosZ^CMs5}vL&bNDsc;?7Owf*j3fr-~@ z=zD>*-svlwTlf4#0I1sD_`bE-=MjTpikCMakWr<2zF1E95B*WHq5Z8zxPE{aQ0U3x z%{R7P@LBuVnguehnXbsWbX`}ERYp6dO9d(ZmGqNQADLNn`g%+5)IRyLzgjA)aj@Da zcQIOI7XQ0Fj(ct2ppIKMi~dPsqkBLfZ()jsySgY{QHoWO#@ZGa(sm4G`OQ(pVgK69 ze%cKFp03E)?ESQvt&#GEC9|D<=TUI}VQ~J;#EcrZYpCf_dnq}R;aM5Yso5C6Ec)Y9 zV4gDfI;R_pZyx76b)n3b0%$U;6iiF=`q2r6ZPttq(>)Ri%l*L`4@s8@GR?CK10U>Q zZQoTo?+?KZayOd7f*@XAhPc`&8oc$t2A(@J?0-sfRjfqS3k{^M2N>PM0s=}H$94GTrG_iwp`pkrCm7BXs2Z7i|h1u^!0eedkW^M~hY>OQrrj{Jtw zlS>rAHzaI?B&LMstqsVMzc*(988msco}HTJJrcOFlqk5+DLL>|thw!6jbx6_aMRkP zalhmOv+E4HZI$MI6n35J?Z~y>%WLE_ZSrZeXrhmq+7+oLbSR7E$eDW(O8B-_K>N5Ma1;5njzuiL~eJ9a*Zl=0W%>4a1xJmed* z1hIid-!x{f4t-06hc+dGXdjO|1B1UR{DSDo?)ww)LB9>KO3-|KIP^}kBDIDHQ2Jx7 z28tFsDOTxv42hWCK%56P6>NpE(N&#~T-q5`dQ8nU>(-R3T3kUBXPa7bc2M)4;yHaz z?}Hh$@0TnF&p-rV3Q2Ln!>q?4cZP{2$#Je2Bu_C| ze-ht)0~;#nQEwOT2&0q-V3M*)KjV52WVB1vGQ6 z!QvZBTKyOpEMZZz^CxMppR?KG;e$c+LBr9f%T~j0KXt7no)PgI6TnjFlRd*Z4z)b? zYl_mHNxl3%H_B()!)wxu=&rC4J(WWd^_7wOlYF7;Y?fzG?8Esw8z585EQ+z<(iEd9 z!}Jnz?wDi?RAh16P0smHx45i@f$@pdZYSA)5V$g*+&Q1#ILQjZ;13p$)Su=HZ5Mih ztK7qCfPuc()*VJ0Oi=t~T6=LAeg9yr(Fm?TQl$4~N$|IrWYrQZjMkSW@2|L)NV@_L zkh3J=WEdYhH)i>i_ou4-kV||43P4@a~250JQ z5R6t{gW*OqLIEs%TRhlSa!@B0x`W&%=q31f(OR~Oo|Bu#|A;&?0GWnp0Wm*x;=MZk zxzu1pmS#Qc_{ecuhZ=qBt_S4e^yl+4bqdL&r6TRE2~D~4i&NGra`e5vPWo;tylKAG z%9ab+bf)Op4SjKY2Kz{%>UIh(D3Rul+fD|IY{>)IjXomv&r8%{Z-Hd|4;4>Mw^}m1 z%fTg2ECnDK7|@!PZH;J`Q@dCr(~Ech_e#0E|2HH~S7TB0%U7o?klDtCB|O9-GL-3z}1Go#rB-7M3`GuQIeQNB_) z@37q|r1LYpU9_@&qzvBEFmFkQvCzErt$8LV-`yoEI`i7>4Vr>T^rj|9Wr*pkjv<1f zv=uW$j6D^0^oK~T)z8XIHyc<5Wr3>p*$h0d%i6ur=dBIJV_dp-)ZYP8-buc~ICBE- z)9pjBCEo3!s$KF9OJw`1BR(6E*sa9w$eh3a?A#7}DgS12;s?FMbBqeHW%@bxV^ktn zS99}abI*PzRx*%89T=Q53nAl3(Z~3pUp&jQF{CZ&Gnn*JJ$_u z)etQ-W#a_-4F6(7=qFDcj1s-&r`>c<-kY*PSPkmA1+CM?wtiE;u9|NC&5d-y`mn+U zLZ(zg>lC#P*t@1xfT~+Bpj)SReYK7`KFQz1sHhwB>phgG%8TSe&xf{bbs#1NYf|TD zBMglHmj^XUe+gn?sBni%_x$20KYm^YT4lh1!_oF5SxggjpQO0YJ>X;01k&?_{~DvU z+rx(7=ez6uIZSkeyfl?}si*yYfouB*7@`h)=!WL;$Km=b9pi;f6U7D%yjAPy?PfwW z$Za^nlYC{Syc%ny|7w-nsJxqp?^Iyt3l9f5#=?ioA&Kod+7~+HBu~2IzB{y0pPW5?CR&{;BlwhQBKeea9`)wpd~6s=|BxL|+_C)f)%5@sbd= z{l1kwC^OTK9{76OB_pew1HGg}EDecIG7d&*5R1q}6t)xw#`2cqWNlbcInB6_ZRMfL zmasSD1!7Ecl>Adb6;=^R23pa2e!T>n{`ocj=Lb7tq%3_up8@lV{r16z9t{UO4rxI> z4a>9fxR?#lUj=b~%iS%2&kJs;o*LdXX`DIGZcELf?6!AQd=&SuyXi47iVYiHM-dFjzEmkWa`thP^!CNX z&{;Zpf8SqPSRme+335;%BmGOPK2M7EE=I!F*;FiC|N8LG+RJ_4pfh#%R0Q`Kqlix) zUkgv#D~!jSP?5V)7L$BJ%NsunTFe9?wJ$Oc&sR`cM)9P1+t zN-plChYl~9l_LqEy1y*mT#_tXT}EZ?3xNjFCbGb7P_WBL3HbZW?!&%h{rxv@{z-E1jKN^qt+}28fZA zf4Tt;0JB^^HF=d1eX4{l`uFPo2*B0)S}0iN79e1XC^9Te1&^#}@iq43f4~PLL<@k> zo58Tg2s*E*Y|gcRfB+WpVt-)`ln&P8c6QTF|KTGL>ij_i2+ZRHz?mR-{`ttiXaeQP zoQs9qe_^LEIEt6=@BBY6k;QP7-QO0zGgo9;X~5nspaI1tB8Ow{h%2(3{%_asu!;z} zv+bvUu?+lSyIngUZ}`drBv!G__v;J%Z7@7P+}zztW%!Hh0NWY5#A<2^ioER!TYz2r zLJpVz&R}@yP1w8|&~l=|2Lk$mPyk;9#%%wz;-bmF_eD2vjY_BA_j9F)r-+}Q=fd`x zn*9wq)?eDqBW(ny9E6Z(()xW_^Pa2M!tuEb$Z!-Oq zcl&|W!dvLI*9?4QVx*&=Kc_Kw$k=s;r|94&L=jCo^u1Hr6h^YM0N-M8lOM`wr(?F>iVA&Y(qgk$4_jJ^x|ngY z9i$X)Yu3=!@~YV4lW5QM_TaHZI*nVs=#HDi^vc|~nJV`ftC^hx!)m>9&t#e1ovRlA zJ0T|wv@)H7E+5|=QEskBG+j@)Xi#Z2C|8@hFnZ9^IfJ@tVRqtJ&H$=`y31n`{sP;+?G%%`^2+R{*WK2r7Ez7HQPb}kI0zdg-b;WBpC5I><=zKR7z zuYjKB!ss-?v_pRJ{pM9Ot_PRY$!La(0O9i6l$CAg_~36z40`975us$8(;~*EnTp4@$U77ckNf7Q120YEQ8E* zdzBXAS-yT9$_cEjhjn7wPhFXM=MeZ)X8823^& z`sxeU*LyLzedI@e$x7cnhCmF?9ILJb&cWAsU^#ggV(Qrd%m%*;uR~+J=BUjx`z{}*iEoUC`})@a5zh? zd4DMQXozI0)9aS7KN{YD66EJO^6LGTCDID+t}!}Bo{ZDAnG|2{dxUFxV-0!O^uJpo9x}`+G7XSz z{Xr#f{juqhf65$6B8Bv-L;{tsYHe+hx?6@J@&m?coNJdHK}euX`;LELtO+Y%+=t3h zvQ1PejjX4@EdoTH2~+i6C^?&X?t7UM+5qP6#&{sA-z|@e)us^veSkT362qbup?);> z;Zn1&w%L%V>B)kQ|7B5&(_^~C7sS!`Wf^0s%#?hoNY9??^GAasP-$FyjQL;vOxvW3 z6TtrYUMU|2-Mt{)pX{JaNY?K=vz! zeXbWEDf87$2lpaC)${d<;Efe(fe)&0709teT-cu$G`%{Ms!C6v^v#vO z$jBr>wnDAgzZ^8L`2N$?EBEzpYXxoRY3!bassW*b_!>`8W}6Ml*x_h@Ezix;k3NsC z^Ha%?k*H)CI8!v~`*{{T=Je-R#at{WTFvO#=?~F!8W2WkdxVj;I?{xvuRq|&t#&T3 zyI-`5hodiUDv!NaJGW@*+2gTa zBTL2n0>3ebbLdJ1e!v@Bxz%uyA;}Y;=!&S<3!^)fpJW(DVH&H`iU7L=SkbrSqWQXl zy`SW$4~3_t))#TIOCj0(1EErgbjlWV$apHyiq*zSHS+5fow2*`4=xD&m_$2vwhX<0 zw3nznKw%&Q0QeXQ{53=}K-mYfZ_m1}x)Uiq#P`vSe1ZhiA}FRZdPkaHq3YMG?ZLcM z^!4Xo9|X{zt4mNMCtR!rtS*vnqatUiNekaby^hIkQCU^ljzHbJ28V7%lA#iv&qPem zq~ccW_c>}9;`}1h{r7%fHawvy!4wdhTQD66+cA;pF!E;yh&(G^L!jmyS z!uAk_+_o05Tzp|~rcQ<)p9u$K{Al6DoOF-}=4bMj0`- zRZ=MZ6t9hf6A!JYz1`_~fvFrJrR)H{Ne!}|Ka#ZIN;Ep&pMSBJH+b{TqFS8{h9I4cg)Br9}U#=9(`SQAG+=R@KwAm3(Mql{zw{R!N3Pz3CFev+ti z6TKGk#2#zn{(YC74gxR@Ovtef$56fzp1@Q4R(-oc7hyI7#U==kV|>thj2fyvl<@6u zgB0)HIn4qqyvJi;WBz<(2yt^S;Mm+nfR7FjhbB2FB(m!HDd+!#+fv^8gydowgJr>H zV4fEZ$B))W{vvyoA85~0^LoP9@HqxB%SJQalGO$GV_zfq}E=Z<6(E62P@dA^Wr3Bdw9RCt<%0%49tLVT&R5 zduHm^?yg=1ZoPfX75(Wp=?0AB-2O^YZueM4TC=+Zh1Y3C&l>0f%|Yu@(ilGG>9F3DuS2L1ny#9JcrW&N(!B zg}q^{H~pW^XbkkpIA@0^xc<>dm;cq;RB(zgDG~gifwYU!@EMY){OZyA*U5x3YJShr zo-e(s?;k4MRVjc!^tDuK#y^EO4F5??Xtay0_WaLgW`S~wI#mDBEXcJtO}|3?NAP!6 zcXQGI7T_*u6k5vjSK&05dLj+=sqp{!{YkJ37QQX`81A7Oa@d$Y5StX6 From bfcf1f00aca5dae648b3a39488738c8632f67a14 Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Fri, 22 Mar 2019 14:29:45 -0500 Subject: [PATCH 08/15] Move all the files in shared/ into webextension/ --- Makefile | 14 +------------- bin/run-addon | 1 - webextension/README.md | 4 ++-- webextension/background/selectorLoader.js | 4 ++-- webextension/background/startBackground.js | 4 ++-- {shared => webextension}/selection.js | 0 {shared => webextension}/shot.js | 0 {shared => webextension}/thumbnailGenerator.js | 0 8 files changed, 7 insertions(+), 20 deletions(-) rename {shared => webextension}/selection.js (100%) rename {shared => webextension}/shot.js (100%) rename {shared => webextension}/thumbnailGenerator.js (100%) diff --git a/Makefile b/Makefile index 54f226eaa1..7bf2ed2bd4 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ l10n_dest := $(l10n_source:%/webextension.properties=webextension/_locales/%/mes postcss $< -o $@ --config .postcss/rtl .PHONY: addon -addon: npm set_sentry webextension/manifest.json addon_locales webextension/build/selection.js webextension/build/shot.js webextension/build/thumbnailGenerator.js webextension/build/inlineSelectionCss.js webextension/build/raven.js webextension/build/onboardingCss.js webextension/build/onboardingHtml.js webextension/build/buildSettings.js +addon: npm set_sentry webextension/manifest.json addon_locales webextension/build/inlineSelectionCss.js webextension/build/raven.js webextension/build/onboardingCss.js webextension/build/onboardingHtml.js webextension/build/buildSettings.js $(VENV): requirements.txt virtualenv -p python2.7 $(VENV) @@ -73,18 +73,6 @@ build/static/%.css: static/%.scss $(partials_source) webextension/manifest.json: webextension/manifest.json.template package.json ./bin/build-scripts/update_manifest.py $< $@ -webextension/build/selection.js: shared/selection.js - @mkdir -p $(@D) - ./bin/build-scripts/modularize selection $< > $@ - -webextension/build/shot.js: shared/shot.js - @mkdir -p $(@D) - ./bin/build-scripts/modularize shot $< > $@ - -webextension/build/thumbnailGenerator.js: shared/thumbnailGenerator.js - @mkdir -p $(@D) - ./bin/build-scripts/modularize thumbnailGenerator $< > $@ - webextension/build/inlineSelectionCss.js: build/static/css/inline-selection.css @mkdir -p $(@D) ./bin/build-scripts/css_to_js.py inlineSelectionCss $< > $@ diff --git a/bin/run-addon b/bin/run-addon index 0396d246cc..6d2971b91c 100755 --- a/bin/run-addon +++ b/bin/run-addon @@ -130,7 +130,6 @@ make addon run_nodemon() { nodemon \ - -w shared/shot.js \ -w Makefile \ -w static/css/inline-selection.scss \ -w static/css/onboarding.scss \ diff --git a/webextension/README.md b/webextension/README.md index 2a6d5f9133..154fdb1173 100644 --- a/webextension/README.md +++ b/webextension/README.md @@ -11,7 +11,7 @@ This contains all the files for the WebExtension. Most files are not "built", b - The selector content worker is loaded with a list in `background/selectorLoader.js`. Again this must be manually maintained. - The site helper worker is loaded via a separate list in `manifest.json.template` -Note that shared files are located directly in this directory. These files should have minimal (ideally no) requirements. Note that `shot.js` is *also* shared with the server, and is wrapped in a simple module pattern into `webextension/build/shot.js` +Note that shared files are located directly in this directory. - `catcher.js` has some functions for catching and reporting exceptions. - `randomString.js` generates a random string, typically for in shot IDs. @@ -26,7 +26,7 @@ The basic flow: 1. In response to a click, other files are loaded (these are listed in `startBackground.js`) and `main.onClicked()` called. 2. The background page loads the content worker with `background/selectorLoader.js` 3. `selector/shooter.js` handles most communication logic from the selector side -4. `shooter.js` collects the information and creates a Shot object. +4. `shooter.js` collects the information and creates a Shot object. 5. `selector/uicontrol.js` handles the UI logic, button handlers, selection process, etc. 6. When you hit **Download** and [canvas.drawWindow](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawWindow) is supported, then the `data:` URL is created immediately, an `` link is created and synthetically clicked. 7. When you hit **Download** and `canvas.drawWindow` isn't supported, then we send a message to ask the background page to capture the selection, turn it into a data URL, return the data URL, and then we continue with creating the anchor. diff --git a/webextension/background/selectorLoader.js b/webextension/background/selectorLoader.js index 3bc8341f79..099f2ae4ba 100644 --- a/webextension/background/selectorLoader.js +++ b/webextension/background/selectorLoader.js @@ -25,8 +25,8 @@ this.selectorLoader = (function() { const selectorScripts = [ "clipboard.js", "makeUuid.js", - "build/selection.js", - "build/shot.js", + "selection.js", + "shot.js", "randomString.js", "domainFromUrl.js", "build/inlineSelectionCss.js", diff --git a/webextension/background/startBackground.js b/webextension/background/startBackground.js index a4e3cb3794..f05dbc778f 100644 --- a/webextension/background/startBackground.js +++ b/webextension/background/startBackground.js @@ -20,8 +20,8 @@ this.startBackground = (function() { "background/communication.js", "background/senderror.js", "build/raven.js", - "build/shot.js", - "build/thumbnailGenerator.js", + "shot.js", + "thumbnailGenerator.js", "background/analytics.js", "background/main.js", ]; diff --git a/shared/selection.js b/webextension/selection.js similarity index 100% rename from shared/selection.js rename to webextension/selection.js diff --git a/shared/shot.js b/webextension/shot.js similarity index 100% rename from shared/shot.js rename to webextension/shot.js diff --git a/shared/thumbnailGenerator.js b/webextension/thumbnailGenerator.js similarity index 100% rename from shared/thumbnailGenerator.js rename to webextension/thumbnailGenerator.js From ed3b04a3507e6f8105c6e2ee19eb6c74c5ebbf17 Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Fri, 22 Mar 2019 14:36:46 -0500 Subject: [PATCH 09/15] Remove server-only css files --- static/css/frame.scss | 837 ------------------------------------- static/css/home.scss | 477 --------------------- static/css/metrics.scss | 39 -- static/css/settings.scss | 167 -------- static/css/shot-index.scss | 336 --------------- static/css/simple.scss | 5 - static/css/styles.scss | 340 --------------- 7 files changed, 2201 deletions(-) delete mode 100644 static/css/frame.scss delete mode 100644 static/css/home.scss delete mode 100644 static/css/metrics.scss delete mode 100644 static/css/settings.scss delete mode 100644 static/css/shot-index.scss delete mode 100644 static/css/simple.scss delete mode 100644 static/css/styles.scss diff --git a/static/css/frame.scss b/static/css/frame.scss deleted file mode 100644 index 51bf4705ce..0000000000 --- a/static/css/frame.scss +++ /dev/null @@ -1,837 +0,0 @@ -@import "partials/partials"; -@import "partials/delete-confirmation"; - -.alt-notification { - @include flex-container(row, flex-start, center); - min-height: 55px; - padding: 5px 20px; -} - -.back-to-home { - background-position: left center; - background-image: url("../img/icon-screenshot.svg"); - background-repeat: no-repeat; - background-size: 36px auto; - padding-inline-start: 52px; - margin: 0 16px; - - [dir="rtl"] & { - background-position: right center; - } - - span { - display: block; - text-align: start; - margin: 0; - font-size: 20px; - &.small-text { - font-size: 18px; - padding-top: 0; - padding-inline-end: 5px; - padding-bottom: 0; - padding-inline-start: 0; - font-weight: bold; - } - } - - @include respond-to("small") { - background-size: 24px auto; - padding-inline-start: 35px; - border: 0; - margin: 0 2px; - span { - font-size: 18px; - &.small-text { - font-size: 16px; - } - } - } - - .sub { - font-size: 12px; - } -} - -.shot-main-actions { - - @include respond-to("large") { - @include flex-container(row, flex-start, center); - } - - @include respond-to("small") { - @include flex-container(row, flex-start, center); - background: $light-default; - height: $grid-unit * 3.5; - } - - flex: 1; - position: relative; - min-width: 0; - - .expire-info { - display: block; - @include respond-to("small") { - &.time-diff, - & + span { - display: none; - } - } - } -} - -.shot-alt-actions { - .edit-shot-button { - position: relative; - } - @include flex-container(row, flex-end, center); - @include respond-to("large") { - background-color: $light-default; - justify-content: flex-end; - border: none; - flex: initial; - order: 0; - } - background-color: $white; - border-bottom: 1px solid rgba($black, 0.1); - border-top: 1px solid $light-border; - flex: 0 0 100%; - flex-wrap: wrap; - justify-content: center; - min-width: $grid-unit * 15; - order: 1; -} - -.shot-info { - @include flex-container(column, center, flex-start); - color: $black; - padding-top: 0; - padding-inline-end: 0; - padding-bottom: 0; - padding-inline-start: $grid-unit * 0.5; - width: 100%; - - @include respond-to("large") { - max-width: auto; - padding-top: 0; - padding-inline-end: 0; - padding-bottom: 0; - padding-inline-start: $grid-unit; - } - - > div { - white-space: nowrap; - } -} - -.shot-title, -.shot-subtitle { - overflow-x: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; - width: auto; - max-width: 100%; -} - -.shot-title { - @include respond-to("large") { - font-size: 32px; - line-height: 39px; - padding-bottom: 8px; - } - font-weight: bold; - font-size: 24px; - line-height: 29px; - padding-bottom: 4px; - - &.saving { - opacity: 0.7; - } - - &.editable { - cursor: default; - padding-inline-end: 32px; - - &:hover { - @include respond-to("large") { - background-size: 24px 24px; - background-position: right 9px; - } - background-image: url("/static/img/pencil.svg"); - background-position: right 5px; - background-repeat: no-repeat; - background-size: 20px 20px; - - [dir="rtl"] & { - background-position: left 5px; - } - } - } -} - -.shot-subtitle { - @include flex-container(row, flex-start, center); - @include respond-to("large") { - font-size: 14px; - line-height: 17px; - } - font-size: 12px; - line-height: 15px; -} - -.shot-title-input { - @include respond-to("large") { - max-width: 200px; - font-size: 32px; - line-height: 39px; - padding-bottom: 1px; - margin: 0 0 4px 0; - } - - border-radius: $border-radius; - border: 1px solid $active-blue; - font-size: 24px; - font-weight: bold; - inset-inline-start: -3px; - line-height: 29px; - margin: 0; - max-width: 100px; - overflow: auto; - padding-bottom: 1px; - padding-inline-start: 2px; - position: relative; - top: -2px; -} - -.subtitle-link { - text-overflow: ellipsis; - overflow: hidden; -} - -.promo-panel { - @include respond-to("large") { - top: 95px; - } - background: $white; - border-radius: 3px; - box-shadow: $stroke-box-shadow, $medium-box-shadow; - padding: 5px; - position: absolute; - top: 60px; - inset-inline-end: -30px; - text-align: center; - width: 150px; - z-index: 999; - - .title { - font-size: 14px; - line-height: 14px; - margin: 5px; - } - - .message { - font-size: 12px; - margin: 5px 2px; - } - - .message-text { - margin: 0 2px; - } - - a.box-close { - position: absolute; - top: 2px; - inset-inline-end: 2px; - cursor: pointer; - color: $black; - width: 15px; - height: 15px; - line-height: 12px; - } - - .box-close:before { - content: "×"; - } - - .box-close:hover { - background-color: $light-hover; - } -} - -.delete-confirmation-dialog { - &.right-align { - @include respond-to("large") { - top: 78px; - } - top:58px; - } -} - -.clips { - @include flex-container(column, center, center); - position: relative; - flex: 1; -} - -// TODO: fix color literals in #3864 -.clips-warning { - background: #ffe900; - padding: 5px; - border-bottom: 1px solid #d7b600; - border-top: 1px solid #d7b600; - position: absolute; - text-align: center; - top: 0; - width: 100%; - color: $black; - font-size: 12px; -} - -.clip-container { - @include flex-container(row, center, center); - flex: 0 auto; - margin: 20px auto; - max-width: 90%; - - img { - box-shadow: $large-box-shadow; - } -} - -.link-button { - cursor: pointer; - color: $black; - background: transparent; - border: 1px solid $light-active; - padding: 4px; - border-radius: 4px; -} - -#clip-image-context { - display: none; -} - -.pen-button, -.text-button, -.highlight-button { - background-size: $grid-unit $grid-unit; - background-repeat: no-repeat; - background-position: center center; - margin-inline-end: $grid-unit * 0.5; - transition: background-image 150ms $bezier; -} - -.edit-highlight { - @include respond-to("large") { - inset-inline-start: 50px; - top: 25px; - } - background-image: url("../img/edit-highlight.svg"); - height: 17px; - width: 17px; - position: absolute; - inset-inline-start: 30px; - top: 15px; - cursor: pointer; -} - -.highlight-button { - background-image: url("../img/annotation-highlight.svg"); - - &:hover { - background-color: $light-hover; - } - - &:active, - &.active { - background-image: url("../img/annotation-highlight-active.svg"); - } -} - -.pen-button { - background-image: url("../img/annotation-pen.svg"); - - &:hover { - background-color: $light-hover; - } - - &:active, - &.active { - background-image: url("../img/annotation-pen-active.svg"); - } -} - -.undo-button { - background: url("../img/annotation-redo.svg"); - transform: scale(-1, 1); - - [dir="rtl"] & { - transform: scale(1, 1); - } -} - -.redo-button { - background-image: url("../img/annotation-redo.svg"); - - [dir="rtl"] & { - transform: scale(-1, 1); - } -} - -.clear-button { - background-image: url("../img/reset.svg"); -} - -.undo-button, -.redo-button, -.clear-button { - background-repeat: no-repeat; - background-position: center; - - &:hover { - background-color: $light-hover; - } - &.inactive { - filter: brightness(2.4); - - &:hover, - &:active, - &:focus { - background-color: transparent; - cursor: default; - } - } -} - -.annotation-divider { - border-inline-end: 1px solid $light-border-active; - margin: auto auto; - width: 1px; - height: 28px; -} - -html { - min-height: 100%; - position: relative; -} - -body { - width: 100%; - margin: 0; - height: 100%; -} - -.editor-header { - @include respond-to("medium") { - @include flex-container(row, space-between, stretch, wrap); - } - - @include respond-to("small") { - @include flex-container(row, space-between, stretch, wrap); - height: $grid-unit * 7; - } - display: flex; - height: 96px; - z-index: 2; - position: fixed; - width: 100%; - pointer-events: none; - - .shot-edit-main-actions { - @include respond-to("medium") { - @include flex-container(row, flex-start, center); - margin-inline-end: 10px; - } - - @include respond-to("small") { - @include flex-container(row, flex-start, center); - background: $light-default; - border-bottom: 1px solid rgba($black, 0.1); - border-top: 1px solid $light-border; - flex: 0 0 100%; - height: $grid-unit * 3.6; - order: 1; - width: 100%; - } - - flex: 1; - position: relative; - } - - .shot-edit-alt-actions { - @include flex-container(row, flex-end, center); - margin: 0 20px; - } - - .button { - margin-inline: $grid-unit * 0.5; - pointer-events: all; - } - - .cancel, - .save { - min-width: 100px; - &:disabled { - opacity: 0.4; - cursor: wait; - } - } - - .cancel { - background-color: $light-default; - border: 1px solid $light-border-active; - - &:hover, - &:focus { - background-color: $light-hover; - } - - &:active { - background-color: $light-active; - } - } -} - -.annotation-tools { - margin: auto $grid-unit; - display: flex; - flex-direction: row; - align-items: center; - background: $white; - box-shadow: $medium-box-shadow; - border-radius: $border-radius; - height: 50px; - pointer-events: all; -} - -.annotation-main-actions { - overflow: visible; -} - -.annotation-alt-actions { - height: 72px; - @include respond-to("small") { - width: 100%; - justify-content: center; - } -} - -.main-container { - align-items: center; - display: flex; - flex-direction: column; - flex: 1; - justify-content: center; - margin: $grid-unit auto; - padding: $grid-unit * 4.8; - position: relative; - z-index: 1; - - @include respond-to("small") { - top: $grid-unit * 2; - } -} - -.canvas-container { - box-shadow: $large-box-shadow; - display: flex; - justify-content: center; - z-index: 9999; - position: relative; -} - -.canvas-container .image-holder { - z-index: 2; - - &.pen { - cursor: url("../img/cursor-pen.png"), auto; - } - - &.highlighter { - cursor: url("../img/cursor-highlight.png"), auto; - } -} - -.highlighter { - mix-blend-mode: multiply; - z-index: 4; - - &.white { - mix-blend-mode: soft-light !important; - } -} - -.image-holder { - z-index: 0; -} - -.centered { - position: absolute; - overflow: hidden; - top: 0; - bottom: 0; -} - -#color-button-container { - width: 40px; - height: 40px; - margin: 5px 10px; - position: relative; -} - -#color-button-highlight { - display:none; - min-width: 40px; - height: 40px; - border-radius: 3px; - position: absolute; - background-color: $light-hover; -} - -#color-picker { - border-radius: 11px; - position: absolute; - height: 22px; - width: 22px; - margin-top: 9.5px; - margin-inline-end: 10px; - margin-bottom: 0; - margin-inline-start: 9px; - z-index: 2; - - &:hover { - cursor: pointer; - } -} - -#color-picker:hover + #color-button-highlight, -#color-picker:focus + #color-button-highlight { - display: block; - z-index: 1; -} - -.color-board { - margin-top: $grid-unit * 2.5; - z-index: 2; - width: 160px; - height: 160px; - position: absolute; - background: $light-default; - border-radius: $border-radius; - box-shadow: $stroke-box-shadow, $medium-box-shadow; - padding: 20px; - - .triangle { - position: absolute; - width: 0; - height: 0; - border-inline-start: 10px solid transparent; - border-inline-end: 10px solid transparent; - border-bottom: 15px solid $light-active; - top: -15px; - inset-inline-start: 9.5px; - - .triangle-inner { - position: absolute; - width: 0; - height: 0; - border-inline-start: 8px solid transparent; - border-inline-end: 8px solid transparent; - border-bottom: 13px solid $light-default; - inset-inline-start: -8px; - top: 2px; - } - } -} - -.color-board .color-row { - display: flex; -} - -.swatch { - margin: 5px; - flex-direction: row; - flex-wrap: wrap; - width: 30px; - height: 30px; - border-radius: 15px; - - &:hover - { - border: 3px solid $light-active !important; - } -} - -.crop-tool { - z-index: 3; -} - -.crop-container { - z-index: 4; -} - -.crop-button { - background-image: url("../img/crop.svg"); - background-repeat: no-repeat; - background-position: center; -} - -// CSS used for Annotation Text Tool -.text-select { - -moz-appearance: none; //sass-lint:disable-line no-vendor-prefixes - -webkit-appearance: none; - appearance: none; - background-color: $light-default; - background-image: url("../img/icon-dropdown.svg"); - background-position: right 8px top 8px; - background-repeat: no-repeat; - background-size: 10px auto; - border-radius: $border-radius; - border: 1px solid $light-border; - color: $dark-default; - cursor: pointer; - font-size: 14px; - font-weight: 400; - height: 26px; - margin-top: 12px; - margin-inline-end: 5px; - margin-bottom: 12px; - margin-inline-start: 15px; - outline: none; - padding-top: 0; - padding-inline-end: 24px; - padding-bottom: 0; - padding-inline-start: 4px; - position: relative; - text-align: center; - text-decoration: none; - transition: background 150ms $bezier, border 150ms $bezier; - user-select: none; - white-space: nowrap; - vertical-align: middle; - - [dir="rtl"] & { - background-position: left 8px top 8px; - } - - &:hover, - &:focus { - background-color: $light-hover; - border-color: $light-border-active; - } - - &:active { - background-color: $light-active; - border-color: $light-border-active; - } - - option { - padding-top: 0; - padding-inline-end: 40px; - padding-bottom: 0; - padding-inline-start: 4px; - } -} - -.text-button { - background-image: url("../img/annotation-text.svg"); - background-repeat: no-repeat; - background-position: center; - - &:hover { - background-color: $light-hover; - } -} - -.text-tool-container { - z-index: 4; -} - -// Text Sizes used in the text tool -$large: 36px; -$medium: 24px; -$small: 16px; - -// Colors used in the text tool -$red: rgb(231, 76, 60); -$green: rgb(46, 204, 113); -$blue: rgb(52, 152, 219); -$yellow: rgb(255, 255, 0); -$purple: rgb(142, 68, 173); -$sea-green: rgb(26, 188, 156); -$grey: rgb(52, 73, 94); - -$bg-black: rgba(0, 0, 0, 0.6); -$bg-white: rgba(255, 255, 255, 0.7); - -@mixin type-box($size) { - padding: 4px $size * 0.5; - font-size: $size; -} - -@mixin type-color($b, $f) { - background: $b; - color: $f; -} - -.text { - cursor: text; - font-weight: 900; - font-family: sans-serif; - white-space: nowrap; - outline: 0; - border: none; - white-space : pre; -} - -.large-text { - @include type-box($large); -} - -.medium-text { - @include type-box($medium); -} - -.small-text { - @include type-box($small); -} - - -.textTool { - - .black { - @include type-color($bg-white, $black); - } - - .white { - @include type-color($bg-black, $white); - } - - .red { - @include type-color($bg-black, $red); - } - - .green { - @include type-color($bg-black, $green); - } - - .blue { - @include type-color($bg-white, $blue); - } - - .yellow { - @include type-color($bg-black, $yellow); - } - - .purple { - @include type-color($bg-white, $purple); - } - - .sea-green { - @include type-color($bg-black, $sea-green); - } - - .grey { - @include type-color($bg-white, $grey); - } -} diff --git a/static/css/home.scss b/static/css/home.scss deleted file mode 100644 index aead4b4f08..0000000000 --- a/static/css/home.scss +++ /dev/null @@ -1,477 +0,0 @@ -@import "partials/partials"; - -html, -body { - padding: 0; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "segoe ui", "helvetica neue", helvetica, ubuntu, roboto, noto, arial, sans-serif; - font-size: 12pt; -} - -.container { - -ms-flex-align: center; - -ms-flex-pack: end; - align-items: center; - display: -ms-flexbox; - display: flex; - flex-basis: auto; - flex-grow: 1; - height: 100%; - justify-content: space-between; - margin: 0 auto; - max-width: 1160px; - min-width: 0; - padding: 40px 33px; - position: relative; -} - -/* Header Banner */ - -.banner { - align-items: center; - background-color: #04d1e6; - display: flex; - flex-direction: row-reverse; - justify-content: flex-start; - min-height: 587px; - position: relative; -} - - -.banner-container { - @include flex-container(row, center, center); - max-width: 1160px; - min-width: 960px; - margin: 0 auto; - position: relative; -} - -.banner-image-front { - background-image: url("../img/banner-front.svg"); - background-position: center center; - background-repeat: no-repeat; - background-size: 400px auto; - flex: 0 0 420px; - height: 440px; -} - -.banner-image-back { - background-image: url("../img/banner-back.svg"); - background-position: center 25%; - background-repeat: no-repeat; - position: absolute; - top: 0; - inset-inline-end: 0; - inset-inline-start: 0; - bottom: 0; - z-index: 0; -} - -.banner-content { - min-width: 430px; - padding: 10px; -} - -.banner-content h1 { - color: $white; - font-size: 3em; - font-weight: 400; - margin: 0 0 20px; -} - -.banner-content p { - color: $white; - font-size: 1.3em; - font-weight: 400; - line-height: 1.61; - margin: 0; - padding-inline-end: 30px; -} - -h2 { - color: #004c66; - font-size: 2.3em; - font-weight: 600; - line-height: 55px; - margin: 29px 20px 22px; - text-align: center; -} - -.button { - -moz-user-select: none; - -ms-user-select: none; - -webkit-user-select: none; - border-radius: 3px; - border: 1px solid transparent; - box-shadow: $medium-box-shadow; - cursor: pointer; - display: inline-block; - font-weight: 400; - height: 40px; - line-height: 40px; - outline: none; - position: relative; - text-align: center; - text-decoration: none; - transition: background 0.15s, width 0.15s; - user-select: none; - white-space: nowrap; -} - -.download-firefox { - -moz-user-select: none; - -ms-flex-align: center; - -ms-flex-direction: row; - -ms-flex-pack: center; - -ms-user-select: none; - -webkit-user-select: none; - align-items: center; - color: $white; - display: -ms-flexbox; - display: flex; - flex-direction: row; - font-weight: 500; - height: 80px; - justify-content: center; - margin-top: 30px; - transition-duration: 0.25s; - transition-property: box-shadow, border; - user-select: none; - width: 260px; -} - -.button.primary.download-firefox { - background: #30e60b; - color: #fff; - text-align: start; - - &:hover, - &:focus { - background: #20c60b; - } - - &:active { - background: #10b60b; - box-shadow: $small-box-shadow; - } - -} - -.download-firefox .button-icon { - -ms-flex: 0 0 57px; - background-image: url("../img/landing-small-firefox-logo@2x.png"); - background-position: 50%; - background-repeat: no-repeat; - background-size: 57px 59px; - flex: 0 0 57px; - height: 59px; - margin-inline-end: 16px; - position: relative; -} - -.download-firefox .button-icon-badge { - background-color: $white; - background-image: url("../img/landing-download-icon@2x.png"); - background-position: 50%; - background-repeat: no-repeat; - background-size: 14px 14px; - border-radius: 50%; - bottom: 4px; - box-shadow: $small-box-shadow; - height: 16px; - padding: 6px; - position: absolute; - inset-inline-end: 2px; - transition-duration: 0.15s; - width: 16px; -} - -.download-firefox .button-title { - font-size: 24px; - font-weight: 600; - line-height: 1em; - margin-bottom: 0.25em; -} - -.download-firefox .button-description { - font-size: 18px; - font-weight: 300; - line-height: 1em; -} - -/* Instruction Sections */ - -section { - align-items: center; - display: flex; - min-height: 600px; -} - -section:nth-child(even) { - background-color: #f7fdfe; -} - -section .container { - max-width: 1100px; - padding: 40px 63px; -} - -.section-content h3 { - font-size: 2.2em; - font-weight: 400; - margin: 0; -} - -.section-content .bold { - font-weight: 500; -} - -.section-content { - color: #4a4a4a; - display: flex; - flex-direction: column; - justify-content: flex-start; - line-height: 1.61; - width: 36%; -} - -.section-image { - background-size: contain; - display: flex; - height: auto; - justify-content: flex-end; - width: 50%; -} - -#section-1 .section-image { - background-image: url("../img/landing-screenshots_image_01.svg"); - background-position: 100% center; - background-repeat: no-repeat; - height: 476px; -} - -#section-1 .section-image.page-action { - background-image: url("../img/landing-screenshots_image_01_57.svg"); -} - -#section-2 .section-image { - background-image: url("../img/landing-screenshots_image_02.svg"); - background-position: 0% center; - background-repeat: no-repeat; - height: 500px; -} - -#section-3 .section-image { - background-image: url("../img/landing-screenshots_image_03.svg"); - background-position: 100% center; - background-repeat: no-repeat; - height: 519px; -} - -#section-4 .section-image { - background-image: url("../img/landing-screenshots_image_04.svg"); - background-position: 100% center; - background-repeat: no-repeat; - height: 533px; -} - -#section-5 .section-image { - background-image: url("../img/landing-screenshots_image_05.svg"); - background-position: 100% center; - background-repeat: no-repeat; - height: 533px; -} - -/* These align-* layout styles are used for the onboarding tour sections */ -.align-left { - order: 1; -} - -.align-right { - order: 2; -} - -/* Coming Soon Section */ - -#coming { - min-height: 350px; -} - -#coming .container { - max-width: 840px; - padding: 40px 100px; -} - -.coming-content { - color: #4a4a4a; - display: flex; - flex-direction: column; - justify-content: flex-end; - width: 45%; -} - -.coming-content h3 { - font-size: 2em; - font-weight: 100; - margin: 0; -} - -.coming-content p { - font-size: 0.9em; - line-height: 1.61; - margin-bottom: 0; -} - -.coming-icons { - display: flex; - flex-direction: row; - justify-content: flex-start; -} - -.coming-icons span { - color: #4a4a4a; - font-size: 2em; - margin: 0 33px; - position: relative; - top: 16px; -} - -.coming-icons div { - background-repeat: no-repeat; - background-size: contain; - height: 80px; - width: 80px; -} - - - -/* Responsive */ - -@media (max-width: 1120px) and (min-width: 769px) { - - .banner { - min-height: 500px; - } - - .banner-container { - max-width: 750px; - min-width: 750px; - } - - .banner-content { - min-width: 320px; - width: 350px; - } - - .banner-image-front { - background-size: 360px auto; - flex: 0 0 400px; - height: 420px; - } - - .banner-image-back { - background-size: 90% auto; - background-position: 300px center; - } - - section { - min-height: 500px; - } -} - -@media (max-width: 768px) { - .container { - flex-direction: column; - justify-content: center; - text-align: center; - } - .banner { - background-image: url("../img/landing-screenshots_mobile.svg"); - background-repeat: no-repeat; - background-position: 100% 20%; - height: 320px; - } - - .banner-image-back, - .banner-image-front { - display: none; - } - - .banner-spacer { - height: 74px; - } - - .banner-container { - min-width: 0; - } - - .banner-content { - margin-top: 80px; - max-width: 500px; - min-width: 0; - text-align: center; - } - - .banner-content p { - font-size: 1.2em; - padding-inline-end: 0; - } - - .button { - margin-inline-end: auto; - margin-inline-start: auto; - } - - h2 { - font-size: 1.6em; - } - - section { - min-height: 550px; - } - - section .container { - padding: 40px 33px; - } - - .section-content h3 { - font-size: 2em; - } - - .section-content { - max-width: 500px; - - order: 1 !important; - width: 100%; - } - - .section-image { - background-position: center center !important; - height: 90vw !important; - margin-top: 33px; - max-height: 500px; - max-width: 500px; - order: 2 !important; - width: 90vw !important; - } - - #coming .container { - padding: 40px 33px; - } - - .coming-content { - margin-top: 40px; - max-width: 300px; - width: 100%; - } - - .coming-icons div { - height: 50px; - width: 50px; - } - - .coming-icons span { - margin: 0 16px; - top: 3px; - } -} diff --git a/static/css/metrics.scss b/static/css/metrics.scss deleted file mode 100644 index a8c36c64f3..0000000000 --- a/static/css/metrics.scss +++ /dev/null @@ -1,39 +0,0 @@ -body { - font-family: -apple-system, BlinkMacSystemFont, "segoe ui", "helvetica neue", helvetica, ubuntu, roboto, noto, arial, sans-serif; -} - -table.generic-table { - - th { - border-bottom: 2px solid #000; - } - - th, - td { - border-spacing: 0; - border-collapse: collapse; - margin: 0; - } - - td:not(:last-child) { - border-right: 1px solid #ddd; - } - - tr:not(:first-child) td { - border-top: 1px solid #ddd; - } - - th:not(:last-child), - td:not(:last-child) { - padding-right: 30px; - } - - td { - text-align: right; - } -} - -.execution-time { - color: #666; - font-size: 90%; -} diff --git a/static/css/settings.scss b/static/css/settings.scss deleted file mode 100644 index fdf62f9c9d..0000000000 --- a/static/css/settings.scss +++ /dev/null @@ -1,167 +0,0 @@ -@import "partials/partials"; - -.close-preferences { - @include flex-container(row, flex-start, stretch); - background-image: url("../img/close-16.svg"); - background-size: $grid-unit $grid-unit; - background-repeat: no-repeat; - background-position: center center; - - &:hover { - background-color: $light-hover; - } - - &:active { - background-color: $light-active; - } -} - -.header { - color: #0c0c0d; - font-size: 22px; -} - -#settings-header { - align-items: flex-end; - display: flex; - height: 72px; - justify-content: flex-end; - margin: 0 auto; - - @include respond-to("small") { - width: 380px; - } - - @include respond-to("medium") { - width: 720px; - } - - @include respond-to("large") { - width: 960px; - } -} - -.sub-header { - color: #0c0c0d; - font-size: 17px; - opacity: 0.86; - font-weight: bold; - letter-spacing: -0.31px; -} - -.preferences { - margin: auto; - padding: 20px 20px 0 20px; - - @include respond-to("small") { - width: 380px; - padding: 40px 0; - } - - @include respond-to("medium") { - width: 720px; - } - - @include respond-to("large") { - width: 960px; - } - - .info-container { - margin-inline-start: 30px; - height: 100px; - display: flex; - flex-direction: column; - justify-content: space-around; - } - - hr { - display: block; - height: 1px; - border: 0; - border-top: 1px solid #e5e5e5; - margin: auto; - padding: 0; - } - - .account-info { - @include flex-container(row, start, center); - - img { - border-radius: 50%; - box-shadow: $small-box-shadow; - overflow: hidden; - } - } - - .title { - font-weight: 500; - font-size: 17px; - color: #0c0c0d; - margin: 0 0 10px; - } - - .info { - font-size: 15px; - color: #0c0c0d; - margin-top: 5px; - } - - .sub-info { - color: $gray; - font-size: 13px; - max-width: 400px; - margin-top: 15px; - } - - .email { - margin-top: -20px; - font-size: 14.6px; - color: #383e49; - } - - .account-buttons { - box-sizing: border-box; - font-size: 15px; - display: flex; - align-items: center; - justify-content: center; - color: #0c0c0d; - text-decoration: none; - border: 1px solid rgba(12, 12, 13, 0.3); - border-radius: 2px; - width: 150px; - height: 30px; - cursor: pointer; - - &:hover { - background-color: $light-hover; - } - - &:active { - background-color: $light-active; - } - } - - .settingsBody { - @include flex-container(row, flex-start, stretch, wrap); - } - - .fxaSyncImage { - background-image: url("../img/fxa-sync.svg"); - background-repeat: no-repeat; - background-size: 410px auto; - background-position: center center; - margin-top: $grid-unit; - min-width: 410px; - height: 300px; - - @include respond-to("small") { - min-width: 380px; - background-size: 380px auto; - } - - @include respond-to("large") { - margin-left: $grid-unit * 4; - } - } -} diff --git a/static/css/shot-index.scss b/static/css/shot-index.scss deleted file mode 100644 index 6cb7fd425b..0000000000 --- a/static/css/shot-index.scss +++ /dev/null @@ -1,336 +0,0 @@ -@import "partials/partials"; -@import "partials/delete-confirmation"; - -$shot-width: 210px; - -//Shot index page styles - -#search-form { - @include flex-container(row, flex-start, stretch); - position: absolute; - inset-inline-end: 150px; - top: 40px; - - @include respond-to("small") { - inset-inline-end: 100px; - top: 60px; - } - - .clear-search { - width: 28px; - height: 28px; - background: transparent; - border: 0; - background-image: url("../img/icon-clear.svg"); - background-size: 12px 12px; - background-repeat: no-repeat; - background-position: center top 5px; - position: absolute; - inset-inline-end: 0; - opacity: 0; - transition: opacity $bezier 150ms; - } - - input[type="search"] { - background: transparent; - background-image: url("../img/icon-search.svg"); - background-repeat: no-repeat; - background-size: 20px 20px; - border: 0; - border-bottom: 1px solid $link-medium; - font-size: 16px; - padding-top: 0; - padding-inline-end: 28px; - padding-bottom: 8px; - padding-inline-start: 24px; - transition: border-color $bezier 150ms; - width: $shot-width; - - &:focus { - border-bottom-color: $link-blue; - - + .clear-search { - opacity: 0.5; - } - } - } - - button[title="search"] { - display: none; - } -} - -#shot-index { - @include flex-container(column, flex-start, stretch); - - @include respond-to("small") { - width: 240px; - } - - @include respond-to("medium") { - width: 720px; - } - - @include respond-to("large") { - width: 960px; - } - - margin: 24px auto; -} - -.shot { - background: $white; - box-shadow: $large-box-shadow; - margin: 15px; - transition: box-shadow 250ms; - width: $shot-width; - - .share-panel { - inset-inline-start: 0; - top: 72px; - } - - .alt-actions-container { - @include flex-container(row, space-around, center); - padding: 12px; - position: absolute; - bottom: 0; - height: 69px; - inset-inline-start: 0; - inset-inline-end: 0; - background: $white; - opacity: 0; - } - - &:hover, - &.panel-open { - box-shadow: 0 0 0 5px $light-active; - - .alt-actions-container { - opacity: 1; - } - - .non-fav-shot { - display: block; - } - } - - .shot-image-container { - background-size: cover; - box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05) inset; - width: $shot-width; - overflow: hidden; - } - - &.landscape { - .shot-image-container { - height: 140px; - img { - height: 140px; - } - } - - .synced-shot { - top: 120px; - } - } - - &.portrait { - .shot-image-container { - height: 280px; - img { - width: 210px; - } - } - - .synced-shot { - top: 260px; - } - } - - &.square-x { - .shot-image-container { - height: 210px; - img { - width: 210px; - } - } - - .synced-shot { - top: 190px; - } - } - &.square-y { - .shot-image-container { - height: 210px; - img { - height: 210px; - } - } - - .synced-shot { - top: 190px; - } - } - - &.deleted { - opacity: 0; - transform: scale(0.5); - transition: transform 500ms $bezier, opacity 500ms $bezier; - - } - - .title-container { - overflow: hidden; - margin: 0 0 10px; - } - - h4 { - font-size: 15px; - overflow: hidden; - margin: 0; - font-weight: 400; - color: $dark-default; - white-space: nowrap; - text-overflow: ellipsis; - width: 172px; - } - - .link-container { - @include flex-container(row, flex-start, center); - - .shot-url { - color: $link-medium; - font-size: 12px; - max-width: 165px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - } - - .shot-info { - height: 45px; - margin: 12px; - } - - .indicator { - position: absolute; - width: 40px; - height: 40px; - border-radius: 20px; - background-color: $white; - background-position: center; - background-repeat: no-repeat; - &.link { - &:hover { - background-color: $light-hover; - } - &:active { - background-color: $light-active; - } - } - } - - .fav-shot, - .non-fav-shot { - cursor: pointer; - inset-inline-end: 12px; - top: 12px; - background-size: 20px 20px; - border: 1px solid $light-hover; - box-shadow: $small-box-shadow; - } - - .fav-shot { - background-image: url("../img/icon-heart.svg"); - &.inactive { - cursor: default; - opacity: 0.4; - } - } - - .non-fav-shot { - display: none; - background-image: url("../img/icon-heart-outline.svg"); - } - - .synced-shot { - inset-inline-end: 12px; - - img { - padding: 8px; - filter: brightness(2.8); - } - } -} - -.preferences { - @include flex-container(row, flex-start, stretch); - background-size: $grid-unit $grid-unit; - background-repeat: no-repeat; - background-position: center center; - background-image: url("../img/preferences-16.svg"); - position: absolute; - inset-inline-end: 0; - top: 0; - - &:hover { - background-color: $light-hover; - } - &:active { - background-color: $light-active; - } -} - -.no-shots { - @include flex-container(column, center, center); - flex: 1; - - p { - margin: 0; - text-align: center; - } -} - -#shot-index-page-navigation { - font-size: 20px; - text-align: center; - - #shots-page-number { - margin-inline-start: 40px; - margin-inline-end: 40px; - padding: 0; - } - - span { - padding: 10px; - width: 40px; - - &.shots-page-nav { - line-height: 0; - - &.disabled { - opacity: 0.3; - } - - a { - border-radius: 3px; - height: 40px; - - &:hover { - background-color: #d7d7db; - } - &:active { - background-color: #b1b1b3; - } - } - - } - - img { - width: 20px; - vertical-align: middle; - } - } -} diff --git a/static/css/simple.scss b/static/css/simple.scss deleted file mode 100644 index 1b534e5501..0000000000 --- a/static/css/simple.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import "partials/partials"; - -.alt-content .button { - margin: 20px auto; -} diff --git a/static/css/styles.scss b/static/css/styles.scss deleted file mode 100644 index abfd51b6c6..0000000000 --- a/static/css/styles.scss +++ /dev/null @@ -1,340 +0,0 @@ -$primary-color: #fcfcfc; -$toolbar-text-color: #464239; -$text-color: #f2f2f2; -$background-color: #282d33; -$shadow-color: rgba(#000, 0.5); - -html { - height: 100%; -} - -body { - min-height: 100%; - width: 100%; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "segoe ui", "helvetica neue", helvetica, ubuntu, roboto, noto, arial, sans-serif; - background-color: $background-color; - color: $text-color; - box-sizing: border-box; -} - -#container { - position: absolute; - left: 0; - right: 0; - top: 0; - padding-top: 0; - padding-left: 0; - padding-right: 0; - text-align: center; - min-height: 100%; -} - -#frame { - border: 0; - margin-top: 65px; - margin-bottom: 4em; - box-shadow: 0 -5px 5px $shadow-color; -} - -#toolbar { - position: fixed; - top: 0; - left: 0; - right: 0; - height: 35px; - padding: 15px; - padding-left: 150px; - padding-right: 315px; - /* Causes toolbar to go over comment bubble and other position: relative elements: */ - z-index: 1; - text-overflow: ellipsis; - overflow: hidden; - color: $toolbar-text-color; - text-align: left; - background-color: $primary-color; - box-shadow: 0 1px 2px rgba(#000, 0.5); -} - -#private-notice { - font-size: 14px; - margin-top: 7px; - padding: 7px; - padding-bottom: 1px; - color: #000; -} - -.window-scrolled-down #toolbar { - visibility: visible; -} - -a, -a:visited { - text-decoration: none; - color: $text-color; -} - -a:hover { - //text-decoration: underline; -} - -.link-button { - cursor: pointer; - color: #858585; - background: transparent; - border: 1px solid #d4d4d4; - padding: 4px; - border-radius: 4px; - - &.delete-button { - color: #d00; - } -} - -.clip-container { - top: 0; - left: 0; - right: 0; - bottom: 0; - padding-top: 0; -} - -.clip-container div { - margin: 3em; -} - -.clip-container a img { - max-width: 85%; - border: 1px solid rgba(#000, 0.5); - box-shadow: 0 6px 20px $shadow-color; -} - -.my-shots-button { - position: absolute; - top: 0; - left: 0; - width: 125px; - height: 66px; - background: #ebebeb; - border: 0; - cursor: pointer; -} - -.shot-title { - padding-top: 2px; - white-space: nowrap; - /* FIXME: ellipsis doesn't really work, because the end of the title is - obscured by the clip selector */ - text-overflow: ellipsis; - overflow: hidden; -} - -.shot-subtitle { - padding-top: 3px; - font-size: 12px; - color: #959595; -} - -.shot-subtitle .subheading-link { - font-size: 12px; -} - -.upload-full-page { - color: #0996f8; - background: transparent; - border-radius: 4px; - border: 1px solid #0996f8; - height: 32px; - cursor: pointer; - vertical-align: middle; - padding: 6px 15px; - font-size: 12px; -} - -.trash-button { - margin-left: 15px; - border-radius: 4px; - border: 1px solid #d4d4d4; - height: 32px; - background: transparent; - color: #000; - cursor: pointer; - vertical-align: middle; - padding: 6px 15px; - font-size: 12px; -} - -.flag-button { - margin-left: 15px; - border-radius: 4px; - border: 1px solid rgba(#000, 0.35); - height: 32px; - background: #fcfcfc; - color: #000; - cursor: pointer; - vertical-align: middle; - padding: 8px 15px; -} - -#share-buttons-panel { - position: fixed; - top: 75px; - right: 15px; - width: 275px; - z-index: 99; - border-radius: 4px; - border: 1px solid rgba(#000, 0.35); - box-shadow: 0 -2px 5px $shadow-color; - color: #000; - background-color: #fff; - padding: 15px; - text-align: left; -} - -#share-buttons-panel div { - margin-bottom: 7px; -} - -#share-buttons-panel a { - padding: 7px; -} - -#share-buttons { - display: flex; - flex-direction: row; -} - -#share-buttons a { - margin: auto; -} - -.copy-shot-link-input { - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - height: 22px; - width: 170px; -} - -.copy-shot-link-button { - background: #2fa8e1; - color: #fff; - border-radius: 4px; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border: 1px solid rgba(#000, 0.35); - height: 28px; - width: 75px; - cursor: pointer; -} - -.more-shot-actions { - position: absolute; - top: 0; - right: 0; - height: 33px; - padding: 15px; - color: #959595; - font-size: 12px; -} - -#copy-flag { - background: #f25820; - color: #fff; - text-decoration: none; - text-align: center; - text-transform: uppercase; - padding: 3px 40px; - font-size: 13px; - font-weight: bold; - line-height: 1.5rem; - width: 100px; - position: fixed; - top: 80px; - left: -60px; - transform: rotate(-45deg); - box-shadow: 0 6px 20px rgba(#000, 0.5); -} - -a.subheading-link { - font-size: 13px; - color: #0095dd; -} - -.feedback-footer { - position: absolute; - bottom: 1em; - right: 1em; - text-align: right; -} - -#banner-close { - position: absolute; - right: 0; - top: 0; - padding: 1em; - cursor: pointer; -} - -.button { - // FIXME: copied from panel.scss .simplified-edit-button - display: inline-block; - background-color: #5cb85c; - color: #fff; - font-size: 18px; - padding: 6px 12px; - border-radius: 6px; - border: 1px solid #4cae4c; - - &:hover { - text-decoration: underline; - } -} - - -.myshots-button { - display: block; - position: absolute; - top: 15px; - right: 15px; - height: 38px; - width: 130px; - padding: 0; - margin: 0; - padding-right: 15px; - vertical-align: middle; - background-image: none; - font-weight: normal; - text-transform: none; - text-indent: 0; - border-radius: 4px; - border: 0; - background: #ddd; - font-size: 12px; - color: #333; - cursor: pointer; -} - -.myshots-text-pre { - display: inline-block; - /* Data version of static/img/my-shots.svg */ - background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KCjwhLS0gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpYwogICAtIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMKICAgLSBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLiAtLT4KCjxzdmcgdmVyc2lvbj0iMS4xIgogICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgICB3aWR0aD0iMTYiCiAgICAgaGVpZ2h0PSIxNiIKICAgICB2aWV3Qm94PSIwIDAgMTYgMTYiCiAgICAgZmlsbD0iIzRkNGQ0ZCI+CgogIDxwYXRoIGQ9Ik0xMiwxMiBMMTYsMTIgTDE2LDE0IEMxNiwxNS4xMDQ1Njk1IDE1LjExMjI3MDQsMTYgMTQsMTYgTDEyLDE2IEwxMiwxMiBMMTIsMTIgWiBNNiwxMy4wMDkzNjg5IEM2LDEyLjQ1MTkwOTggNi40NDMzNTMxOCwxMiA3LjAwOTM2ODksMTIgTDguOTkwNjMxMSwxMiBDOS41NDgwOTAxNSwxMiAxMCwxMi40NDMzNTMyIDEwLDEzLjAwOTM2ODkgTDEwLDE0Ljk5MDYzMTEgQzEwLDE1LjU0ODA5MDIgOS41NTY2NDY4MiwxNiA4Ljk5MDYzMTEsMTYgTDcuMDA5MzY4OSwxNiBDNi40NTE5MDk4NSwxNiA2LDE1LjU1NjY0NjggNiwxNC45OTA2MzExIEw2LDEzLjAwOTM2ODkgTDYsMTMuMDA5MzY4OSBaIE0wLDEyIEw0LDEyIEw0LDE2IEwyLDE2IEMwLjg5NTQzMDUsMTYgMCwxNS4xMTIyNzA0IDAsMTQgTDAsMTIgTDAsMTIgWiBNMTIsNiBMMTYsNiBMMTYsMTAgTDEyLDEwIEwxMiw2IEwxMiw2IFogTTYsNiBMMTAsNiBMMTAsMTAgTDYsMTAgTDYsNiBMNiw2IFogTTAsNiBMNCw2IEw0LDEwIEwwLDEwIEwwLDYgTDAsNiBaIE0xMiwwIEwxNCwwIEMxNS4xMDQ1Njk1LDAgMTYsMC44ODc3Mjk2NDUgMTYsMiBMMTYsNCBMMTIsNCBMMTIsMCBMMTIsMCBaIE02LDAgTDEwLDAgTDEwLDQgTDYsNCBMNiwwIEw2LDAgWiBNMCwyIEMwLDAuODk1NDMwNSAwLjg4NzcyOTY0NSwwIDIsMCBMNCwwIEw0LDQgTDAsNCBMMCwyIEwwLDIgWiIvPgoKPC9zdmc+Cg=="); - background-size: 16px 16px; - width: 16px; - height: 16px; - vertical-align: middle; -} - -.myshots-text { - padding: 10px; - vertical-align: middle; -} - -.myshots-text-post { - display: inline-block; - /* Data version of static/img/arrow-right.svg */ - background-image: url("data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjhweCIgaGVpZ2h0PSIxNHB4IiB2aWV3Qm94PSIwIDAgOCAxNCI+CiAgPHBhdGggZmlsbD0iI2IxYjFiMSIgZD0ibTcuOTg2NzksMTMuMDEzMjFsLTAuOTkxMTksMC45OTEybC02Ljk5NTYsLTYuOTk1Nmw3LjAwODgxLC03LjAwODgxbDAuOTkxMTksMC45OTExOWwtNi4wMTc2MSw2LjAxNzYybDYuMDA0NCw2LjAwNDR6IiB0cmFuc2Zvcm09InJvdGF0ZSgtMTgwLCA0LCA3KSIvPgo8L3N2Zz4K"); - background-size: 8px 14px; - width: 8px; - height: 14px; - vertical-align: middle; -} From 88a5a54c39617cef129e495a685de3d83043074d Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Fri, 22 Mar 2019 14:37:02 -0500 Subject: [PATCH 10/15] Add/fix modularized versions of moved shared/ files --- bin/build-scripts/modularize | 24 ------------------------ webextension/selection.js | 7 +++++++ webextension/shot.js | 7 +++++++ webextension/thumbnailGenerator.js | 7 +++++++ 4 files changed, 21 insertions(+), 24 deletions(-) delete mode 100755 bin/build-scripts/modularize diff --git a/bin/build-scripts/modularize b/bin/build-scripts/modularize deleted file mode 100755 index db3134abbc..0000000000 --- a/bin/build-scripts/modularize +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -set -e - -if [[ -z "$1" || "$1" = "-h" ]] ; then - echo "Usage:" - echo " $(basename $0) ModuleName FILENAME" - echo - echo " Prints (on stdout) the modularized version of the file" - echo " It will be exported as window.ModuleName" - echo " It is assumed the file assigns its exports to the object exports" - exit -fi - -module_name="$1" -input_filename="$2" -input="$(cat $input_filename)" - -echo "this.${module_name} = (function () {let exports={}; $input - -return exports; -})(); -null; -" diff --git a/webextension/selection.js b/webextension/selection.js index a8b2e3c3a9..9a63d4cee5 100644 --- a/webextension/selection.js +++ b/webextension/selection.js @@ -1,3 +1,6 @@ +this.selection = (function() { +const exports = {}; + class Selection { constructor(x1, y1, x2, y2) { this.x1 = x1; @@ -114,3 +117,7 @@ class Selection { if (typeof exports !== "undefined") { exports.Selection = Selection; } + +return exports; +})(); +null; diff --git a/webextension/shot.js b/webextension/shot.js index ff3926460b..1c730e212a 100644 --- a/webextension/shot.js +++ b/webextension/shot.js @@ -1,3 +1,6 @@ +this.shot = (function() { +const exports = {}; + // Note: in this library we can't use any "system" dependencies because this can be used from multiple // environments @@ -743,3 +746,7 @@ if (typeof exports !== "undefined") { exports.originFromUrl = originFromUrl; exports.isValidClipImageUrl = isValidClipImageUrl; } + +return exports; +})(); +null; diff --git a/webextension/thumbnailGenerator.js b/webextension/thumbnailGenerator.js index e61b119a8a..f2821807b3 100644 --- a/webextension/thumbnailGenerator.js +++ b/webextension/thumbnailGenerator.js @@ -1,3 +1,6 @@ +this.thumbnailGenerator = (function() { +const exports = {}; + // This is used in webextension/background/takeshot.js, // server/src/pages/shot/controller.js, and // server/scr/pages/shotindex/view.js. It is used in a browser @@ -143,3 +146,7 @@ if (typeof exports !== "undefined") { exports.createThumbnailUrl = createThumbnailUrl; exports.createThumbnailBlobFromPromise = createThumbnailBlobFromPromise; } + +return exports; +})(); +null; From ed0327276d936629474c0c06f1fd300413869219 Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Fri, 22 Mar 2019 16:40:49 -0500 Subject: [PATCH 11/15] Remove references to bad-server test builds --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1a1fe22d49..bdc11978e1 100644 --- a/package.json +++ b/package.json @@ -54,8 +54,8 @@ "lint:deps": "npm audit --json | audit-filter --nsp-config=.nsprc --audit=-", "postlint": "npm audit || true", "posttest": "npm run lint", - "test": "bin/test-helpers/make_addon_with_unavailable_server && mocha test/ test/server/unit/*", - "test:selenium": "bin/test-helpers/make_addon_with_unavailable_server && mocha test/test.js", + "test": "mocha test/", + "test:selenium": "mocha test/test.js", "test:accessibility": "make .venv && .venv/bin/pytest test/accessibility --driver Firefox -srx --axe --verbose", "make_versions_exact": "node bin/build-scripts/make_versions_exact.js", "svgo": "find webextension/icons/*.svg | grep -v icon-v2.svg | xargs svgo && svgo --folder=static/img" From b1faddf3281dec6cee8f407f00b69ee084e8dfb5 Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Fri, 22 Mar 2019 16:41:00 -0500 Subject: [PATCH 12/15] Remove now-unneeded build scripts --- bin/build-scripts/ftl-to-js.js | 31 --- bin/build-scripts/write_build_time.py | 13 - bin/dumpschema | 59 ----- bin/load_test_exercise.py | 230 ------------------ bin/load_test_exercise_images.py | 34 --- .../make_addon_with_unavailable_server | 31 --- 6 files changed, 398 deletions(-) delete mode 100755 bin/build-scripts/ftl-to-js.js delete mode 100755 bin/build-scripts/write_build_time.py delete mode 100755 bin/dumpschema delete mode 100755 bin/load_test_exercise.py delete mode 100644 bin/load_test_exercise_images.py delete mode 100755 bin/test-helpers/make_addon_with_unavailable_server diff --git a/bin/build-scripts/ftl-to-js.js b/bin/build-scripts/ftl-to-js.js deleted file mode 100755 index b47c7f0609..0000000000 --- a/bin/build-scripts/ftl-to-js.js +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env node - -// This is called by make. argv[2] is the destination directory. The the args -// after are the paths to ftl files. -// -// The destination directory has been created at this point. - -const fs = require("fs"); -const destDir = process.argv[2]; -const ftlPaths = process.argv.slice(3); - -for (const ftl of ftlPaths) { - const locale = ftl.split("/")[1]; - const destFilePath = `${destDir}/${locale}.js`; - const ftlFileContent = fs.readFileSync(ftl, "utf8"); - const jsFileContent = ` - (function(context) { - var messages=${JSON.stringify(ftlFileContent)}; - if (typeof exports === 'object' && context === exports) { - exports.messages = messages; - } else { - if (window && window.notifyL10nLoaded) { - window.notifyL10nLoaded(${JSON.stringify(locale)}, messages); - } - context.l10nMessages = context.l10nMessages || {}; - context.l10nMessages[${JSON.stringify(locale)}] = messages; - } - })(this); - `; - fs.writeFileSync(destFilePath, jsFileContent, "utf8"); -} diff --git a/bin/build-scripts/write_build_time.py b/bin/build-scripts/write_build_time.py deleted file mode 100755 index 58a58cd851..0000000000 --- a/bin/build-scripts/write_build_time.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python - -import time -now = time.time() -formatted = time.strftime("%B %d, %Y %H:%M:%S UTC", time.gmtime()) - -print 'exports.string = %r' % formatted -# Note Javascript uses milliseconds: -print 'exports.timestamp = %i' % int(now * 1000) - -import subprocess -print 'exports.gitrevision = %r' % subprocess.check_output( - ["git", "describe", "--tags", "--always"]).strip() diff --git a/bin/dumpschema b/bin/dumpschema deleted file mode 100755 index 74b98bc80f..0000000000 --- a/bin/dumpschema +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash - -set -e - -diff= -record= - -bin="$(dirname $BASH_SOURCE)" -record_filename="$(dirname $bin)/server/schema.sql" - -help () { - echo "Usage: $(dirname $0) [-h] [--diff] [--record]" - echo " --record and --diff use the SQL file: ${record_filename}" - echo " Try ${bin}/pg_vars to see pg connection config information" -} - -while [ -n "$1" ] ; do - case "$1" in - -h|--help) - help - exit - ;; - --diff|-diff) - diff="1" - shift - ;; - --record|-record) - record=1 - shift - ;; - *) - help - exit 2 - esac -done - -eval "$($bin/pg_vars)" - -dump () { - pg_dump --schema-only | grep -Ev '^(--|GRANT|REVOKE|SET|ALTER TABLE.*OWNER|COMMENT|CREATE EXTENSION)' | grep -v '^$' - patch="$(psql -t -c "SELECT value FROM property WHERE key = 'patch'")" - # Strip whitespace: - patch="$(echo $patch)" - echo "-- pg-patch version: $patch" -} - -if [ -n "$diff" ] ; then - tmpfile="/tmp/current-schema-$(date +%Y%m%dT%H%M%S).sql" - dump > $tmpfile - diff -u $record_filename $tmpfile - rm $tmpfile -elif [ -n "$record" ] ; then - echo "Saving to $record_filename" - dump > $record_filename -else - echo "- Deletions indicate something unexpected in the local database" - echo "+ Additions indicate something that is missing from the local database" - dump -fi diff --git a/bin/load_test_exercise.py b/bin/load_test_exercise.py deleted file mode 100755 index 0ee382519c..0000000000 --- a/bin/load_test_exercise.py +++ /dev/null @@ -1,230 +0,0 @@ -#!/usr/bin/env python - -import requests -import argparse -from urlparse import urljoin -import uuid -import os -import time -import random -import json - -parser = argparse.ArgumentParser(description='Run some tests on a Screenshots server') -parser.add_argument('url', metavar='URL', type=str, nargs=1, - help='URL of the backend to test') - -parser.add_argument('--create', metavar='N', type=int, default=1, - help='Create a shot N times') -parser.add_argument('--little-image', action='store_true', - help='Only create shots with the little image') -parser.add_argument('--read-shot', metavar='N', type=int, default=1, - help='Read a shot N times (should create one before)') -parser.add_argument('--read-my-shots', metavar='N', type=int, default=1, - help='Read /shots N times') -parser.add_argument('--search', metavar='N', type=int, default=1, - help='Search /shots N times with randomish queries') -parser.add_argument('--times', metavar='M', type=int, default=1, - help='Do everything M times (i.e., do each action N x M times)') -parser.add_argument('--new-account', action='store_true', - help='Create a new account on each run') -parser.add_argument('--quiet', '-q', action='count', - help='Be a little more quiet') -# FIXME: no option for /redirect -# FIXME: no option for /event - -example_images = {} -execfile(os.path.join(os.path.dirname(__file__), "load_test_exercise_images.py"), example_images) -example_images = example_images["example_images"] - -args = parser.parse_args() - -backend = args.url[0] - - -def make_device_info(): - return dict( - addonVersion='0.1.2014test', - platform='test', - ) - - -def make_uuid(): - return str(uuid.uuid1()) - - -def make_random_id(): - return make_uuid().replace("-", "")[:16] - - -def reset_device_info(): - global deviceInfo, deviceId, secret, session - deviceInfo = make_device_info() - deviceId = make_uuid() - secret = make_uuid() - session = requests.Session() - - -reset_device_info() - - -def login(): - resp = session.post( - urljoin(backend, "/api/login"), - data=dict(deviceId=deviceId, secret=secret, deviceInfo=json.dumps(deviceInfo))) - if resp.status_code == 404: - resp = session.post( - urljoin(backend, "/api/register"), - data=dict(deviceId=deviceId, secret=secret, deviceInfo=json.dumps(deviceInfo))) - resp.raise_for_status() - - -def delete_account(): - resp = session.post( - urljoin(backend, "/leave-screenshots/leave"), - json={}) - resp.raise_for_status() - - -def create_shot(): - shot_id = make_random_id() + "/test.com" - shot_url = urljoin(backend, shot_id) - shot_data = urljoin(backend, "data/" + shot_id) - resp = session.put( - shot_data, - json=make_example_shot(), - ) - resp.raise_for_status() - return shot_url - - -def read_shot(url): - # FIXME: should get at least the clip image subresource itself - resp = session.get(url) - resp.raise_for_status() - - -def read_my_shots(): - resp = session.get(urljoin(backend, "/shots")) - resp.raise_for_status() - - -def search_shots(q=None): - if q is None: - q = make_search_query() - resp = session.get(urljoin(backend, "/shots"), params={"q": q}) - resp.raise_for_status() - - -def make_example_shot(): - if args.little_image: - image = example_images[-1] - else: - image = random.choice(example_images) - text = [] - for i in range(10): - text.append(random.choice(text_strings)) - text = " ".join(text) - return dict( - deviceId=deviceId, - url="http://test.com/?" + make_uuid(), - docTitle="Load test page", - createdDate=int(time.time() * 1000), - favicon=None, - siteName="test site", - clips={ - make_uuid(): dict( - createdDate=int(time.time() * 1000), - sortOrder=100, - image=dict( - url=image["url"], - captureType="selection", - text=text, - location=dict( - top=100, - left=100, - bottom=100 + image["height"], - right=100 + image["width"], - ), - dimensions=dict( - x=image["width"], - y=image["height"], - ), - ), - ), - }, - ) - - -def make_search_query(): - return random.choice(search_strings) - - -text_strings = """ -Example strings like apple orange banana some stuff like whatever and whoever -and bucket blanket funky etc keyboard screen house window tree leaf leaves -feather feathers -""".split() - -search_strings = """ -nothing 12345 -""".split() + text_strings - -login_happened = False - - -def run(): - global login_happened - shot_urls = [] - total = 0 - counts = ( - [create_shot, args.create], - [read_shot, args.read_shot], - [read_my_shots, args.read_my_shots], - [search_shots, args.search], - ) - for func, count in counts: - total += count - while total: - if not login_happened: - login() - login_happened = True - continue - num = random.randrange(total) - for item in counts: - num -= item[1] - if num <= 0: - if not args.quiet: - print("Running %13s of %5i (from %5i)" % (item[0].__name__, item[1], total)) - if item[0] == read_shot and not shot_urls: - print(" Skipping because there are no shots") - continue - if item[0] == read_shot: - result = item[0](random.choice(shot_urls)) - else: - result = item[0]() - if item[0] == create_shot: - shot_urls.append(result) - if not args.quiet: - print(" Created %i shot: %s" % (len(shot_urls), result)) - item[1] -= 1 - total -= 1 - break - - -def main(): - try: - for i in range(args.times): - run() - print("Finished run %i/%i" % (i + 1, args.times)) - if args.new_account: - reset_device_info() - login() - except KeyboardInterrupt: - print("Early abort") - # uncomment after supporting csrf token - # print "Deleting account" - # delete_account() - - -if __name__ == "__main__": - main() diff --git a/bin/load_test_exercise_images.py b/bin/load_test_exercise_images.py deleted file mode 100644 index 916d77c60c..0000000000 --- a/bin/load_test_exercise_images.py +++ /dev/null @@ -1,34 +0,0 @@ -# flake8: noqa - -example_images = [ - dict( - source="https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg", - url="data:image/png;base64,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", - width=172, - height=178, - ), - dict( - source="https://i.ytimg.com/vi/m5d1FlSeF-M/maxresdefault.jpg", - url="data:image/png;base64,iVBORw0KGgoJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIBDgHgAMBIgACEQEDEQH/xAAcAAEAAQUBAQAAAAAAAAAAAAAABwECBAYIAwX/xABCEAEAAQIDBAUHCwQDAAIDAQAAAQIDBAURBgcTIRIxMlFxFzQ1NkFykRQWIlJTVGGBgpKxFSOhwUJiczPRQ0TxJf/EABYBAQEBAAAAAAAAAAAAAAAAAAABAv/EABsRAQEBAQEBAQEAAAAAAAAAAAABETEhQRIC/9oADAMBAAIRAxEAPwCGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVpomrqBQX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqjhVAsF/CqOFUCwX8Ko4VQLBfwqj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RxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkjG4tRxagxkqV9mWPxalOJVPLUMWgK0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9k=", - width=1920, - height=1080, - ), - dict( - source="https://www.ancestry.com/wiki/images/archive/a/a9/20100708215937!Example.jpg", - url="data:image/png;base64,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", - width=400, - height=267, - ), - dict( - source="https://upload.wikimedia.org/wikipedia/en/thumb/a/a9/Example.jpg/111px-Example.jpg", - url="data:image/jpeg;base64,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", - width=111, - height=120, - ), - dict( - source="http://www.1x1px.me/", - url="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX/TQBcNTh/AAAAAXRSTlPM0jRW/QAAAApJREFUeJxjYgAAAAYAAzY3fKgAAAAASUVORK5CYII=", - width=1, - height=1, - ), -] diff --git a/bin/test-helpers/make_addon_with_unavailable_server b/bin/test-helpers/make_addon_with_unavailable_server deleted file mode 100755 index bf42ba4d89..0000000000 --- a/bin/test-helpers/make_addon_with_unavailable_server +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# This simple script creates an addon with an unavailable backend. At least one -# of the Selenium tests rely on it. It also (re)creates the addon that might've -# been replaced during the process. - -set -e - -SCRIPT_PATH=${0%/*} -cd "$SCRIPT_PATH/../../" - -if [ -n "$SCREENSHOTS_BACKEND" ] -then - PREVIOUS_BACKEND=$SCREENSHOTS_BACKEND -fi - -export SCREENSHOTS_BACKEND=${BAD_SCREENSHOTS_BACKEND:-'http://localhost:49152'} -echo "Setting backend to ${SCREENSHOTS_BACKEND}" - -make zip >/dev/null -mv build/screenshots.zip build/screenshots-webextension-server-down.zip -echo "Created build/screenshots-webextension-server-down.zip" - -if [ -n "$PREVIOUS_BACKEND" ] -then - export SCREENSHOTS_BACKEND=$PREVIOUS_BACKEND -else - unset SCREENSHOTS_BACKEND -fi - -make zip From e544a333977a0e22639fb183f7bd6ca888a3cbee Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Tue, 2 Apr 2019 12:29:38 -0500 Subject: [PATCH 13/15] Remote My Shots-related code --- locales/en-US/webextension.properties | 3 ++- static/css/inline-selection.scss | 10 +--------- webextension/icons/menu-myshot-white.svg | 1 - webextension/icons/menu-myshot.svg | 1 - webextension/selector/ui.js | 18 ++---------------- webextension/selector/uicontrol.js | 8 -------- 6 files changed, 5 insertions(+), 36 deletions(-) delete mode 100644 webextension/icons/menu-myshot-white.svg delete mode 100644 webextension/icons/menu-myshot.svg diff --git a/locales/en-US/webextension.properties b/locales/en-US/webextension.properties index d70d194bd9..91e901b2de 100644 --- a/locales/en-US/webextension.properties +++ b/locales/en-US/webextension.properties @@ -7,7 +7,7 @@ contextMenuLabel = Take a Screenshot # FIXME-server: remove string myShotsLink = My Shots screenshotInstructions = Drag or click on the page to select a region. Press ESC to cancel. -# FIXME-server: remove +# FIXME-server: remove? (or is it upload?) saveScreenshotSelectedArea = Save # FIXME-server: remove uploadScreenshotSelectedArea = Upload @@ -99,6 +99,7 @@ tourDone = Done # Do not translate {termsAndPrivacyNoticeTermsLink} and # {termsAndPrivacyNoticyPrivacyLink}. They're placeholders replaced by links # using the corresponding translated strings as text. +# FIXME-server: do we need privacy notice? termsAndPrivacyNotice2 = By using Firefox Screenshots, you agree to our {termsAndPrivacyNoticeTermsLink} and {termsAndPrivacyNoticePrivacyLink}. # This string is used as the text for a link in termsAndPrivacyNoticeCloudServices termsAndPrivacyNoticeTermsLink = Terms diff --git a/static/css/inline-selection.scss b/static/css/inline-selection.scss index 8abe4d8a27..5a711578c2 100644 --- a/static/css/inline-selection.scss +++ b/static/css/inline-selection.scss @@ -432,7 +432,7 @@ $very-light-grey: #ededed; pointer-events: all; } -.myshots-all-buttons-container { +.all-buttons-container { @include flex-container(row-reverse, flex-start, stretch); background: #f5f5f5; border-radius: 2px; @@ -480,10 +480,6 @@ $very-light-grey: #ededed; } } - .myshots-button { - background-image: url("MOZ_EXTENSION/icons/menu-myshot.svg"); - } - .full-page { background-image: url("MOZ_EXTENSION/icons/menu-fullpage.svg"); } @@ -493,10 +489,6 @@ $very-light-grey: #ededed; } } -.myshots-button-container { - @include flex-container(row, center, center); -} - @keyframes pulse { 0% { transform: scale(1); diff --git a/webextension/icons/menu-myshot-white.svg b/webextension/icons/menu-myshot-white.svg deleted file mode 100644 index 28efb2eec0..0000000000 --- a/webextension/icons/menu-myshot-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/webextension/icons/menu-myshot.svg b/webextension/icons/menu-myshot.svg deleted file mode 100644 index ffa7a6922a..0000000000 --- a/webextension/icons/menu-myshot.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/webextension/selector/ui.js b/webextension/selector/ui.js index 5780e882b4..c05acded22 100644 --- a/webextension/selector/ui.js +++ b/webextension/selector/ui.js @@ -11,8 +11,7 @@ this.ui = (function() { // eslint-disable-line no-unused-vars exports.isHeader = function(el) { while (el) { if (el.classList && - (el.classList.contains("myshots-button") || - el.classList.contains("visible") || + (el.classList.contains("visible") || el.classList.contains("full-page") || el.classList.contains("cancel-shot"))) { return true; @@ -79,11 +78,6 @@ this.ui = (function() { // eslint-disable-line no-unused-vars return (computed && computed.backgroundImage === "none"); } - const showMyShots = exports.showMyShots = function() { - // FIXME-server: we should remove the my shots code - return false; - }; - function initializeIframe() { const el = document.createElement("iframe"); el.src = browser.extension.getURL("blank.html"); @@ -273,11 +267,7 @@ this.ui = (function() { // eslint-disable-line no-unused-vars

    -
    - ${showMyShots() ? ` - -
    - ` : ""} +
    @@ -292,10 +282,6 @@ this.ui = (function() { // eslint-disable-line no-unused-vars this.document.documentElement.lang = browser.i18n.getMessage("@@ui_locale"); const overlay = this.document.querySelector(".preview-overlay"); localizeText(this.document); - if (showMyShots()) { - overlay.querySelector(".myshots-button").addEventListener( - "click", watchFunction(assertIsTrusted(standardOverlayCallbacks.onOpenMyShots))); - } overlay.querySelector(".visible").addEventListener( "click", watchFunction(assertIsTrusted(standardOverlayCallbacks.onClickVisible))); overlay.querySelector(".full-page").addEventListener( diff --git a/webextension/selector/uicontrol.js b/webextension/selector/uicontrol.js index 488a352b58..abf7650016 100644 --- a/webextension/selector/uicontrol.js +++ b/webextension/selector/uicontrol.js @@ -176,14 +176,6 @@ this.uicontrol = (function() { e.stopPropagation(); exports.deactivate(); }, - onOpenMyShots: () => { - sendEvent("goto-myshots", "selection-button"); - callBackground("openMyShots") - .then(() => exports.deactivate()) - .catch(() => { - // Handled in communication.js - }); - }, onClickVisible: () => { sendEvent("capture-visible", "selection-button"); selectedPos = new Selection( From b4d0776204cd035d05fb2a91fb0f9ed0046cfb7a Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Tue, 2 Apr 2019 13:55:37 -0500 Subject: [PATCH 14/15] Remove Terms and Privacy links from onboarding --- locales/en-US/webextension.properties | 9 -------- webextension/onboarding/slides.html | 2 -- webextension/onboarding/slides.js | 32 --------------------------- 3 files changed, 43 deletions(-) diff --git a/locales/en-US/webextension.properties b/locales/en-US/webextension.properties index 91e901b2de..87c82cf317 100644 --- a/locales/en-US/webextension.properties +++ b/locales/en-US/webextension.properties @@ -96,15 +96,6 @@ tourSkip = SKIP tourNext = Next Slide tourPrevious = Previous Slide tourDone = Done -# Do not translate {termsAndPrivacyNoticeTermsLink} and -# {termsAndPrivacyNoticyPrivacyLink}. They're placeholders replaced by links -# using the corresponding translated strings as text. -# FIXME-server: do we need privacy notice? -termsAndPrivacyNotice2 = By using Firefox Screenshots, you agree to our {termsAndPrivacyNoticeTermsLink} and {termsAndPrivacyNoticePrivacyLink}. -# This string is used as the text for a link in termsAndPrivacyNoticeCloudServices -termsAndPrivacyNoticeTermsLink = Terms -# This string is used as the text for a link in termsAndPrivacyNoticeCloudServices -termsAndPrivacyNoticyPrivacyLink = Privacy Notice # This string is used to label the item in the Library panel that opens the screenshots page # FIXME-server: remove libraryLabel = Screenshots diff --git a/webextension/onboarding/slides.html b/webextension/onboarding/slides.html index b37f6b3fd5..b94723d6a4 100644 --- a/webextension/onboarding/slides.html +++ b/webextension/onboarding/slides.html @@ -17,7 +17,6 @@

    Firefox Screenshots

    -
    @@ -53,7 +52,6 @@

    -
    diff --git a/webextension/onboarding/slides.js b/webextension/onboarding/slides.js index 70a0be97a9..9b9101b122 100644 --- a/webextension/onboarding/slides.js +++ b/webextension/onboarding/slides.js @@ -89,38 +89,6 @@ this.slides = (function() { const text = browser.i18n.getMessage(id); el.setAttribute("aria-label", text); } - // termsAndPrivacyNoticeCloudServices is a more complicated substitution: - const termsContainer = doc.querySelector(".onboarding-legal-notice"); - termsContainer.innerHTML = ""; - const termsSentinel = "__TERMS__"; - const privacySentinel = "__PRIVACY__"; - const sentinelSplitter = "!!!"; - const linkTexts = { - [termsSentinel]: browser.i18n.getMessage("termsAndPrivacyNoticeTermsLink"), - [privacySentinel]: browser.i18n.getMessage("termsAndPrivacyNoticyPrivacyLink"), - }; - const linkUrls = { - [termsSentinel]: "https://www.mozilla.org/about/legal/terms/services/", - [privacySentinel]: "https://www.mozilla.org/privacy/firefox/", - }; - const text = browser.i18n.getMessage( - "termsAndPrivacyNotice2", - [sentinelSplitter + termsSentinel + sentinelSplitter, - sentinelSplitter + privacySentinel + sentinelSplitter]); - const parts = text.split(sentinelSplitter); - for (const part of parts) { - let el; - if (part === termsSentinel || part === privacySentinel) { - el = doc.createElement("a"); - el.href = linkUrls[part]; - el.textContent = linkTexts[part]; - el.target = "_blank"; - el.id = (part === termsSentinel) ? "terms" : "privacy"; - } else { - el = doc.createTextNode(part); - } - termsContainer.appendChild(el); - } } function activateSlide(doc) { From c7644ddb6291f5bd59e7661b8cbd07256e093a91 Mon Sep 17 00:00:00 2001 From: Ian Bicking Date: Tue, 2 Apr 2019 14:05:40 -0500 Subject: [PATCH 15/15] Remove unneeded server-related strings --- locales/en-US/webextension.properties | 51 --------------------------- webextension/background/senderror.js | 26 -------------- 2 files changed, 77 deletions(-) diff --git a/locales/en-US/webextension.properties b/locales/en-US/webextension.properties index 87c82cf317..d921ddb4bd 100644 --- a/locales/en-US/webextension.properties +++ b/locales/en-US/webextension.properties @@ -4,44 +4,16 @@ addonDescription = Take clips and screenshots from the Web and save them tempora addonAuthorsList = Mozilla # Also used for the title on the toolbar button contextMenuLabel = Take a Screenshot -# FIXME-server: remove string -myShotsLink = My Shots screenshotInstructions = Drag or click on the page to select a region. Press ESC to cancel. -# FIXME-server: remove? (or is it upload?) -saveScreenshotSelectedArea = Save -# FIXME-server: remove -uploadScreenshotSelectedArea = Upload saveScreenshotVisibleArea = Save visible saveScreenshotFullPage = Save full page cancelScreenshot = Cancel downloadScreenshot = Download downloadScreenshotTitle = Download screenshot -# FIXME-server: remove -downloadOnlyNotice = You are currently in Download-Only mode. -# The downloadOnlyDetails string introduces a list of items. The keys -# downloadOnlyDetailsPrivate, downloadOnlyDetailsThirdParty, -# downloadOnlyDetailsNeverRemember, downloadOnlyDetailsESR, and -# downloadOnlyDetailsNoUploadPref are list items in that list. -# FIXME-server: remove -downloadOnlyDetails = Firefox Screenshots automatically changes to Download-Only mode in these situations: -# FIXME-server: remove -downloadOnlyDetailsPrivate = In a Private Browsing window. -# FIXME-server: remove -downloadOnlyDetailsThirdParty = Third-party cookies are disabled. -# FIXME-server: remove -downloadOnlyDetailsNeverRemember = “Never remember history” is enabled. -# FIXME-server: remove -downloadOnlyDetailsESR = You are using Firefox ESR. -# FIXME-server: remove -downloadOnlyDetailsNoUploadPref = Uploads have been disabled. -# FIXME-server: remove -notificationLinkCopiedTitle = Link Copied # The string "{meta_key}-V" should be translated to the region-specific # shorthand for the Paste keyboard shortcut. {meta_key} is a placeholder for the # modifier key used in the shortcut (do not translate it): for example, Ctrl-V # on Windows systems. -# FIXME-server: remove -notificationLinkCopiedDetails = The link to your shot has been copied to the clipboard. Press {meta_key}-V to paste. # This is a verb, as in "Copy image to the system clipboard." copyScreenshot = Copy copyScreenshotTitle = Copy screenshot to clipboard @@ -51,33 +23,13 @@ notificationImageCopiedTitle = Shot Copied # modifier key used in the shortcut (do not translate it): for example, Ctrl-V # on Windows systems. notificationImageCopiedDetails = Your shot has been copied to the clipboard. Press {meta_key}-V to paste. -# This is displayed as a warning when a Full Page save will be cropped. -# {pixels} will be a number like 5000. -# FIXME-server: remove (I think?) -imageCropPopupWarning = Saved image will be cropped to {pixels}px in height. # Section for error strings # "Out of order" is an humorous way to indicate that the service is not working # properly. -# FIXME-server: remove -requestErrorTitle = Out of order. -# FIXME-server: remove -requestErrorDetails = Sorry! We couldn’t save your shot. Please try again later. -# FIXME-server: remove -connectionErrorTitle = We can’t connect to your screenshots. -# FIXME-server: remove -connectionErrorDetails = Please check your Internet connection. If you are able to connect to the Internet, there may be a temporary problem with the Firefox Screenshots service. -# FIXME-server: remove -loginErrorDetails = We couldn’t save your shot because there is a problem with the Firefox Screenshots service. Please try again later. unshootablePageErrorTitle = We can’t screenshot this page. unshootablePageErrorDetails = This isn’t a standard Web page, so you can’t take a screenshot of it. -# FIXME-server: remove -selfScreenshotErrorTitle = You can’t take a shot of a Firefox Screenshots page! # Fired when someone makes a zero-width or zero-height selection emptySelectionErrorTitle = Your selection is too small -# FIXME-server: remove (maybe?) -privateWindowErrorTitle = Screenshots is disabled in Private Browsing Mode -# FIXME-server: remove (maybe?) -privateWindowErrorDetails = Sorry for the inconvenience. We are working on this feature for future releases. genericErrorTitle = Whoa! Firefox Screenshots went haywire. genericErrorDetails = We’re not sure what just happened. Care to try again or take a shot of a different page? # Section for onboarding strings @@ -96,6 +48,3 @@ tourSkip = SKIP tourNext = Next Slide tourPrevious = Previous Slide tourDone = Done -# This string is used to label the item in the Library panel that opens the screenshots page -# FIXME-server: remove -libraryLabel = Screenshots diff --git a/webextension/background/senderror.js b/webextension/background/senderror.js index 63b4bc45ae..a2632c076a 100644 --- a/webextension/background/senderror.js +++ b/webextension/background/senderror.js @@ -11,39 +11,13 @@ this.senderror = (function() { const ERROR_TIME_LIMIT = 3000; const messages = { - REQUEST_ERROR: { - title: browser.i18n.getMessage("requestErrorTitle"), - info: browser.i18n.getMessage("requestErrorDetails"), - }, - CONNECTION_ERROR: { - title: browser.i18n.getMessage("connectionErrorTitle"), - info: browser.i18n.getMessage("connectionErrorDetails"), - }, - LOGIN_ERROR: { - title: browser.i18n.getMessage("requestErrorTitle"), - info: browser.i18n.getMessage("loginErrorDetails"), - }, - LOGIN_CONNECTION_ERROR: { - title: browser.i18n.getMessage("connectionErrorTitle"), - info: browser.i18n.getMessage("connectionErrorDetails"), - }, UNSHOOTABLE_PAGE: { title: browser.i18n.getMessage("unshootablePageErrorTitle"), info: browser.i18n.getMessage("unshootablePageErrorDetails"), }, - SHOT_PAGE: { - title: browser.i18n.getMessage("selfScreenshotErrorTitle"), - }, - MY_SHOTS: { - title: browser.i18n.getMessage("selfScreenshotErrorTitle"), - }, EMPTY_SELECTION: { title: browser.i18n.getMessage("emptySelectionErrorTitle"), }, - PRIVATE_WINDOW: { - title: browser.i18n.getMessage("privateWindowErrorTitle"), - info: browser.i18n.getMessage("privateWindowErrorDetails"), - }, generic: { title: browser.i18n.getMessage("genericErrorTitle"), info: browser.i18n.getMessage("genericErrorDetails"),