From 4b2f38ab7f99a9164a17aafc43be9723e034fcfc Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 20 May 2026 11:40:17 +0200 Subject: [PATCH] complete refactor javascript to typescript and reorg frontend files and folders Signed-off-by: Vladimir Mandic --- .github/copilot-instructions.md | 2 +- .github/instructions/hints.instructions.md | 10 +- .github/instructions/ui.instructions.md | 8 +- .vscode/settings.json | 9 +- CHANGELOG.md | 7 +- README.md | 4 +- TODO.md | 33 +- {html => data}/art-styles.json | 0 eslint.config.mjs | 136 +- extensions-builtin/sdnext-kanvas | 2 +- extensions-builtin/sdnext-modernui | 2 +- html/licenses.html | 710 - html/logo-bg-dark.jpg | Bin 18702 -> 0 bytes html/logo-bg-light.jpg | Bin 18999 -> 0 bytes html/logo-robot.svg | 19 - html/logo-wide.png | Bin 160056 -> 0 bytes installer.py | 2 +- javascript/authWrap.js | 34 - javascript/docs.js | 24 - javascript/exifr.js | 1 - javascript/extensions.js | 53 - javascript/generationParams.js | 44 - javascript/hires.js | 10 - javascript/iframeResizer.min.js | 8 - javascript/jquery.js | 2 - javascript/panZoom.js | 1744 -- javascript/sha256.js | 408 - javascript/sparkline.js | 5 - javascript/startup.js | 105 - javascript/trainMonitor.js | 9 - javascript/uiConfig.js | 21 - modules/api/docs.py | 8 +- modules/api/middleware.py | 2 +- modules/caption/vqa_detection.py | 4 +- modules/civitai/search_civitai.py | 2 +- modules/image/grid.py | 6 +- modules/sd_hijack_transformers.py | 7 - modules/sd_models_compile.py | 6 +- modules/styles.py | 2 +- modules/theme.py | 5 +- modules/ui_definitions.py | 2 +- modules/ui_extra_networks.py | 20 +- modules/ui_extra_networks_styles.py | 2 +- modules/ui_javascript.py | 24 +- package.json | 80 +- test/full-test.sh | 18 +- test/locale-sanitize-override.py | 2 +- test/localize.mjs | 4 +- test/test-caption-api.py | 2 +- test/test-detailer-api.py | 2 +- test/validate-locale.py | 2 +- ui/.build.json | 119 + .../aspectRatioOverlay.ts | 46 +- {html => ui/assets}/favicon.ico | Bin {html => ui/assets}/favicon.png | Bin {html => ui/assets}/favicon.svg | 0 {html => ui/assets}/logo-bg-0.jpg | Bin {html => ui/assets}/logo-bg-1.jpg | Bin {html => ui/assets}/logo-bg-2.jpg | Bin {html => ui/assets}/logo-bg-3.jpg | Bin {html => ui/assets}/logo-bg-4.jpg | Bin {html => ui/assets}/logo-bg-5.jpg | Bin {html => ui/assets}/logo-bg-6.jpg | Bin {html => ui/assets}/logo-bg-7.jpg | Bin {html => ui/assets}/logo-bg-8.jpg | Bin {html => ui/assets}/logo-bg-9.jpg | Bin {html => ui/assets}/logo-dark.png | Bin {html => ui/assets}/logo-dark.svg | 0 {html => ui/assets}/logo-light.png | Bin {html => ui/assets}/logo-light.svg | 0 {html => ui/assets}/logo-transparent.png | Bin {html => ui/assets}/missing.png | Bin {html => ui/assets}/notification.mp3 | Bin {html => ui/assets}/screenshot-robot.jpg | Bin ui/authWrap.ts | 43 + .../autocomplete.js => ui/autocomplete.ts | 70 +- .../autocomplete_xn.ts | 72 +- javascript/changelog.js => ui/changelog.ts | 21 +- javascript/civitai.js => ui/civitai.ts | 93 +- .../contextMenus.js => ui/contextMenus.ts | 79 +- javascript/control.js => ui/control.ts | 21 +- {javascript => ui/css}/amethyst-nightfall.css | 0 {javascript => ui/css}/base.css | 2 +- {javascript => ui/css}/black-gray.css | 2 +- {javascript => ui/css}/black-orange.css | 2 +- .../css}/black-teal-reimagined.css | 2 +- {javascript => ui/css}/black-teal.css | 2 +- {javascript => ui/css}/emerald-paradise.css | 0 {javascript => ui/css}/invoked.css | 0 {javascript => ui/css}/light-teal.css | 2 +- {javascript => ui/css}/midnight-barbie.css | 0 {javascript => ui/css}/orchid-dreams.css | 0 {javascript => ui/css}/sdnext.css | 2 +- {javascript => ui/css}/simple-dark.css | 2 +- {javascript => ui/css}/simple-light.css | 2 +- {html => ui/css}/swagger.css | 0 {javascript => ui/css}/timeless-beige.css | 0 {javascript => ui/css}/timesheet.css | 0 ui/dist/sdnext.mjs | 18761 ++++++++++++++++ ui/dist/sdnext.mjs.map | 7 + ui/docs.ts | 31 + javascript/dragDrop.js => ui/dragDrop.ts | 30 +- .../editAttention.js => ui/editAttention.ts | 19 +- ui/extensions.ts | 73 + .../extraNetworks.js => ui/extraNetworks.ts | 93 +- .../fonts}/ibmplexmono-nerdfont-medium.ttf | Bin .../fonts}/notosans-nerdfont-regular.ttf | Bin {javascript => ui/fonts}/roboto.ttf | Bin javascript/gallery.js => ui/gallery.ts | 66 +- ui/generationParams.ts | 53 + ui/globals.d.ts | 146 + javascript/gpu.js => ui/gpu.ts | 38 +- javascript/guidance.js => ui/guidance.ts | 14 +- ui/hires.ts | 21 + javascript/history.js => ui/history.ts | 44 +- .../imageParams.js => ui/imageParams.ts | 17 +- .../imageViewer.js => ui/imageViewer.ts | 44 +- ui/index.ts | 44 + javascript/indexdb.js => ui/indexdb.ts | 68 +- .../inputAccordion.js => ui/inputAccordion.ts | 41 +- ui/js/iframeResizer.js | 1466 ++ {javascript => ui/js}/login.js | 0 ui/js/sha256.ts | 411 + javascript/loader.js => ui/loader.ts | 30 +- {html => ui/locale}/locale_ar.json | 0 {html => ui/locale}/locale_bn.json | 0 {html => ui/locale}/locale_de.json | 0 {html => ui/locale}/locale_en.json | 0 {html => ui/locale}/locale_es.json | 0 {html => ui/locale}/locale_fr.json | 0 {html => ui/locale}/locale_he.json | 0 {html => ui/locale}/locale_hi.json | 0 {html => ui/locale}/locale_hr.json | 0 {html => ui/locale}/locale_id.json | 0 {html => ui/locale}/locale_it.json | 0 {html => ui/locale}/locale_ja.json | 0 {html => ui/locale}/locale_ko.json | 0 {html => ui/locale}/locale_nb.json | 0 {html => ui/locale}/locale_po.json | 0 {html => ui/locale}/locale_pt.json | 0 {html => ui/locale}/locale_qq.json | 0 {html => ui/locale}/locale_ru.json | 0 {html => ui/locale}/locale_sr.json | 0 {html => ui/locale}/locale_tb.json | 0 {html => ui/locale}/locale_tlh.json | 0 {html => ui/locale}/locale_tr.json | 0 {html => ui/locale}/locale_ur.json | 0 {html => ui/locale}/locale_vi.json | 0 {html => ui/locale}/locale_xx.json | 0 {html => ui/locale}/locale_zh.json | 0 {html => ui/locale}/override_en.json | 0 {html => ui/locale}/override_hr.json | 0 {html => ui/locale}/override_ko.json | 0 javascript/logMonitor.js => ui/logMonitor.ts | 91 +- javascript/logger.js => ui/logger.ts | 59 +- ui/manifest/favicon.png | Bin 0 -> 11536 bytes {html => ui/manifest}/manifest.json | 0 javascript/monitor.js => ui/monitor.ts | 49 +- .../notification.js => ui/notification.ts | 17 +- .../progressBar.js => ui/progressBar.ts | 57 +- .../promptChecker.js => ui/promptChecker.ts | 18 +- javascript/script.js => ui/script.ts | 78 +- javascript/setHints.js => ui/setHints.ts | 86 +- javascript/settings.js => ui/settings.ts | 22 +- ui/startup.ts | 128 + javascript/timers.js => ui/timers.ts | 13 +- javascript/timesheet.js => ui/timesheet.ts | 36 +- ui/trainMonitor.ts | 16 + ui/tsconfig.json | 42 + javascript/ui.js => ui/ui.ts | 130 +- ui/uiConfig.ts | 27 + ui/vendor.ts | 8 + webui.py | 2 +- wiki | 2 +- 174 files changed, 22603 insertions(+), 3989 deletions(-) rename {html => data}/art-styles.json (100%) delete mode 100644 html/licenses.html delete mode 100644 html/logo-bg-dark.jpg delete mode 100644 html/logo-bg-light.jpg delete mode 100644 html/logo-robot.svg delete mode 100644 html/logo-wide.png delete mode 100644 javascript/authWrap.js delete mode 100644 javascript/docs.js delete mode 100644 javascript/exifr.js delete mode 100644 javascript/extensions.js delete mode 100644 javascript/generationParams.js delete mode 100644 javascript/hires.js delete mode 100644 javascript/iframeResizer.min.js delete mode 100644 javascript/jquery.js delete mode 100644 javascript/panZoom.js delete mode 100644 javascript/sha256.js delete mode 100644 javascript/sparkline.js delete mode 100644 javascript/startup.js delete mode 100644 javascript/trainMonitor.js delete mode 100644 javascript/uiConfig.js create mode 100644 ui/.build.json rename javascript/aspectRatioOverlay.js => ui/aspectRatioOverlay.ts (65%) rename {html => ui/assets}/favicon.ico (100%) rename {html => ui/assets}/favicon.png (100%) rename {html => ui/assets}/favicon.svg (100%) rename {html => ui/assets}/logo-bg-0.jpg (100%) rename {html => ui/assets}/logo-bg-1.jpg (100%) rename {html => ui/assets}/logo-bg-2.jpg (100%) rename {html => ui/assets}/logo-bg-3.jpg (100%) rename {html => ui/assets}/logo-bg-4.jpg (100%) rename {html => ui/assets}/logo-bg-5.jpg (100%) rename {html => ui/assets}/logo-bg-6.jpg (100%) rename {html => ui/assets}/logo-bg-7.jpg (100%) rename {html => ui/assets}/logo-bg-8.jpg (100%) rename {html => ui/assets}/logo-bg-9.jpg (100%) rename {html => ui/assets}/logo-dark.png (100%) rename {html => ui/assets}/logo-dark.svg (100%) rename {html => ui/assets}/logo-light.png (100%) rename {html => ui/assets}/logo-light.svg (100%) rename {html => ui/assets}/logo-transparent.png (100%) rename {html => ui/assets}/missing.png (100%) rename {html => ui/assets}/notification.mp3 (100%) rename {html => ui/assets}/screenshot-robot.jpg (100%) create mode 100644 ui/authWrap.ts rename javascript/autocomplete.js => ui/autocomplete.ts (94%) rename javascript/autocomplete_xn.js => ui/autocomplete_xn.ts (61%) rename javascript/changelog.js => ui/changelog.ts (83%) rename javascript/civitai.js => ui/civitai.ts (72%) rename javascript/contextMenus.js => ui/contextMenus.ts (64%) rename javascript/control.js => ui/control.ts (73%) rename {javascript => ui/css}/amethyst-nightfall.css (100%) rename {javascript => ui/css}/base.css (99%) rename {javascript => ui/css}/black-gray.css (99%) rename {javascript => ui/css}/black-orange.css (99%) rename {javascript => ui/css}/black-teal-reimagined.css (99%) rename {javascript => ui/css}/black-teal.css (99%) rename {javascript => ui/css}/emerald-paradise.css (100%) rename {javascript => ui/css}/invoked.css (100%) rename {javascript => ui/css}/light-teal.css (99%) rename {javascript => ui/css}/midnight-barbie.css (100%) rename {javascript => ui/css}/orchid-dreams.css (100%) rename {javascript => ui/css}/sdnext.css (99%) rename {javascript => ui/css}/simple-dark.css (99%) rename {javascript => ui/css}/simple-light.css (99%) rename {html => ui/css}/swagger.css (100%) rename {javascript => ui/css}/timeless-beige.css (100%) rename {javascript => ui/css}/timesheet.css (100%) create mode 100644 ui/dist/sdnext.mjs create mode 100644 ui/dist/sdnext.mjs.map create mode 100644 ui/docs.ts rename javascript/dragDrop.js => ui/dragDrop.ts (74%) rename javascript/editAttention.js => ui/editAttention.ts (85%) create mode 100644 ui/extensions.ts rename javascript/extraNetworks.js => ui/extraNetworks.ts (89%) rename {javascript => ui/fonts}/ibmplexmono-nerdfont-medium.ttf (100%) rename {javascript => ui/fonts}/notosans-nerdfont-regular.ttf (100%) rename {javascript => ui/fonts}/roboto.ttf (100%) rename javascript/gallery.js => ui/gallery.ts (96%) create mode 100644 ui/generationParams.ts create mode 100644 ui/globals.d.ts rename javascript/gpu.js => ui/gpu.ts (71%) rename javascript/guidance.js => ui/guidance.ts (82%) create mode 100644 ui/hires.ts rename javascript/history.js => ui/history.ts (61%) rename javascript/imageParams.js => ui/imageParams.ts (58%) rename javascript/imageViewer.js => ui/imageViewer.ts (89%) create mode 100644 ui/index.ts rename javascript/indexdb.js => ui/indexdb.ts (74%) rename javascript/inputAccordion.js => ui/inputAccordion.ts (56%) create mode 100644 ui/js/iframeResizer.js rename {javascript => ui/js}/login.js (100%) create mode 100644 ui/js/sha256.ts rename javascript/loader.js => ui/loader.ts (79%) rename {html => ui/locale}/locale_ar.json (100%) rename {html => ui/locale}/locale_bn.json (100%) rename {html => ui/locale}/locale_de.json (100%) rename {html => ui/locale}/locale_en.json (100%) rename {html => ui/locale}/locale_es.json (100%) rename {html => ui/locale}/locale_fr.json (100%) rename {html => ui/locale}/locale_he.json (100%) rename {html => ui/locale}/locale_hi.json (100%) rename {html => ui/locale}/locale_hr.json (100%) rename {html => ui/locale}/locale_id.json (100%) rename {html => ui/locale}/locale_it.json (100%) rename {html => ui/locale}/locale_ja.json (100%) rename {html => ui/locale}/locale_ko.json (100%) rename {html => ui/locale}/locale_nb.json (100%) rename {html => ui/locale}/locale_po.json (100%) rename {html => ui/locale}/locale_pt.json (100%) rename {html => ui/locale}/locale_qq.json (100%) rename {html => ui/locale}/locale_ru.json (100%) rename {html => ui/locale}/locale_sr.json (100%) rename {html => ui/locale}/locale_tb.json (100%) rename {html => ui/locale}/locale_tlh.json (100%) rename {html => ui/locale}/locale_tr.json (100%) rename {html => ui/locale}/locale_ur.json (100%) rename {html => ui/locale}/locale_vi.json (100%) rename {html => ui/locale}/locale_xx.json (100%) rename {html => ui/locale}/locale_zh.json (100%) rename {html => ui/locale}/override_en.json (100%) rename {html => ui/locale}/override_hr.json (100%) rename {html => ui/locale}/override_ko.json (100%) rename javascript/logMonitor.js => ui/logMonitor.ts (60%) rename javascript/logger.js => ui/logger.ts (68%) create mode 100644 ui/manifest/favicon.png rename {html => ui/manifest}/manifest.json (100%) rename javascript/monitor.js => ui/monitor.ts (71%) rename javascript/notification.js => ui/notification.ts (64%) rename javascript/progressBar.js => ui/progressBar.ts (80%) rename javascript/promptChecker.js => ui/promptChecker.ts (77%) rename javascript/script.js => ui/script.ts (82%) rename javascript/setHints.js => ui/setHints.ts (87%) rename javascript/settings.js => ui/settings.ts (92%) create mode 100644 ui/startup.ts rename javascript/timers.js => ui/timers.ts (58%) rename javascript/timesheet.js => ui/timesheet.ts (76%) create mode 100644 ui/trainMonitor.ts create mode 100644 ui/tsconfig.json rename javascript/ui.js => ui/ui.ts (86%) create mode 100644 ui/uiConfig.ts create mode 100644 ui/vendor.ts diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index e6c06e624..97acc8d7e 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -11,7 +11,7 @@ General app structure is: This file contains general guidelines for contributing to the SD.Next codebase, including conventions, tools, and project structure. For more specific guidance on working with particular areas of the codebase, please refer to the instructions files linked below: - [Core Runtime Guidelines](instructions/core.instructions.md): Use when editing Python core runtime code, startup flow, model loading, API internals, backend/device logic, or shared state in modules and pipelines. - [UI And Frontend Guidelines](instructions/ui.instructions.md): Use when editing frontend UI code, JavaScript, HTML, CSS, localization files, or built-in UI extensions including modernui and kanvas. -- [Hint Typography Guidelines](instructions/hints.instructions.md): Use when editing hint text or other UI strings in localization JSON files (`html/locale_*.json`, `html/override_*.json`). +- [Hint Typography Guidelines](instructions/hints.instructions.md): Use when editing hint text or other UI strings in localization JSON files (`ui/locale/locale_*.json`, `ui/locale/override_*.json`). ## Agent Guidelines diff --git a/.github/instructions/hints.instructions.md b/.github/instructions/hints.instructions.md index aa7112709..378ce8394 100644 --- a/.github/instructions/hints.instructions.md +++ b/.github/instructions/hints.instructions.md @@ -1,7 +1,7 @@ --- description: "Use when editing hint text or other UI strings in localization JSON files; follow the ordered rules below for consistent formatting." name: "Hint Typography Guidelines" -applyTo: "html/locale_*.json, html/override_*.json" +applyTo: "ui/locale/*.json" --- # Hint Typography Guidelines @@ -40,11 +40,11 @@ Hint strings render as HTML. Use this small set of inline tags to keep hints sca ## Translation propagation -1. `html/locale_en.json` is the source of truth. Other `html/locale_*.json` files are auto-generated by `cli/localize.js`; edit only the English file. -2. Per-locale corrections live in `html/override_{locale}.json`. +1. `ui/locale/locale_en.json` is the source of truth. Other `ui/locale/locale_*.json` files are auto-generated by `cli/localize.js`; edit only the English file. +2. Per-locale corrections live in `ui/locale/override_{locale}.json`. ## Validation -1. Validate JSON syntax with `jq empty html/locale_en.json`. -2. Lint with `pnpm eslint -- html/locale_en.json` (silent success). +1. Validate JSON syntax with `jq empty ui/locale/locale_en.json`. +2. Lint with `pnpm eslint -- ui/locale/locale_en.json` (silent success). 3. See `wiki/Hints.md` for the wiki-facing version of these rules. diff --git a/.github/instructions/ui.instructions.md b/.github/instructions/ui.instructions.md index 2fe94b1c0..0334b7f8d 100644 --- a/.github/instructions/ui.instructions.md +++ b/.github/instructions/ui.instructions.md @@ -1,7 +1,7 @@ --- -description: "Use when editing frontend UI code, JavaScript, HTML, CSS, localization files, or built-in UI extensions including modernui and kanvas." +description: "Use when editing frontend UI code, TypesScript, JavaScript, HTML, CSS, localization files, or built-in UI extensions including modernui and kanvas." name: "UI And Frontend Guidelines" -applyTo: "javascript/**/*.js, html/**/*.html, html/**/*.css, html/**/*.js, extensions-builtin/sdnext-modernui/**/*, extensions-builtin/sdnext-kanvas/**/*" +applyTo: "ui/**/*, extensions-builtin/sdnext-modernui/**/*, extensions-builtin/sdnext-kanvas/**/*" --- # UI And Frontend Guidelines @@ -9,8 +9,8 @@ Apply these rules in priority order: 1. Preserve the current event-handling logic and data flow between Gradio/Python endpoints and frontend handlers; do not change payload shapes without backend alignment. 2. Follow existing project lint and style patterns; prefer consistency with nearby files over introducing new frameworks or architecture. -3. Keep localization-friendly UI text changes synchronized with locale resources in `html/locale_*.json` when user-facing strings are added or changed. +3. Keep localization-friendly UI text changes synchronized with locale resources in `ui/locale/locale_*.json` when user-facing strings are added or changed. 4. Avoid bundling unrelated visual refactors with functional fixes; keep UI PRs scoped and reviewable. 5. For extension UI work, respect each extension's boundaries and avoid cross-extension coupling. -6. Validate JavaScript changes with `pnpm eslint`; for modern UI extension changes also run `pnpm eslint-ui`. +6. Validate TypeScript and JavaScript changes with `pnpm eslint` and `pnpm tsc`. 7. Maintain mobile compatibility when touching layout or interaction behavior. diff --git a/.vscode/settings.json b/.vscode/settings.json index 916732832..99b079518 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,5 @@ { "files.eol": "\n", - "python.analysis.extraPaths": [".", "./modules", "./scripts", "./pipelines"], - "python.analysis.typeCheckingMode": "off", "editor.formatOnSave": false, "python.REPL.enableREPLSmartSend": false, "eslint.enable": true, @@ -13,6 +11,13 @@ "json", "markdown" ], + "search.exclude": { + "**/__pycache__": true, + "**/node_modules": true, + "**/venv": true, + "**/*.mjs": true, + "**/*.map": true + }, "githubPullRequests.ignoredPullRequestBranches": [ "master" ] diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a9023fa1..3759a06f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2026-05-19 +## Update for 2026-05-20 - **Models** - [CircleStone Anima 1.0](https://huggingface.co/circlestone-labs/Anima) in *Base* and *Turbo* (distilled) variants @@ -32,7 +32,10 @@ - Automated fixes using `/check-` skills - Automated syntax, spelling and readability improvements to `/wiki` pages - **Internal** - - complete refactor of `modernui` javascript codebase to typescript! + - complete refactor of `core` JavaScript codebase to TypeScript! + - complete refactor of `modernui` JavaScript codebase to TypeScript! + - remove of `/html` and `/javascript` folders + - add `/ui` folder for all ui-related code/css/assets - improve `kanvas` typing - additional strong typing in core, thanks @awsr - **Fixes** diff --git a/README.md b/README.md index 0e25b8edf..93696e347 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
-SD.Next: AI art generator logo +SD.Next: AI art generator logo # SD.Next: All-in-one WebUI @@ -30,7 +30,7 @@ SD.Next is a powerful, open-source WebUI app for AI image and video generation, ### Screenshot: Desktop interface
-SD.Next: AI art generator desktop interface screenshot +SD.Next: AI art generator desktop interface screenshot
### Screenshot: Mobile interface diff --git a/TODO.md b/TODO.md index 5c43a6cc4..817816e1e 100644 --- a/TODO.md +++ b/TODO.md @@ -2,8 +2,11 @@ ## Issues -- Kanvas changing blur/dilate makes mask unusable - LTX audio leaks from previous runs +- Dev-document UI:Core/ModernUI/Kanvas +- Dev-document Hints +- Dev-document LoRA +- Torch lazy-load ## Features @@ -160,20 +163,16 @@ TODO: Investigate which models are diffusers-compatible and prioritize! > npm run todo ```code -installer.py:TODO rocm: switch to pytorch source when it becomes available -modules/control/run.py:TODO modernui: monkey-patch for missing tabs.select event -modules/history.py:TODO: apply metadata, preview, load/save -modules/image/resize.py:TODO resize image: enable full VAE mode for resize-latent -modules/lora/lora_load.py:TODO lora: add t5 key support for sd35/f1 -modules/masking.py:TODO: additional masking algorithms -modules/modular_guiders.py:TODO: guiders -modules/processing_class.py:TODO processing: remove duplicate mask params -modules/sd_hijack_hypertile.py:TODO hypertile: vae breaks when using non-standard sizes -modules/sd_models.py:TODO model load: implement model in-memory caching -modules/sd_samplers_diffusers.py:TODO enso-required -modules/sd_unet.py:TODO model load: force-reloading entire model as loading transformers only leads to massive memory usage -modules/transformer_cache.py:TODO fc: autodetect distilled based on model -modules/transformer_cache.py:TODO fc: autodetect tensor format based on model -modules/ui_models_load.py:TODO loader: load receipe -modules/ui_models_load.py:TODO loader: save receipe +installer.py:652:15: W0511: TODO rocm: switch to pytorch source when it becomes available (fixme) +modules/sd_models_compile.py:90:5: W0511: TODO pruna: enable when it supports transformers==5.5 (fixme) +modules/transformer_cache.py:29:61: W0511: TODO fc: autodetect tensor format based on model (fixme) +modules/transformer_cache.py:30:50: W0511: TODO fc: autodetect distilled based on model (fixme) +modules/processing_class.py:406:32: W0511: TODO processing: remove duplicate mask params (fixme) +modules/sd_samplers_diffusers.py:370:31: W0511: TODO enso-required (fixme) +modules/sd_models.py:1424:5: W0511: TODO model load: implement model in-memory caching (fixme) +modules/ui_models_load.py:257:5: W0511: TODO loader: load receipe (fixme) +modules/ui_models_load.py:264:5: W0511: TODO loader: save receipe (fixme) +modules/sd_hijack_hypertile.py:123:17: W0511: TODO hypertile: vae breaks when using non-standard sizes (fixme) +modules/sd_unet.py:77:39: W0511: TODO model load: force-reloading entire model as loading transformers only leads to massive memory usage (fixme) +modules/modular_guiders.py:66:51: W0511: TODO: guiders (fixme) ``` diff --git a/html/art-styles.json b/data/art-styles.json similarity index 100% rename from html/art-styles.json rename to data/art-styles.json diff --git a/eslint.config.mjs b/eslint.config.mjs index 403755e76..76cd74356 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -29,88 +29,6 @@ const jsConfig = defineConfig([ ...globals.builtin, ...globals.browser, ...globals.jquery, - panzoom: 'readonly', - authFetch: 'readonly', - initServerInfo: 'readonly', - log: 'readonly', - debug: 'readonly', - error: 'readonly', - timer: 'readonly', - xhrGet: 'readonly', - xhrPost: 'readonly', - gradioApp: 'readonly', - executeCallbacks: 'readonly', - onAfterUiUpdate: 'readonly', - onOptionsChanged: 'readonly', - optionsChangedCallbacks: 'readonly', - onUiLoaded: 'readonly', - onUiUpdate: 'readonly', - onUiTabChange: 'readonly', - onUiReady: 'readonly', - uiCurrentTab: 'writable', - uiElementIsVisible: 'readonly', - uiElementInSight: 'readonly', - getUICurrentTabContent: 'readonly', - waitForFlag: 'readonly', - logFn: 'readonly', - logTimers: 'readonly', - generateForever: 'readonly', - showContributors: 'readonly', - opts: 'writable', - monitorOption: 'readonly', - sortUIElements: 'readonly', - all_gallery_buttons: 'readonly', - selected_gallery_button: 'readonly', - selected_gallery_index: 'readonly', - switch_to_txt2img: 'readonly', - switch_to_img2img_tab: 'readonly', - switch_to_img2img: 'readonly', - switch_to_sketch: 'readonly', - switch_to_inpaint: 'readonly', - witch_to_inpaint_sketch: 'readonly', - switch_to_extras: 'readonly', - get_tab_index: 'readonly', - create_submit_args: 'readonly', - restartReload: 'readonly', - markSelectedCards: 'readonly', - updateInput: 'readonly', - toggleCompact: 'readonly', - setFontSize: 'readonly', - setTheme: 'readonly', - registerDragDrop: 'readonly', - getToken: 'readonly', - getENActiveTab: 'readonly', - quickApplyStyle: 'readonly', - quickSaveStyle: 'readonly', - setupExtraNetworks: 'readonly', - showNetworks: 'readonly', - localization: 'readonly', - randomId: 'readonly', - requestProgress: 'readonly', - setRefreshInterval: 'readonly', - modalPrevImage: 'readonly', - modalNextImage: 'readonly', - galleryClickEventHandler: 'readonly', - getExif: 'readonly', - jobStatusEl: 'readonly', - removeSplash: 'readonly', - initGPU: 'readonly', - startGPU: 'readonly', - disableNVML: 'readonly', - hash: 'readonly', - idbGet: 'readonly', - idbPut: 'readonly', - idbDel: 'readonly', - idbAdd: 'readonly', - initTableSorter: 'readonly', - idbCount: 'readonly', - idbFolderCleanup: 'readonly', - idbClearAll: 'readonly', - idbIsReady: 'readonly', - initChangelog: 'readonly', - sendNotification: 'readonly', - monitorConnection: 'readonly', - ConnectionMonitorState: 'readonly', }, }, }, @@ -153,6 +71,7 @@ const jsConfig = defineConfig([ 'prefer-template': 'warn', 'promise/no-nesting': 'off', '@typescript-eslint/no-for-in-array': 'off', + 'import-x/no-extraneous-dependencies': 'off', radix: 'off', '@stylistic/brace-style': [ 'error', @@ -205,22 +124,28 @@ const jsConfig = defineConfig([ }, ]); -// const typescriptConfig = defineConfig([ -// // TypeScript ESLint plugin -// plugins.typescriptEslint, -// // Airbnb base TypeScript config -// ...configs.base.typescript, -// { -// name: 'sdnext/typescript', -// files: helpers.extensions.tsFiles, -// rules: { -// '@typescript-eslint/ban-ts-comment': 'off', -// '@typescript-eslint/explicit-module-boundary-types': 'off', -// '@typescript-eslint/no-shadow': 'error', -// '@typescript-eslint/no-var-requires': 'off', -// }, -// }, -// ]); +const typescriptConfig = defineConfig([ + // TypeScript ESLint plugin + plugins.typescriptEslint, + // Airbnb base TypeScript config + ...configs.base.typescript, + { + name: 'sdnext/ts', + files: ['ui/**/*.ts'], + rules: { + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-shadow': 'error', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-for-in-array': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/prefer-destructuring': 'off', + '@typescript-eslint/naming-convention': 'off', + 'import-x/prefer-default-export': 'off', + 'import-x/no-extraneous-dependencies': 'off', + }, + }, +]); const nodeConfig = defineConfig([ // Node plugin @@ -332,21 +257,16 @@ export default defineConfig([ // Ignore files and folders listed in .gitignore includeIgnoreFile(gitignorePath), globalIgnores([ + '**/venv', '**/node_modules', '**/extensions', '**/extensions-builtin', - '**/repositories', - '**/venv', - '**/panZoom.js', - '**/split.js', - '**/exifr.js', - '**/jquery.js', - '**/sparkline.js', - '**/sha256.js', - '**/iframeResizer.min.js', + 'javascript/*', + 'ui/dist/*', + 'ui/js/*', ]), ...jsConfig, - // ...typescriptConfig, + ...typescriptConfig, ...nodeConfig, ...jsonConfig, ...markdownConfig, diff --git a/extensions-builtin/sdnext-kanvas b/extensions-builtin/sdnext-kanvas index 343d75019..dc8ac5aa1 160000 --- a/extensions-builtin/sdnext-kanvas +++ b/extensions-builtin/sdnext-kanvas @@ -1 +1 @@ -Subproject commit 343d75019c548701f2da5b523010e7d5193cec34 +Subproject commit dc8ac5aa189ec71aebc53c6c7e914a8267421fe8 diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index dc9c92769..406eed351 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit dc9c9276927461353ed4ba0f8b0fe9f9a8c10991 +Subproject commit 406eed3510f2845ffa95c3fda0a47bcb664a48a2 diff --git a/html/licenses.html b/html/licenses.html deleted file mode 100644 index 5c282685e..000000000 --- a/html/licenses.html +++ /dev/null @@ -1,710 +0,0 @@ - - - -

ESRGAN

-Code for architecture and reading models copied. -
-MIT License
-
-Copyright (c) 2021 victorca25
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
- -

Real-ESRGAN

-Some code is copied to support ESRGAN models. -
-BSD 3-Clause License
-
-Copyright (c) 2021, Xintao Wang
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-
-3. Neither the name of the copyright holder nor the names of its
-   contributors may be used to endorse or promote products derived from
-   this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- -

InvokeAI

-Some code for compatibility with OSX is taken from lstein's repository. -
-MIT License
-
-Copyright (c) 2022 InvokeAI Team
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
- -

LDSR

-Code added by contirubtors, most likely copied from this repository. -
-MIT License
-
-Copyright (c) 2022 Machine Vision and Learning Group, LMU Munich
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
- -

CLIP Interrogator

-Some small amounts of code borrowed and reworked. -
-MIT License
-
-Copyright (c) 2022 pharmapsychotic
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
- -

SwinIR

-Code added by contributors, most likely copied from this repository. - -
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [2021] [SwinIR Authors]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
- -

Memory Efficient Attention

-The sub-quadratic cross attention optimization uses modified code from the Memory Efficient Attention package that Alex Birch optimized for 3D tensors. This license is updated to reflect that. -
-MIT License
-
-Copyright (c) 2023 Alex Birch
-Copyright (c) 2023 Amin Rezaei
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
- -

Scaled Dot Product Attention

-Some small amounts of code borrowed and reworked. -
-   Copyright 2023 The HuggingFace Team. All rights reserved.
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
- -

Flash Attention

-Fast and memory-efficient exact attention -
-BSD 3-Clause License
-
-Copyright (c) 2022, the respective contributors, as shown by the AUTHORS file.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-
-* Neither the name of the copyright holder nor the names of its
-   contributors may be used to endorse or promote products derived from
-   this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- -

Curated transformers

-The MPS workaround for nn.Linear on macOS 13.2.X is based on the MPS workaround for nn.Linear created by danieldk for Curated transformers -
-The MIT License (MIT)
-
-Copyright (C) 2021 ExplosionAI GmbH
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
- -

TAESD

-Tiny AutoEncoder for Stable Diffusion option for live previews -
-MIT License
-
-Copyright (c) 2023 Ollin Boer Bohan
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
- -

Olive

-An easy-to-use hardware-aware model optimization tool that composes industry-leading techniques across model compression, optimization, and compilation. -
-MIT License
-
-Copyright (c) Microsoft Corporation.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE
-
diff --git a/html/logo-bg-dark.jpg b/html/logo-bg-dark.jpg deleted file mode 100644 index 40af4bbbc41fe91365ec82c8cc7f5ac8ba7ff2a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18702 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 C!f_-3 diff --git a/html/logo-robot.svg b/html/logo-robot.svg deleted file mode 100644 index 52d86b16d..000000000 --- a/html/logo-robot.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/html/logo-wide.png b/html/logo-wide.png deleted file mode 100644 index e13266bcebb8e392bf03248a9b35891842d19ad6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160056 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
",2===yt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,t.head.appendChild(r)):t=m),o=!n&&[],(i=T.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||K})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return R(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Qe(le.pixelPosition,function(e,t){if(t)return t=Ve(e,n),$e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return R(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0 0) { - transform.x += diff; - adjusted = true; - } - // check the other side: - diff = boundingBox.right - clientRect.left; - if (diff < 0) { - transform.x += diff; - adjusted = true; - } - - // y axis: - diff = boundingBox.top - clientRect.bottom; - if (diff > 0) { - // we adjust transform, so that it matches exactly our bounding box: - // transform.y = boundingBox.top - (boundingBox.height + boundingBox.y) * transform.scale => - // transform.y = boundingBox.top - (clientRect.bottom - transform.y) => - // transform.y = diff + transform.y => - transform.y += diff; - adjusted = true; - } - - diff = boundingBox.bottom - clientRect.top; - if (diff < 0) { - transform.y += diff; - adjusted = true; - } - return adjusted; - } - - /** - * Returns bounding box that should be used to restrict scene movement. - */ - function getBoundingBox() { - if (!bounds) return; // client does not want to restrict movement - - if (typeof bounds === 'boolean') { - // for boolean type we use parent container bounds - var ownerRect = owner.getBoundingClientRect(); - var sceneWidth = ownerRect.width; - var sceneHeight = ownerRect.height; - - return { - left: sceneWidth * boundsPadding, - top: sceneHeight * boundsPadding, - right: sceneWidth * (1 - boundsPadding), - bottom: sceneHeight * (1 - boundsPadding) - }; - } - - return bounds; - } - - function getClientRect() { - var bbox = panController.getBBox(); - var leftTop = client(bbox.left, bbox.top); - - return { - left: leftTop.x, - top: leftTop.y, - right: bbox.width * transform.scale + leftTop.x, - bottom: bbox.height * transform.scale + leftTop.y - }; - } - - function client(x, y) { - return { - x: x * transform.scale + transform.x, - y: y * transform.scale + transform.y - }; - } - - function makeDirty() { - isDirty = true; - frameAnimation = window.requestAnimationFrame(frame); - } - - function zoomByRatio(clientX, clientY, ratio) { - if (isNaN(clientX) || isNaN(clientY) || isNaN(ratio)) { - throw new Error('zoom requires valid numbers'); - } - - var newScale = transform.scale * ratio; - - if (newScale < minZoom) { - if (transform.scale === minZoom) return; - - ratio = minZoom / transform.scale; - } - if (newScale > maxZoom) { - if (transform.scale === maxZoom) return; - - ratio = maxZoom / transform.scale; - } - - var size = transformToScreen(clientX, clientY); - - transform.x = size.x - ratio * (size.x - transform.x); - transform.y = size.y - ratio * (size.y - transform.y); - - if (bounds && boundsPadding === 1 && minZoom === 1) { - transform.scale *= ratio; - keepTransformInsideBounds(); - } else { - var transformAdjusted = keepTransformInsideBounds(); - if (!transformAdjusted) transform.scale *= ratio; - } - - triggerEvent('zoom'); - - makeDirty(); - } - - function zoomAbs(clientX, clientY, zoomLevel) { - var ratio = zoomLevel / transform.scale; - zoomByRatio(clientX, clientY, ratio); - } - - function centerOn(ui) { - var parent = ui.ownerSVGElement; - if (!parent) - throw new Error('ui element is required to be within the scene'); - - var clientRect = ui.getBoundingClientRect(); - var cx = clientRect.left + clientRect.width / 2; - var cy = clientRect.top + clientRect.height / 2; - - var container = parent.getBoundingClientRect(); - var dx = container.width / 2 - cx; - var dy = container.height / 2 - cy; - - internalMoveBy(dx, dy, true); - } - - function smoothMoveTo(x, y){ - internalMoveBy(x - transform.x, y - transform.y, true) - } - - function internalMoveBy(dx, dy, smooth) { - if (!smooth) { - return moveBy(dx, dy); - } - - if (moveByAnimation) moveByAnimation.cancel(); - - var from = { x: 0, y: 0 }; - var to = { x: dx, y: dy }; - var lastX = 0; - var lastY = 0; - - moveByAnimation = animate(from, to, { - step: function (v) { - moveBy(v.x - lastX, v.y - lastY); - - lastX = v.x; - lastY = v.y; - } - }); - } - - function scroll(x, y) { - cancelZoomAnimation(); - moveTo(x, y); - } - - function dispose() { - releaseEvents(); - } - - function listenForEvents() { - owner.addEventListener('mousedown', onMouseDown, { passive: false }); - owner.addEventListener('dblclick', onDoubleClick, { passive: false }); - owner.addEventListener('touchstart', onTouch, { passive: false }); - owner.addEventListener('keydown', onKeyDown, { passive: false }); - - // Need to listen on the owner container, so that we are not limited - // by the size of the scrollable domElement - wheel.addWheelListener(owner, onMouseWheel, { passive: false }); - - makeDirty(); - } - - function releaseEvents() { - wheel.removeWheelListener(owner, onMouseWheel); - owner.removeEventListener('mousedown', onMouseDown); - owner.removeEventListener('keydown', onKeyDown); - owner.removeEventListener('dblclick', onDoubleClick); - owner.removeEventListener('touchstart', onTouch); - - if (frameAnimation) { - window.cancelAnimationFrame(frameAnimation); - frameAnimation = 0; - } - smoothScroll.cancel(); - releaseDocumentMouse(); - releaseTouches(); - textSelection.release(); - triggerPanEnd(); - } - - function frame() { - if (isDirty) applyTransform(); - } - - function applyTransform() { - isDirty = false; - panController.applyTransform(transform); - triggerEvent('transform'); - frameAnimation = 0; - } - - function onKeyDown(e) { - var x = 0, - y = 0, - z = 0; - if (e.keyCode === 38) { - y = 1; // up - } else if (e.keyCode === 40) { - y = -1; // down - } else if (e.keyCode === 37) { - x = 1; // left - } else if (e.keyCode === 39) { - x = -1; // right - } else if (e.keyCode === 189 || e.keyCode === 109) { - // DASH or SUBTRACT - z = 1; // `-` - zoom out - } else if (e.keyCode === 187 || e.keyCode === 107) { - // EQUAL SIGN or ADD - z = -1; // `=` - zoom in (equal sign on US layout is under `+`) - } - - if (filterKey(e, x, y, z)) { - // They don't want us to handle the key: https://github.com/anvaka/panzoom/issues/45 - return; - } - - if (x || y) { - e.preventDefault(); - e.stopPropagation(); - - var clientRect = owner.getBoundingClientRect(); - // movement speed should be the same in both X and Y direction: - var offset = Math.min(clientRect.width, clientRect.height); - var moveSpeedRatio = 0.05; - var dx = offset * moveSpeedRatio * x; - var dy = offset * moveSpeedRatio * y; - internalMoveBy(dx, dy); - } - - if (z) { - var scaleMultiplier = getScaleMultiplier(z * 100); - var offset = transformOrigin ? getTransformOriginOffset() : midPoint(); - publicZoomTo(offset.x, offset.y, scaleMultiplier); - } - } - - function midPoint() { - var ownerRect = owner.getBoundingClientRect(); - return { - x: ownerRect.width / 2, - y: ownerRect.height / 2 - }; - } - - function onTouch(e) { - // let the override the touch behavior - beforeTouch(e); - - if (e.touches.length === 1) { - return handleSingleFingerTouch(e, e.touches[0]); - } else if (e.touches.length === 2) { - // handleTouchMove() will care about pinch zoom. - pinchZoomLength = getPinchZoomLength(e.touches[0], e.touches[1]); - multiTouch = true; - startTouchListenerIfNeeded(); - } - } - - function beforeTouch(e) { - if (options.onTouch && !options.onTouch(e)) { - // if they return `false` from onTouch, we don't want to stop - // events propagation. Fixes https://github.com/anvaka/panzoom/issues/12 - return; - } - - e.stopPropagation(); - e.preventDefault(); - } - - function beforeDoubleClick(e) { - if (options.onDoubleClick && !options.onDoubleClick(e)) { - // if they return `false` from onTouch, we don't want to stop - // events propagation. Fixes https://github.com/anvaka/panzoom/issues/46 - return; - } - - e.preventDefault(); - e.stopPropagation(); - } - - function handleSingleFingerTouch(e) { - var touch = e.touches[0]; - var offset = getOffsetXY(touch); - lastSingleFingerOffset = offset; - var point = transformToScreen(offset.x, offset.y); - mouseX = point.x; - mouseY = point.y; - - smoothScroll.cancel(); - startTouchListenerIfNeeded(); - } - - function startTouchListenerIfNeeded() { - if (touchInProgress) { - // no need to do anything, as we already listen to events; - return; - } - - touchInProgress = true; - document.addEventListener('touchmove', handleTouchMove); - document.addEventListener('touchend', handleTouchEnd); - document.addEventListener('touchcancel', handleTouchEnd); - } - - function handleTouchMove(e) { - if (e.touches.length === 1) { - e.stopPropagation(); - var touch = e.touches[0]; - - var offset = getOffsetXY(touch); - var point = transformToScreen(offset.x, offset.y); - - var dx = point.x - mouseX; - var dy = point.y - mouseY; - - if (dx !== 0 && dy !== 0) { - triggerPanStart(); - } - mouseX = point.x; - mouseY = point.y; - internalMoveBy(dx, dy); - } else if (e.touches.length === 2) { - // it's a zoom, let's find direction - multiTouch = true; - var t1 = e.touches[0]; - var t2 = e.touches[1]; - var currentPinchLength = getPinchZoomLength(t1, t2); - - // since the zoom speed is always based on distance from 1, we need to apply - // pinch speed only on that distance from 1: - var scaleMultiplier = - 1 + (currentPinchLength / pinchZoomLength - 1) * pinchSpeed; - - var firstTouchPoint = getOffsetXY(t1); - var secondTouchPoint = getOffsetXY(t2); - mouseX = (firstTouchPoint.x + secondTouchPoint.x) / 2; - mouseY = (firstTouchPoint.y + secondTouchPoint.y) / 2; - if (transformOrigin) { - var offset = getTransformOriginOffset(); - mouseX = offset.x; - mouseY = offset.y; - } - - publicZoomTo(mouseX, mouseY, scaleMultiplier); - - pinchZoomLength = currentPinchLength; - e.stopPropagation(); - e.preventDefault(); - } - } - - function handleTouchEnd(e) { - if (e.touches.length > 0) { - var offset = getOffsetXY(e.touches[0]); - var point = transformToScreen(offset.x, offset.y); - mouseX = point.x; - mouseY = point.y; - } else { - var now = new Date(); - if (now - lastTouchEndTime < doubleTapSpeedInMS) { - if (transformOrigin) { - var offset = getTransformOriginOffset(); - smoothZoom(offset.x, offset.y, zoomDoubleClickSpeed); - } else { - // We want untransformed x/y here. - smoothZoom(lastSingleFingerOffset.x, lastSingleFingerOffset.y, zoomDoubleClickSpeed); - } - } - - lastTouchEndTime = now; - - triggerPanEnd(); - releaseTouches(); - } - } - - function getPinchZoomLength(finger1, finger2) { - var dx = finger1.clientX - finger2.clientX; - var dy = finger1.clientY - finger2.clientY; - return Math.sqrt(dx * dx + dy * dy); - } - - function onDoubleClick(e) { - beforeDoubleClick(e); - var offset = getOffsetXY(e); - if (transformOrigin) { - // Need to refactor - offset = getTransformOriginOffset(); - } - smoothZoom(offset.x, offset.y, zoomDoubleClickSpeed); - } - - function onMouseDown(e) { - // if client does not want to handle this event - just ignore the call - if (beforeMouseDown(e)) return; - - if (touchInProgress) { - // modern browsers will fire mousedown for touch events too - // we do not want this: touch is handled separately. - e.stopPropagation(); - return false; - } - // for IE, left click == 1 - // for Firefox, left click == 0 - var isLeftButton = - (e.button === 1 && window.event !== null) || e.button === 0; - if (!isLeftButton) return; - - smoothScroll.cancel(); - - var offset = getOffsetXY(e); - var point = transformToScreen(offset.x, offset.y); - mouseX = point.x; - mouseY = point.y; - - // We need to listen on document itself, since mouse can go outside of the - // window, and we will loose it - document.addEventListener('mousemove', onMouseMove); - document.addEventListener('mouseup', onMouseUp); - textSelection.capture(e.target || e.srcElement); - - return false; - } - - function onMouseMove(e) { - // no need to worry about mouse events when touch is happening - if (touchInProgress) return; - - triggerPanStart(); - - var offset = getOffsetXY(e); - var point = transformToScreen(offset.x, offset.y); - var dx = point.x - mouseX; - var dy = point.y - mouseY; - - mouseX = point.x; - mouseY = point.y; - - internalMoveBy(dx, dy); - } - - function onMouseUp() { - textSelection.release(); - triggerPanEnd(); - releaseDocumentMouse(); - } - - function releaseDocumentMouse() { - document.removeEventListener('mousemove', onMouseMove); - document.removeEventListener('mouseup', onMouseUp); - panstartFired = false; - } - - function releaseTouches() { - document.removeEventListener('touchmove', handleTouchMove); - document.removeEventListener('touchend', handleTouchEnd); - document.removeEventListener('touchcancel', handleTouchEnd); - panstartFired = false; - multiTouch = false; - touchInProgress = false; - } - - function onMouseWheel(e) { - // if client does not want to handle this event - just ignore the call - if (beforeWheel(e)) return; - - smoothScroll.cancel(); - - var delta = e.deltaY; - if (e.deltaMode > 0) delta *= 100; - - var scaleMultiplier = getScaleMultiplier(delta); - - if (scaleMultiplier !== 1) { - var offset = transformOrigin - ? getTransformOriginOffset() - : getOffsetXY(e); - publicZoomTo(offset.x, offset.y, scaleMultiplier); - e.preventDefault(); - } - } - - function getOffsetXY(e) { - var offsetX, offsetY; - // I tried using e.offsetX, but that gives wrong results for svg, when user clicks on a path. - var ownerRect = owner.getBoundingClientRect(); - offsetX = e.clientX - ownerRect.left; - offsetY = e.clientY - ownerRect.top; - - return { x: offsetX, y: offsetY }; - } - - function smoothZoom(clientX, clientY, scaleMultiplier) { - var fromValue = transform.scale; - var from = { scale: fromValue }; - var to = { scale: scaleMultiplier * fromValue }; - - smoothScroll.cancel(); - cancelZoomAnimation(); - - zoomToAnimation = animate(from, to, { - step: function (v) { - zoomAbs(clientX, clientY, v.scale); - }, - done: triggerZoomEnd - }); - } - - function smoothZoomAbs(clientX, clientY, toScaleValue) { - var fromValue = transform.scale; - var from = { scale: fromValue }; - var to = { scale: toScaleValue }; - - smoothScroll.cancel(); - cancelZoomAnimation(); - - zoomToAnimation = animate(from, to, { - step: function (v) { - zoomAbs(clientX, clientY, v.scale); - } - }); - } - - function getTransformOriginOffset() { - var ownerRect = owner.getBoundingClientRect(); - return { - x: ownerRect.width * transformOrigin.x, - y: ownerRect.height * transformOrigin.y - }; - } - - function publicZoomTo(clientX, clientY, scaleMultiplier) { - smoothScroll.cancel(); - cancelZoomAnimation(); - return zoomByRatio(clientX, clientY, scaleMultiplier); - } - - function cancelZoomAnimation() { - if (zoomToAnimation) { - zoomToAnimation.cancel(); - zoomToAnimation = null; - } - } - - function getScaleMultiplier(delta) { - var sign = Math.sign(delta); - var deltaAdjustedSpeed = Math.min(0.25, Math.abs(speed * delta / 128)); - return 1 - sign * deltaAdjustedSpeed; - } - - function triggerPanStart() { - if (!panstartFired) { - triggerEvent('panstart'); - panstartFired = true; - smoothScroll.start(); - } - } - - function triggerPanEnd() { - if (panstartFired) { - // we should never run smooth scrolling if it was multiTouch (pinch zoom animation): - if (!multiTouch) smoothScroll.stop(); - triggerEvent('panend'); - } - } - - function triggerZoomEnd() { - triggerEvent('zoomend'); - } - - function triggerEvent(name) { - api.fire(name, api); - } -} - -function parseTransformOrigin(options) { - if (!options) return; - if (typeof options === 'object') { - if (!isNumber(options.x) || !isNumber(options.y)) - failTransformOrigin(options); - return options; - } - - failTransformOrigin(); -} - -function failTransformOrigin(options) { - console.error(options); - throw new Error( - [ - 'Cannot parse transform origin.', - 'Some good examples:', - ' "center center" can be achieved with {x: 0.5, y: 0.5}', - ' "top center" can be achieved with {x: 0.5, y: 0}', - ' "bottom right" can be achieved with {x: 1, y: 1}' - ].join('\n') - ); -} - -function noop() { } - -function validateBounds(bounds) { - var boundsType = typeof bounds; - if (boundsType === 'undefined' || boundsType === 'boolean') return; // this is okay - // otherwise need to be more thorough: - var validBounds = - isNumber(bounds.left) && - isNumber(bounds.top) && - isNumber(bounds.bottom) && - isNumber(bounds.right); - - if (!validBounds) - throw new Error( - 'Bounds object is not valid. It can be: ' + - 'undefined, boolean (true|false) or an object {left, top, right, bottom}' - ); -} - -function isNumber(x) { - return Number.isFinite(x); -} - -// IE 11 does not support isNaN: -function isNaN(value) { - if (Number.isNaN) { - return Number.isNaN(value); - } - - return value !== value; -} - -function rigidScroll() { - return { - start: noop, - stop: noop, - cancel: noop - }; -} - -function autoRun() { - if (typeof document === 'undefined') return; - - var scripts = document.getElementsByTagName('script'); - if (!scripts) return; - var panzoomScript; - - for (var i = 0; i < scripts.length; ++i) { - var x = scripts[i]; - if (x.src && x.src.match(/\bpanzoom(\.min)?\.js/)) { - panzoomScript = x; - break; - } - } - - if (!panzoomScript) return; - - var query = panzoomScript.getAttribute('query'); - if (!query) return; - - var globalName = panzoomScript.getAttribute('name') || 'pz'; - var started = Date.now(); - - tryAttach(); - - function tryAttach() { - var el = document.querySelector(query); - if (!el) { - var now = Date.now(); - var elapsed = now - started; - if (elapsed < 2000) { - // Let's wait a bit - setTimeout(tryAttach, 100); - return; - } - // If we don't attach within 2 seconds to the target element, consider it a failure - console.error('Cannot find the panzoom element', globalName); - return; - } - var options = collectOptions(panzoomScript); - log(options); - window[globalName] = createPanZoom(el, options); - } - - function collectOptions(script) { - var attrs = script.attributes; - var options = {}; - for (var i = 0; i < attrs.length; ++i) { - var attr = attrs[i]; - var nameValue = getPanzoomAttributeNameValue(attr); - if (nameValue) { - options[nameValue.name] = nameValue.value; - } - } - - return options; - } - - function getPanzoomAttributeNameValue(attr) { - if (!attr.name) return; - var isPanZoomAttribute = - attr.name[0] === 'p' && attr.name[1] === 'z' && attr.name[2] === '-'; - - if (!isPanZoomAttribute) return; - - var name = attr.name.substr(3); - var value = JSON.parse(attr.value); - return { name: name, value: value }; - } -} - -autoRun(); - -},{"./lib/createTextSelectionInterceptor.js":2,"./lib/domController.js":3,"./lib/kinetic.js":4,"./lib/svgController.js":5,"./lib/transform.js":6,"amator":7,"ngraph.events":9,"wheel":10}],2:[function(require,module,exports){ -/** - * Disallows selecting text. - */ -module.exports = createTextSelectionInterceptor; - -function createTextSelectionInterceptor(useFake) { - if (useFake) { - return { - capture: noop, - release: noop - }; - } - - var dragObject; - var prevSelectStart; - var prevDragStart; - var wasCaptured = false; - - return { - capture: capture, - release: release - }; - - function capture(domObject) { - wasCaptured = true; - prevSelectStart = window.document.onselectstart; - prevDragStart = window.document.ondragstart; - - window.document.onselectstart = disabled; - - dragObject = domObject; - dragObject.ondragstart = disabled; - } - - function release() { - if (!wasCaptured) return; - - wasCaptured = false; - window.document.onselectstart = prevSelectStart; - if (dragObject) dragObject.ondragstart = prevDragStart; - } -} - -function disabled(e) { - e.stopPropagation(); - return false; -} - -function noop() {} - -},{}],3:[function(require,module,exports){ -module.exports = makeDomController - -module.exports.canAttach = isDomElement; - -function makeDomController(domElement, options) { - var elementValid = isDomElement(domElement); - if (!elementValid) { - throw new Error('panzoom requires DOM element to be attached to the DOM tree') - } - - var owner = domElement.parentElement; - domElement.scrollTop = 0; - - if (!options.disableKeyboardInteraction) { - if (owner) owner.setAttribute('tabindex', 0); - } - - var api = { - getBBox: getBBox, - getOwner: getOwner, - applyTransform: applyTransform, - } - - return api - - function getOwner() { - return owner - } - - function getBBox() { - // TODO: We should probably cache this? - return { - left: 0, - top: 0, - width: domElement.clientWidth, - height: domElement.clientHeight - } - } - - function applyTransform(transform) { - // TODO: Should we cache this? - domElement.style.transformOrigin = '0 0 0'; - domElement.style.transform = 'matrix(' + - transform.scale + ', 0, 0, ' + - transform.scale + ', ' + - transform.x + ', ' + transform.y + ')' - } -} - -function isDomElement(element) { - return element && element.parentElement && element.style; -} - -},{}],4:[function(require,module,exports){ -/** - * Allows smooth kinetic scrolling of the surface - */ -module.exports = kinetic; - -function kinetic(getPoint, scroll, settings) { - if (typeof settings !== 'object') { - // setting could come as boolean, we should ignore it, and use an object. - settings = {}; - } - - var minVelocity = typeof settings.minVelocity === 'number' ? settings.minVelocity : 5; - var amplitude = typeof settings.amplitude === 'number' ? settings.amplitude : 0.25; - var cancelAnimationFrame = typeof settings.cancelAnimationFrame === 'function' ? settings.cancelAnimationFrame : getCancelAnimationFrame(); - var requestAnimationFrame = typeof settings.requestAnimationFrame === 'function' ? settings.requestAnimationFrame : getRequestAnimationFrame(); - - var lastPoint; - var timestamp; - var timeConstant = 342; - - var ticker; - var vx, targetX, ax; - var vy, targetY, ay; - - var raf; - - return { - start: start, - stop: stop, - cancel: dispose - }; - - function dispose() { - cancelAnimationFrame(ticker); - cancelAnimationFrame(raf); - } - - function start() { - lastPoint = getPoint(); - - ax = ay = vx = vy = 0; - timestamp = new Date(); - - cancelAnimationFrame(ticker); - cancelAnimationFrame(raf); - - // we start polling the point position to accumulate velocity - // Once we stop(), we will use accumulated velocity to keep scrolling - // an object. - ticker = requestAnimationFrame(track); - } - - function track() { - var now = Date.now(); - var elapsed = now - timestamp; - timestamp = now; - - var currentPoint = getPoint(); - - var dx = currentPoint.x - lastPoint.x; - var dy = currentPoint.y - lastPoint.y; - - lastPoint = currentPoint; - - var dt = 1000 / (1 + elapsed); - - // moving average - vx = 0.8 * dx * dt + 0.2 * vx; - vy = 0.8 * dy * dt + 0.2 * vy; - - ticker = requestAnimationFrame(track); - } - - function stop() { - cancelAnimationFrame(ticker); - cancelAnimationFrame(raf); - - var currentPoint = getPoint(); - - targetX = currentPoint.x; - targetY = currentPoint.y; - timestamp = Date.now(); - - if (vx < -minVelocity || vx > minVelocity) { - ax = amplitude * vx; - targetX += ax; - } - - if (vy < -minVelocity || vy > minVelocity) { - ay = amplitude * vy; - targetY += ay; - } - - raf = requestAnimationFrame(autoScroll); - } - - function autoScroll() { - var elapsed = Date.now() - timestamp; - - var moving = false; - var dx = 0; - var dy = 0; - - if (ax) { - dx = -ax * Math.exp(-elapsed / timeConstant); - - if (dx > 0.5 || dx < -0.5) moving = true; - else dx = ax = 0; - } - - if (ay) { - dy = -ay * Math.exp(-elapsed / timeConstant); - - if (dy > 0.5 || dy < -0.5) moving = true; - else dy = ay = 0; - } - - if (moving) { - scroll(targetX + dx, targetY + dy); - raf = requestAnimationFrame(autoScroll); - } - } -} - -function getCancelAnimationFrame() { - if (typeof cancelAnimationFrame === 'function') return cancelAnimationFrame; - return clearTimeout; -} - -function getRequestAnimationFrame() { - if (typeof requestAnimationFrame === 'function') return requestAnimationFrame; - - return function (handler) { - return setTimeout(handler, 16); - } -} -},{}],5:[function(require,module,exports){ -module.exports = makeSvgController -module.exports.canAttach = isSVGElement; - -function makeSvgController(svgElement, options) { - if (!isSVGElement(svgElement)) { - throw new Error('svg element is required for svg.panzoom to work') - } - - var owner = svgElement.ownerSVGElement - if (!owner) { - throw new Error( - 'Do not apply panzoom to the root element. ' + - 'Use its child instead (e.g. ). ' + - 'As of March 2016 only FireFox supported transform on the root element') - } - - if (!options.disableKeyboardInteraction) { - if (owner) owner.setAttribute('tabindex', 0); - } - - var api = { - getBBox: getBBox, - getScreenCTM: getScreenCTM, - getOwner: getOwner, - applyTransform: applyTransform, - initTransform: initTransform - } - - return api - - function getOwner() { - return owner - } - - function getBBox() { - var bbox = svgElement.getBBox() - return { - left: bbox.x, - top: bbox.y, - width: bbox.width, - height: bbox.height, - } - } - - function getScreenCTM() { - var ctm = owner.getCTM(); - if (!ctm) { - // This is likely firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=873106 - // The code below is not entirely correct, but still better than nothing - return owner.getScreenCTM(); - } - return ctm; - } - - function initTransform(transform) { - var screenCTM = svgElement.getCTM() - - // The above line returns null on Firefox - if (screenCTM === null) { - screenCTM = document.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGMatrix() - } - - transform.x = screenCTM.e; - transform.y = screenCTM.f; - transform.scale = screenCTM.a; - owner.removeAttributeNS(null, 'viewBox'); - } - - function applyTransform(transform) { - if (svgElement) svgElement.setAttribute('transform', 'matrix(' + - transform.scale + ' 0 0 ' + - transform.scale + ' ' + - transform.x + ' ' + transform.y + ')') - } -} - -function isSVGElement(element) { - return element && element.ownerSVGElement && element.getCTM; -} -},{}],6:[function(require,module,exports){ -module.exports = Transform; - -function Transform() { - this.x = 0; - this.y = 0; - this.scale = 1; -} - -},{}],7:[function(require,module,exports){ -var BezierEasing = require('bezier-easing') - -// Predefined set of animations. Similar to CSS easing functions -var animations = { - ease: BezierEasing(0.25, 0.1, 0.25, 1), - easeIn: BezierEasing(0.42, 0, 1, 1), - easeOut: BezierEasing(0, 0, 0.58, 1), - easeInOut: BezierEasing(0.42, 0, 0.58, 1), - linear: BezierEasing(0, 0, 1, 1) -} - - -module.exports = animate; -module.exports.makeAggregateRaf = makeAggregateRaf; -module.exports.sharedScheduler = makeAggregateRaf(); - - -function animate(source, target, options) { - var start = Object.create(null) - var diff = Object.create(null) - options = options || {} - // We let clients specify their own easing function - var easing = (typeof options.easing === 'function') ? options.easing : animations[options.easing] - - // if nothing is specified, default to ease (similar to CSS animations) - if (!easing) { - if (options.easing) { - console.warn('Unknown easing function in amator: ' + options.easing); - } - easing = animations.ease - } - - var step = typeof options.step === 'function' ? options.step : noop - var done = typeof options.done === 'function' ? options.done : noop - - var scheduler = getScheduler(options.scheduler) - - var keys = Object.keys(target) - keys.forEach(function(key) { - start[key] = source[key] - diff[key] = target[key] - source[key] - }) - - var durationInMs = typeof options.duration === 'number' ? options.duration : 400 - var durationInFrames = Math.max(1, durationInMs * 0.06) // 0.06 because 60 frames pers 1,000 ms - var previousAnimationId - var frame = 0 - - previousAnimationId = scheduler.next(loop) - - return { - cancel: cancel - } - - function cancel() { - scheduler.cancel(previousAnimationId) - previousAnimationId = 0 - } - - function loop() { - var t = easing(frame/durationInFrames) - frame += 1 - setValues(t) - if (frame <= durationInFrames) { - previousAnimationId = scheduler.next(loop) - step(source) - } else { - previousAnimationId = 0 - setTimeout(function() { done(source) }, 0) - } - } - - function setValues(t) { - keys.forEach(function(key) { - source[key] = diff[key] * t + start[key] - }) - } -} - -function noop() { } - -function getScheduler(scheduler) { - if (!scheduler) { - var canRaf = typeof window !== 'undefined' && window.requestAnimationFrame - return canRaf ? rafScheduler() : timeoutScheduler() - } - if (typeof scheduler.next !== 'function') throw new Error('Scheduler is supposed to have next(cb) function') - if (typeof scheduler.cancel !== 'function') throw new Error('Scheduler is supposed to have cancel(handle) function') - - return scheduler -} - -function rafScheduler() { - return { - next: window.requestAnimationFrame.bind(window), - cancel: window.cancelAnimationFrame.bind(window) - } -} - -function timeoutScheduler() { - return { - next: function(cb) { - return setTimeout(cb, 1000/60) - }, - cancel: function (id) { - return clearTimeout(id) - } - } -} - -function makeAggregateRaf() { - var frontBuffer = new Set(); - var backBuffer = new Set(); - var frameToken = 0; - - return { - next: next, - cancel: next, - clearAll: clearAll - } - - function clearAll() { - frontBuffer.clear(); - backBuffer.clear(); - cancelAnimationFrame(frameToken); - frameToken = 0; - } - - function next(callback) { - backBuffer.add(callback); - renderNextFrame(); - } - - function renderNextFrame() { - if (!frameToken) frameToken = requestAnimationFrame(renderFrame); - } - - function renderFrame() { - frameToken = 0; - - var t = backBuffer; - backBuffer = frontBuffer; - frontBuffer = t; - - frontBuffer.forEach(function(callback) { - callback(); - }); - frontBuffer.clear(); - } - - function cancel(callback) { - backBuffer.delete(callback); - } -} - -},{"bezier-easing":8}],8:[function(require,module,exports){ -/** - * https://github.com/gre/bezier-easing - * BezierEasing - use bezier curve for transition easing function - * by Gaëtan Renaudeau 2014 - 2015 – MIT License - */ - -// These values are established by empiricism with tests (tradeoff: performance VS precision) -var NEWTON_ITERATIONS = 4; -var NEWTON_MIN_SLOPE = 0.001; -var SUBDIVISION_PRECISION = 0.0000001; -var SUBDIVISION_MAX_ITERATIONS = 10; - -var kSplineTableSize = 11; -var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0); - -var float32ArraySupported = typeof Float32Array === 'function'; - -function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; } -function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; } -function C (aA1) { return 3.0 * aA1; } - -// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. -function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; } - -// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. -function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); } - -function binarySubdivide (aX, aA, aB, mX1, mX2) { - var currentX, currentT, i = 0; - do { - currentT = aA + (aB - aA) / 2.0; - currentX = calcBezier(currentT, mX1, mX2) - aX; - if (currentX > 0.0) { - aB = currentT; - } else { - aA = currentT; - } - } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); - return currentT; -} - -function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) { - for (var i = 0; i < NEWTON_ITERATIONS; ++i) { - var currentSlope = getSlope(aGuessT, mX1, mX2); - if (currentSlope === 0.0) { - return aGuessT; - } - var currentX = calcBezier(aGuessT, mX1, mX2) - aX; - aGuessT -= currentX / currentSlope; - } - return aGuessT; -} - -function LinearEasing (x) { - return x; -} - -module.exports = function bezier (mX1, mY1, mX2, mY2) { - if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) { - throw new Error('bezier x values must be in [0, 1] range'); - } - - if (mX1 === mY1 && mX2 === mY2) { - return LinearEasing; - } - - // Precompute samples table - var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize); - for (var i = 0; i < kSplineTableSize; ++i) { - sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2); - } - - function getTForX (aX) { - var intervalStart = 0.0; - var currentSample = 1; - var lastSample = kSplineTableSize - 1; - - for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) { - intervalStart += kSampleStepSize; - } - --currentSample; - - // Interpolate to provide an initial guess for t - var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]); - var guessForT = intervalStart + dist * kSampleStepSize; - - var initialSlope = getSlope(guessForT, mX1, mX2); - if (initialSlope >= NEWTON_MIN_SLOPE) { - return newtonRaphsonIterate(aX, guessForT, mX1, mX2); - } else if (initialSlope === 0.0) { - return guessForT; - } else { - return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2); - } - } - - return function BezierEasing (x) { - // Because JavaScript number are imprecise, we should guarantee the extremes are right. - if (x === 0) { - return 0; - } - if (x === 1) { - return 1; - } - return calcBezier(getTForX(x), mY1, mY2); - }; -}; - -},{}],9:[function(require,module,exports){ -module.exports = function eventify(subject) { - validateSubject(subject); - - var eventsStorage = createEventsStorage(subject); - subject.on = eventsStorage.on; - subject.off = eventsStorage.off; - subject.fire = eventsStorage.fire; - return subject; -}; - -function createEventsStorage(subject) { - // Store all event listeners to this hash. Key is event name, value is array - // of callback records. - // - // A callback record consists of callback function and its optional context: - // { 'eventName' => [{callback: function, ctx: object}] } - var registeredEvents = Object.create(null); - - return { - on: function (eventName, callback, ctx) { - if (typeof callback !== 'function') { - throw new Error('callback is expected to be a function'); - } - var handlers = registeredEvents[eventName]; - if (!handlers) { - handlers = registeredEvents[eventName] = []; - } - handlers.push({callback: callback, ctx: ctx}); - - return subject; - }, - - off: function (eventName, callback) { - var wantToRemoveAll = (typeof eventName === 'undefined'); - if (wantToRemoveAll) { - // Killing old events storage should be enough in this case: - registeredEvents = Object.create(null); - return subject; - } - - if (registeredEvents[eventName]) { - var deleteAllCallbacksForEvent = (typeof callback !== 'function'); - if (deleteAllCallbacksForEvent) { - delete registeredEvents[eventName]; - } else { - var callbacks = registeredEvents[eventName]; - for (var i = 0; i < callbacks.length; ++i) { - if (callbacks[i].callback === callback) { - callbacks.splice(i, 1); - } - } - } - } - - return subject; - }, - - fire: function (eventName) { - var callbacks = registeredEvents[eventName]; - if (!callbacks) { - return subject; - } - - var fireArguments; - if (arguments.length > 1) { - fireArguments = Array.prototype.splice.call(arguments, 1); - } - for(var i = 0; i < callbacks.length; ++i) { - var callbackInfo = callbacks[i]; - callbackInfo.callback.apply(callbackInfo.ctx, fireArguments); - } - - return subject; - } - }; -} - -function validateSubject(subject) { - if (!subject) { - throw new Error('Eventify cannot use falsy object as events subject'); - } - var reservedWords = ['on', 'fire', 'off']; - for (var i = 0; i < reservedWords.length; ++i) { - if (subject.hasOwnProperty(reservedWords[i])) { - throw new Error("Subject cannot be eventified, since it already has property '" + reservedWords[i] + "'"); - } - } -} - -},{}],10:[function(require,module,exports){ -/** - * This module used to unify mouse wheel behavior between different browsers in 2014 - * Now it's just a wrapper around addEventListener('wheel'); - * - * Usage: - * var addWheelListener = require('wheel').addWheelListener; - * var removeWheelListener = require('wheel').removeWheelListener; - * addWheelListener(domElement, function (e) { - * // mouse wheel event - * }); - * removeWheelListener(domElement, function); - */ - -module.exports = addWheelListener; - -// But also expose "advanced" api with unsubscribe: -module.exports.addWheelListener = addWheelListener; -module.exports.removeWheelListener = removeWheelListener; - -function addWheelListener(element, listener, useCapture) { - element.addEventListener('wheel', listener, useCapture); -} - -function removeWheelListener( element, listener, useCapture ) { - element.removeEventListener('wheel', listener, useCapture); -} -},{}]},{},[1])(1) -}); diff --git a/javascript/sha256.js b/javascript/sha256.js deleted file mode 100644 index b73e74324..000000000 --- a/javascript/sha256.js +++ /dev/null @@ -1,408 +0,0 @@ -// SHA-256 (+ HMAC and PBKDF2) for JavaScript. -// -// Written in 2014-2016 by Dmitry Chestnykh. -// Public domain, no warranty. -// -// Functions (accept and return Uint8Arrays): -// -// sha256(message) -> hash -// sha256.hmac(key, message) -> mac -// sha256.pbkdf2(password, salt, rounds, dkLen) -> dk -// -// Classes: -// -// new sha256.Hash() -// new sha256.HMAC(key) -// -const digestLength = 32; -const blockSize = 64; - -// SHA-256 constants - -var K = new Uint32Array([ - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, - 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, - 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, - 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, - 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, - 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, - 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, - 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, - 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, - 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 -]); -function hashBlocks(w, v, p, pos, len) { - var a, b, c, d, e, f, g, h, u, i, j, t1, t2; - while (len >= 64) { - a = v[0]; - b = v[1]; - c = v[2]; - d = v[3]; - e = v[4]; - f = v[5]; - g = v[6]; - h = v[7]; - for (i = 0; i < 16; i++) { - j = pos + i * 4; - w[i] = (((p[j] & 0xff) << 24) | ((p[j + 1] & 0xff) << 16) | - ((p[j + 2] & 0xff) << 8) | (p[j + 3] & 0xff)); - } - for (i = 16; i < 64; i++) { - u = w[i - 2]; - t1 = (u >>> 17 | u << (32 - 17)) ^ (u >>> 19 | u << (32 - 19)) ^ (u >>> 10); - u = w[i - 15]; - t2 = (u >>> 7 | u << (32 - 7)) ^ (u >>> 18 | u << (32 - 18)) ^ (u >>> 3); - w[i] = (t1 + w[i - 7] | 0) + (t2 + w[i - 16] | 0); - } - for (i = 0; i < 64; i++) { - t1 = (((((e >>> 6 | e << (32 - 6)) ^ (e >>> 11 | e << (32 - 11)) ^ - (e >>> 25 | e << (32 - 25))) + ((e & f) ^ (~e & g))) | 0) + - ((h + ((K[i] + w[i]) | 0)) | 0)) | 0; - t2 = (((a >>> 2 | a << (32 - 2)) ^ (a >>> 13 | a << (32 - 13)) ^ - (a >>> 22 | a << (32 - 22))) + ((a & b) ^ (a & c) ^ (b & c))) | 0; - h = g; - g = f; - f = e; - e = (d + t1) | 0; - d = c; - c = b; - b = a; - a = (t1 + t2) | 0; - } - v[0] += a; - v[1] += b; - v[2] += c; - v[3] += d; - v[4] += e; - v[5] += f; - v[6] += g; - v[7] += h; - pos += 64; - len -= 64; - } - return pos; -} -// Hash implements SHA256 hash algorithm. -var Hash = /** @class */ (function () { - function Hash() { - this.digestLength = digestLength; - this.blockSize = blockSize; - // Note: Int32Array is used instead of Uint32Array for performance reasons. - this.state = new Int32Array(8); // hash state - this.temp = new Int32Array(64); // temporary state - this.buffer = new Uint8Array(128); // buffer for data to hash - this.bufferLength = 0; // number of bytes in buffer - this.bytesHashed = 0; // number of total bytes hashed - this.finished = false; // indicates whether the hash was finalized - this.reset(); - } - // Resets hash state making it possible - // to re-use this instance to hash other data. - Hash.prototype.reset = function () { - this.state[0] = 0x6a09e667; - this.state[1] = 0xbb67ae85; - this.state[2] = 0x3c6ef372; - this.state[3] = 0xa54ff53a; - this.state[4] = 0x510e527f; - this.state[5] = 0x9b05688c; - this.state[6] = 0x1f83d9ab; - this.state[7] = 0x5be0cd19; - this.bufferLength = 0; - this.bytesHashed = 0; - this.finished = false; - return this; - }; - // Cleans internal buffers and re-initializes hash state. - Hash.prototype.clean = function () { - for (var i = 0; i < this.buffer.length; i++) { - this.buffer[i] = 0; - } - for (var i = 0; i < this.temp.length; i++) { - this.temp[i] = 0; - } - this.reset(); - }; - // Updates hash state with the given data. - // - // Optionally, length of the data can be specified to hash - // fewer bytes than data.length. - // - // Throws error when trying to update already finalized hash: - // instance must be reset to use it again. - Hash.prototype.update = function (data, dataLength) { - if (dataLength === void 0) { dataLength = data.length; } - if (this.finished) { - throw new Error("SHA256: can't update because hash was finished."); - } - var dataPos = 0; - this.bytesHashed += dataLength; - if (this.bufferLength > 0) { - while (this.bufferLength < 64 && dataLength > 0) { - this.buffer[this.bufferLength++] = data[dataPos++]; - dataLength--; - } - if (this.bufferLength === 64) { - hashBlocks(this.temp, this.state, this.buffer, 0, 64); - this.bufferLength = 0; - } - } - if (dataLength >= 64) { - dataPos = hashBlocks(this.temp, this.state, data, dataPos, dataLength); - dataLength %= 64; - } - while (dataLength > 0) { - this.buffer[this.bufferLength++] = data[dataPos++]; - dataLength--; - } - return this; - }; - // Finalizes hash state and puts hash into out. - // - // If hash was already finalized, puts the same value. - Hash.prototype.finish = function (out) { - if (!this.finished) { - var bytesHashed = this.bytesHashed; - var left = this.bufferLength; - var bitLenHi = (bytesHashed / 0x20000000) | 0; - var bitLenLo = bytesHashed << 3; - var padLength = (bytesHashed % 64 < 56) ? 64 : 128; - this.buffer[left] = 0x80; - for (var i = left + 1; i < padLength - 8; i++) { - this.buffer[i] = 0; - } - this.buffer[padLength - 8] = (bitLenHi >>> 24) & 0xff; - this.buffer[padLength - 7] = (bitLenHi >>> 16) & 0xff; - this.buffer[padLength - 6] = (bitLenHi >>> 8) & 0xff; - this.buffer[padLength - 5] = (bitLenHi >>> 0) & 0xff; - this.buffer[padLength - 4] = (bitLenLo >>> 24) & 0xff; - this.buffer[padLength - 3] = (bitLenLo >>> 16) & 0xff; - this.buffer[padLength - 2] = (bitLenLo >>> 8) & 0xff; - this.buffer[padLength - 1] = (bitLenLo >>> 0) & 0xff; - hashBlocks(this.temp, this.state, this.buffer, 0, padLength); - this.finished = true; - } - for (var i = 0; i < 8; i++) { - out[i * 4 + 0] = (this.state[i] >>> 24) & 0xff; - out[i * 4 + 1] = (this.state[i] >>> 16) & 0xff; - out[i * 4 + 2] = (this.state[i] >>> 8) & 0xff; - out[i * 4 + 3] = (this.state[i] >>> 0) & 0xff; - } - return this; - }; - // Returns the final hash digest. - Hash.prototype.digest = function () { - var out = new Uint8Array(this.digestLength); - this.finish(out); - return out; - }; - // Internal function for use in HMAC for optimization. - Hash.prototype._saveState = function (out) { - for (var i = 0; i < this.state.length; i++) { - out[i] = this.state[i]; - } - }; - // Internal function for use in HMAC for optimization. - Hash.prototype._restoreState = function (from, bytesHashed) { - for (var i = 0; i < this.state.length; i++) { - this.state[i] = from[i]; - } - this.bytesHashed = bytesHashed; - this.finished = false; - this.bufferLength = 0; - }; - return Hash; -}()); -window.Hash = Hash; -// HMAC implements HMAC-SHA256 message authentication algorithm. -var HMAC = /** @class */ (function () { - function HMAC(key) { - this.inner = new Hash(); - this.outer = new Hash(); - this.blockSize = this.inner.blockSize; - this.digestLength = this.inner.digestLength; - var pad = new Uint8Array(this.blockSize); - if (key.length > this.blockSize) { - (new Hash()).update(key).finish(pad).clean(); - } - else { - for (var i = 0; i < key.length; i++) { - pad[i] = key[i]; - } - } - for (var i = 0; i < pad.length; i++) { - pad[i] ^= 0x36; - } - this.inner.update(pad); - for (var i = 0; i < pad.length; i++) { - pad[i] ^= 0x36 ^ 0x5c; - } - this.outer.update(pad); - this.istate = new Uint32Array(8); - this.ostate = new Uint32Array(8); - this.inner._saveState(this.istate); - this.outer._saveState(this.ostate); - for (var i = 0; i < pad.length; i++) { - pad[i] = 0; - } - } - // Returns HMAC state to the state initialized with key - // to make it possible to run HMAC over the other data with the same - // key without creating a new instance. - HMAC.prototype.reset = function () { - this.inner._restoreState(this.istate, this.inner.blockSize); - this.outer._restoreState(this.ostate, this.outer.blockSize); - return this; - }; - // Cleans HMAC state. - HMAC.prototype.clean = function () { - for (var i = 0; i < this.istate.length; i++) { - this.ostate[i] = this.istate[i] = 0; - } - this.inner.clean(); - this.outer.clean(); - }; - // Updates state with provided data. - HMAC.prototype.update = function (data) { - this.inner.update(data); - return this; - }; - // Finalizes HMAC and puts the result in out. - HMAC.prototype.finish = function (out) { - if (this.outer.finished) { - this.outer.finish(out); - } - else { - this.inner.finish(out); - this.outer.update(out, this.digestLength).finish(out); - } - return this; - }; - // Returns message authentication code. - HMAC.prototype.digest = function () { - var out = new Uint8Array(this.digestLength); - this.finish(out); - return out; - }; - return HMAC; -}()); -window.HMAC = HMAC; -// Returns SHA256 hash of data. -function hash(data) { - var h = (new Hash()).update(data); - var digest = h.digest(); - h.clean(); - return digest; -} -window.hash = hash; -// Function hash is both available as module.hash and as default export. -// Returns HMAC-SHA256 of data under the key. -function hmac(key, data) { - var h = (new HMAC(key)).update(data); - var digest = h.digest(); - h.clean(); - return digest; -} -window.hmac = hmac; -// Fills hkdf buffer like this: -// T(1) = HMAC-Hash(PRK, T(0) | info | 0x01) -function fillBuffer(buffer, hmac, info, counter) { - // Counter is a byte value: check if it overflowed. - var num = counter[0]; - if (num === 0) { - throw new Error("hkdf: cannot expand more"); - } - // Prepare HMAC instance for new data with old key. - hmac.reset(); - // Hash in previous output if it was generated - // (i.e. counter is greater than 1). - if (num > 1) { - hmac.update(buffer); - } - // Hash in info if it exists. - if (info) { - hmac.update(info); - } - // Hash in the counter. - hmac.update(counter); - // Output result to buffer and clean HMAC instance. - hmac.finish(buffer); - // Increment counter inside typed array, this works properly. - counter[0]++; -} -var hkdfSalt = new Uint8Array(digestLength); // Filled with zeroes. -function hkdf(key, salt, info, length) { - if (salt === void 0) { salt = hkdfSalt; } - if (length === void 0) { length = 32; } - var counter = new Uint8Array([1]); - // HKDF-Extract uses salt as HMAC key, and key as data. - var okm = hmac(salt, key); - // Initialize HMAC for expanding with extracted key. - // Ensure no collisions with `hmac` function. - var hmac_ = new HMAC(okm); - // Allocate buffer. - var buffer = new Uint8Array(hmac_.digestLength); - var bufpos = buffer.length; - var out = new Uint8Array(length); - for (var i = 0; i < length; i++) { - if (bufpos === buffer.length) { - fillBuffer(buffer, hmac_, info, counter); - bufpos = 0; - } - out[i] = buffer[bufpos++]; - } - hmac_.clean(); - buffer.fill(0); - counter.fill(0); - return out; -} -window.hkdf = hkdf; -// Derives a key from password and salt using PBKDF2-HMAC-SHA256 -// with the given number of iterations. -// -// The number of bytes returned is equal to dkLen. -// -// (For better security, avoid dkLen greater than hash length - 32 bytes). -function pbkdf2(password, salt, iterations, dkLen) { - var prf = new HMAC(password); - var len = prf.digestLength; - var ctr = new Uint8Array(4); - var t = new Uint8Array(len); - var u = new Uint8Array(len); - var dk = new Uint8Array(dkLen); - for (var i = 0; i * len < dkLen; i++) { - var c = i + 1; - ctr[0] = (c >>> 24) & 0xff; - ctr[1] = (c >>> 16) & 0xff; - ctr[2] = (c >>> 8) & 0xff; - ctr[3] = (c >>> 0) & 0xff; - prf.reset(); - prf.update(salt); - prf.update(ctr); - prf.finish(u); - for (var j = 0; j < len; j++) { - t[j] = u[j]; - } - for (var j = 2; j <= iterations; j++) { - prf.reset(); - prf.update(u).finish(u); - for (var k = 0; k < len; k++) { - t[k] ^= u[k]; - } - } - for (var j = 0; j < len && i * len + j < dkLen; j++) { - dk[i * len + j] = t[j]; - } - } - for (var i = 0; i < len; i++) { - t[i] = u[i] = 0; - } - for (var i = 0; i < 4; i++) { - ctr[i] = 0; - } - prf.clean(); - return dk; -} -window.pbkdf2 = pbkdf2; diff --git a/javascript/sparkline.js b/javascript/sparkline.js deleted file mode 100644 index e227771f0..000000000 --- a/javascript/sparkline.js +++ /dev/null @@ -1,5 +0,0 @@ -/* jquery.sparkline 2.1.2 - http://omnipotent.net/jquery.sparkline/ -** Licensed under the New BSD License - see above site for details */ - -(function(a,b,c){(function(a){typeof define=="function"&&define.amd?define(["jquery"],a):jQuery&&!jQuery.fn.sparkline&&a(jQuery)})(function(d){"use strict";var e={},f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L=0;f=function(){return{common:{type:"line",lineColor:"#00f",fillColor:"#cdf",defaultPixelsPerValue:3,width:"auto",height:"auto",composite:!1,tagValuesAttribute:"values",tagOptionsPrefix:"spark",enableTagOptions:!1,enableHighlight:!0,highlightLighten:1.4,tooltipSkipNull:!0,tooltipPrefix:"",tooltipSuffix:"",disableHiddenCheck:!1,numberFormatter:!1,numberDigitGroupCount:3,numberDigitGroupSep:",",numberDecimalMark:".",disableTooltips:!1,disableInteraction:!1},line:{spotColor:"#f80",highlightSpotColor:"#5f5",highlightLineColor:"#f22",spotRadius:1.5,minSpotColor:"#f80",maxSpotColor:"#f80",lineWidth:1,normalRangeMin:c,normalRangeMax:c,normalRangeColor:"#ccc",drawNormalOnTop:!1,chartRangeMin:c,chartRangeMax:c,chartRangeMinX:c,chartRangeMaxX:c,tooltipFormat:new h(' {{prefix}}{{y}}{{suffix}}')},bar:{barColor:"#3366cc",negBarColor:"#f44",stackedBarColor:["#3366cc","#dc3912","#ff9900","#109618","#66aa00","#dd4477","#0099c6","#990099"],zeroColor:c,nullColor:c,zeroAxis:!0,barWidth:4,barSpacing:1,chartRangeMax:c,chartRangeMin:c,chartRangeClip:!1,colorMap:c,tooltipFormat:new h(' {{prefix}}{{value}}{{suffix}}')},tristate:{barWidth:4,barSpacing:1,posBarColor:"#6f6",negBarColor:"#f44",zeroBarColor:"#999",colorMap:{},tooltipFormat:new h(' {{value:map}}'),tooltipValueLookups:{map:{"-1":"Loss",0:"Draw",1:"Win"}}},discrete:{lineHeight:"auto",thresholdColor:c,thresholdValue:0,chartRangeMax:c,chartRangeMin:c,chartRangeClip:!1,tooltipFormat:new h("{{prefix}}{{value}}{{suffix}}")},bullet:{targetColor:"#f33",targetWidth:3,performanceColor:"#33f",rangeColors:["#d3dafe","#a8b6ff","#7f94ff"],base:c,tooltipFormat:new h("{{fieldkey:fields}} - {{value}}"),tooltipValueLookups:{fields:{r:"Range",p:"Performance",t:"Target"}}},pie:{offset:0,sliceColors:["#3366cc","#dc3912","#ff9900","#109618","#66aa00","#dd4477","#0099c6","#990099"],borderWidth:0,borderColor:"#000",tooltipFormat:new h(' {{value}} ({{percent.1}}%)')},box:{raw:!1,boxLineColor:"#000",boxFillColor:"#cdf",whiskerColor:"#000",outlierLineColor:"#333",outlierFillColor:"#fff",medianColor:"#f00",showOutliers:!0,outlierIQR:1.5,spotRadius:1.5,target:c,targetColor:"#4a2",chartRangeMax:c,chartRangeMin:c,tooltipFormat:new h("{{field:fields}}: {{value}}"),tooltipFormatFieldlistKey:"field",tooltipValueLookups:{fields:{lq:"Lower Quartile",med:"Median",uq:"Upper Quartile",lo:"Left Outlier",ro:"Right Outlier",lw:"Left Whisker",rw:"Right Whisker"}}}}},E='.jqstooltip { position: absolute;left: 0px;top: 0px;visibility: hidden;background: rgb(0, 0, 0) transparent;background-color: rgba(0,0,0,0.6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";color: white;font: 10px arial, san serif;text-align: left;white-space: nowrap;padding: 5px;border: 1px solid white;z-index: 10000;}.jqsfield { color: white;font: 10px arial, san serif;text-align: left;}',g=function(){var a,b;return a=function(){this.init.apply(this,arguments)},arguments.length>1?(arguments[0]?(a.prototype=d.extend(new arguments[0],arguments[arguments.length-1]),a._super=arguments[0].prototype):a.prototype=arguments[arguments.length-1],arguments.length>2&&(b=Array.prototype.slice.call(arguments,1,-1),b.unshift(a.prototype),d.extend.apply(d,b))):a.prototype=arguments[0],a.prototype.cls=a,a},d.SPFormatClass=h=g({fre:/\{\{([\w.]+?)(:(.+?))?\}\}/g,precre:/(\w+)\.(\d+)/,init:function(a,b){this.format=a,this.fclass=b},render:function(a,b,d){var e=this,f=a,g,h,i,j,k;return this.format.replace(this.fre,function(){var a;return h=arguments[1],i=arguments[3],g=e.precre.exec(h),g?(k=g[2],h=g[1]):k=!1,j=f[h],j===c?"":i&&b&&b[i]?(a=b[i],a.get?b[i].get(j)||j:b[i][j]||j):(n(j)&&(d.get("numberFormatter")?j=d.get("numberFormatter")(j):j=s(j,k,d.get("numberDigitGroupCount"),d.get("numberDigitGroupSep"),d.get("numberDecimalMark"))),j)})}}),d.spformat=function(a,b){return new h(a,b)},i=function(a,b,c){return ac?c:a},j=function(a,c){var d;return c===2?(d=b.floor(a.length/2),a.length%2?a[d]:(a[d-1]+a[d])/2):a.length%2?(d=(a.length*c+c)/4,d%1?(a[b.floor(d)]+a[b.floor(d)-1])/2:a[d-1]):(d=(a.length*c+2)/4,d%1?(a[b.floor(d)]+a[b.floor(d)-1])/2:a[d-1])},k=function(a){var b;switch(a){case"undefined":a=c;break;case"null":a=null;break;case"true":a=!0;break;case"false":a=!1;break;default:b=parseFloat(a),a==b&&(a=b)}return a},l=function(a){var b,c=[];for(b=a.length;b--;)c[b]=k(a[b]);return c},m=function(a,b){var c,d,e=[];for(c=0,d=a.length;c0;h-=c)a.splice(h,0,e);return a.join("")},o=function(a,b,c){var d;for(d=b.length;d--;){if(c&&b[d]===null)continue;if(b[d]!==a)return!1}return!0},p=function(a){var b=0,c;for(c=a.length;c--;)b+=typeof a[c]=="number"?a[c]:0;return b},r=function(a){return d.isArray(a)?a:[a]},q=function(b){var c;a.createStyleSheet?a.createStyleSheet().cssText=b:(c=a.createElement("style"),c.type="text/css",a.getElementsByTagName("head")[0].appendChild(c),c[typeof a.body.style.WebkitAppearance=="string"?"innerText":"innerHTML"]=b)},d.fn.simpledraw=function(b,e,f,g){var h,i;if(f&&(h=this.data("_jqs_vcanvas")))return h;if(d.fn.sparkline.canvas===!1)return!1;if(d.fn.sparkline.canvas===c){var j=a.createElement("canvas");if(!j.getContext||!j.getContext("2d")){if(!a.namespaces||!!a.namespaces.v)return d.fn.sparkline.canvas=!1,!1;a.namespaces.add("v","urn:schemas-microsoft-com:vml","#default#VML"),d.fn.sparkline.canvas=function(a,b,c,d){return new J(a,b,c)}}else d.fn.sparkline.canvas=function(a,b,c,d){return new I(a,b,c,d)}}return b===c&&(b=d(this).innerWidth()),e===c&&(e=d(this).innerHeight()),h=d.fn.sparkline.canvas(b,e,this,g),i=d(this).data("_jqs_mhandler"),i&&i.registerCanvas(h),h},d.fn.cleardraw=function(){var a=this.data("_jqs_vcanvas");a&&a.reset()},d.RangeMapClass=t=g({init:function(a){var b,c,d=[];for(b in a)a.hasOwnProperty(b)&&typeof b=="string"&&b.indexOf(":")>-1&&(c=b.split(":"),c[0]=c[0].length===0?-Infinity:parseFloat(c[0]),c[1]=c[1].length===0?Infinity:parseFloat(c[1]),c[2]=a[b],d.push(c));this.map=a,this.rangelist=d||!1},get:function(a){var b=this.rangelist,d,e,f;if((f=this.map[a])!==c)return f;if(b)for(d=b.length;d--;){e=b[d];if(e[0]<=a&&e[1]>=a)return e[2]}return c}}),d.range_map=function(a){return new t(a)},u=g({init:function(a,b){var c=d(a);this.$el=c,this.options=b,this.currentPageX=0,this.currentPageY=0,this.el=a,this.splist=[],this.tooltip=null,this.over=!1,this.displayTooltips=!b.get("disableTooltips"),this.highlightEnabled=!b.get("disableHighlight")},registerSparkline:function(a){this.splist.push(a),this.over&&this.updateDisplay()},registerCanvas:function(a){var b=d(a.canvas);this.canvas=a,this.$canvas=b,b.mouseenter(d.proxy(this.mouseenter,this)),b.mouseleave(d.proxy(this.mouseleave,this)),b.click(d.proxy(this.mouseclick,this))},reset:function(a){this.splist=[],this.tooltip&&a&&(this.tooltip.remove(),this.tooltip=c)},mouseclick:function(a){var b=d.Event("sparklineClick");b.originalEvent=a,b.sparklines=this.splist,this.$el.trigger(b)},mouseenter:function(b){d(a.body).unbind("mousemove.jqs"),d(a.body).bind("mousemove.jqs",d.proxy(this.mousemove,this)),this.over=!0,this.currentPageX=b.pageX,this.currentPageY=b.pageY,this.currentEl=b.target,!this.tooltip&&this.displayTooltips&&(this.tooltip=new v(this.options),this.tooltip.updatePosition(b.pageX,b.pageY)),this.updateDisplay()},mouseleave:function(){d(a.body).unbind("mousemove.jqs");var b=this.splist,c=b.length,e=!1,f,g;this.over=!1,this.currentEl=null,this.tooltip&&(this.tooltip.remove(),this.tooltip=null);for(g=0;g

eVz9ZJfwiRTX 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 KqzWYreEtWwUdU_! diff --git a/installer.py b/installer.py index cfc0f27f4..751d3f870 100644 --- a/installer.py +++ b/installer.py @@ -322,7 +322,7 @@ def git(arg: str, folder: str | None= None, ignore: bool = False, optional: bool elif "no submodule mapping found" in txt: log.warning(f'Git: folder="{folder}" submodules changed') elif 'or stash them' in txt: - log.error(f'Git: folder="{folder}" local changes detected') + log.warning(f'Git: folder="{folder}" local changes detected') else: log.error(f'Git: folder="{folder}" arg="{arg}" output={txt}') errors.append(f'git: {folder}') diff --git a/javascript/authWrap.js b/javascript/authWrap.js deleted file mode 100644 index 479403426..000000000 --- a/javascript/authWrap.js +++ /dev/null @@ -1,34 +0,0 @@ -let user; -let token; - -async function getToken() { - if (token === undefined || user === undefined) { - const res = await fetch(`${window.subpath}/token`); - if (res.ok) { - const data = await res.json(); - user = data.user; - token = data.token; - log('getToken', user); - } - } - return { user, token }; -} - -async function authFetch(url, options = {}) { - await getToken(); - if (user && token) { - if (!options.headers) options.headers = {}; - const encoded = btoa(`${user}:${token}`); - options.headers.Authorization = `Basic ${encoded}`; - } - let res; - try { - res = await fetch(url, options); - if (!res.ok) error('fetch', { status: res?.status || 503, url, user, token }); - } catch (err) { - if (ConnectionMonitorState.online) { - error('fetch', { status: res?.status || 503, url, user, token, error: err }); - } - } - return res; -} diff --git a/javascript/docs.js b/javascript/docs.js deleted file mode 100644 index d94068b28..000000000 --- a/javascript/docs.js +++ /dev/null @@ -1,24 +0,0 @@ -let lastGitHubSearch = ''; -let lastDocsSearch = ''; - -async function clickGitHubWikiPage(page) { - log(`clickGitHubWikiPage: page="${page}"`); - lastGitHubSearch = page; - const el = gradioApp().getElementById('github_md_btn'); - if (el) el.click(); -} - -function getGitHubWikiPage() { - return lastGitHubSearch; -} - -async function clickDocsPage(page) { - log(`clickDocsPage: page="${page}"`); - lastDocsSearch = page; - const el = gradioApp().getElementById('docs_md_btn'); - if (el) el.click(); -} - -function getDocsPage() { - return lastDocsSearch; -} diff --git a/javascript/exifr.js b/javascript/exifr.js deleted file mode 100644 index f97bca6ba..000000000 --- a/javascript/exifr.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define("exifr",["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).exifr={})}(this,(function(e){"use strict";var t="undefined"!=typeof self?self:global;const i="undefined"!=typeof navigator,n=i&&"undefined"==typeof HTMLImageElement,s=!("undefined"==typeof global||"undefined"==typeof process||!process.versions||!process.versions.node),r=t.Buffer,a=t.BigInt,o=!!r,l=e=>e;function h(e,t=l){if(s)try{return"function"==typeof require?Promise.resolve(t(require(e))):import(/* webpackIgnore: true */ e).then(t)}catch(t){console.warn(`Couldn't load ${e}`)}}let u=t.fetch;const c=e=>u=e;if(!t.fetch){const e=h("http",(e=>e)),t=h("https",(e=>e)),i=(n,{headers:s}={})=>new Promise((async(r,a)=>{let{port:o,hostname:l,pathname:h,protocol:u,search:c}=new URL(n);const f={method:"GET",hostname:l,path:encodeURI(h)+c,headers:s};""!==o&&(f.port=Number(o));const d=("https:"===u?await t:await e).request(f,(e=>{if(301===e.statusCode||302===e.statusCode){let t=new URL(e.headers.location,n).toString();return i(t,{headers:s}).then(r).catch(a)}r({status:e.statusCode,arrayBuffer:()=>new Promise((t=>{let i=[];e.on("data",(e=>i.push(e))),e.on("end",(()=>t(Buffer.concat(i))))}))})}));d.on("error",a),d.end()}));c(i)}function f(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}const d=e=>g(e)?void 0:e,p=e=>void 0!==e;function g(e){return void 0===e||(e instanceof Map?0===e.size:0===Object.values(e).filter(p).length)}function m(e){let t=new Error(e);throw delete t.stack,t}function S(e){return""===(e=function(e){for(;e.endsWith("\0");)e=e.slice(0,-1);return e}(e).trim())?void 0:e}function C(e){let t=function(e){let t=0;return e.ifd0.enabled&&(t+=1024),e.exif.enabled&&(t+=2048),e.makerNote&&(t+=2048),e.userComment&&(t+=1024),e.gps.enabled&&(t+=512),e.interop.enabled&&(t+=100),e.ifd1.enabled&&(t+=1024),t+2048}(e);return e.jfif.enabled&&(t+=50),e.xmp.enabled&&(t+=2e4),e.iptc.enabled&&(t+=14e3),e.icc.enabled&&(t+=6e3),t}const y=e=>String.fromCharCode.apply(null,e),b="undefined"!=typeof TextDecoder?new TextDecoder("utf-8"):void 0;function P(e){return b?b.decode(e):o?Buffer.from(e).toString("utf8"):decodeURIComponent(escape(y(e)))}class I{static from(e,t){return e instanceof this&&e.le===t?e:new I(e,void 0,void 0,t)}constructor(e,t=0,i,n){if("boolean"==typeof n&&(this.le=n),Array.isArray(e)&&(e=new Uint8Array(e)),0===e)this.byteOffset=0,this.byteLength=0;else if(e instanceof ArrayBuffer){void 0===i&&(i=e.byteLength-t);let n=new DataView(e,t,i);this._swapDataView(n)}else if(e instanceof Uint8Array||e instanceof DataView||e instanceof I){void 0===i&&(i=e.byteLength-t),(t+=e.byteOffset)+i>e.byteOffset+e.byteLength&&m("Creating view outside of available memory in ArrayBuffer");let n=new DataView(e.buffer,t,i);this._swapDataView(n)}else if("number"==typeof e){let t=new DataView(new ArrayBuffer(e));this._swapDataView(t)}else m("Invalid input argument for BufferView: "+e)}_swapArrayBuffer(e){this._swapDataView(new DataView(e))}_swapBuffer(e){this._swapDataView(new DataView(e.buffer,e.byteOffset,e.byteLength))}_swapDataView(e){this.dataView=e,this.buffer=e.buffer,this.byteOffset=e.byteOffset,this.byteLength=e.byteLength}_lengthToEnd(e){return this.byteLength-e}set(e,t,i=I){return e instanceof DataView||e instanceof I?e=new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Uint8Array||m("BufferView.set(): Invalid data argument."),this.toUint8().set(e,t),new i(this,t,e.byteLength)}subarray(e,t){return t=t||this._lengthToEnd(e),new I(this,e,t)}toUint8(){return new Uint8Array(this.buffer,this.byteOffset,this.byteLength)}getUint8Array(e,t){return new Uint8Array(this.buffer,this.byteOffset+e,t)}getString(e=0,t=this.byteLength){return P(this.getUint8Array(e,t))}getLatin1String(e=0,t=this.byteLength){let i=this.getUint8Array(e,t);return y(i)}getUnicodeString(e=0,t=this.byteLength){const i=[];for(let n=0;n1e4?R(e,t,"base64"):s&&e.includes("://")?M(e,t,"url",L):s?R(e,t,"fs"):i?M(e,t,"url",L):void m(O);var n}async function M(e,t,i,n){return D.has(i)?R(e,t,i):n?async function(e,t){let i=await t(e);return new I(i)}(e,n):void m(`Parser ${i} is not loaded`)}async function R(e,t,i){let n=new(D.get(i))(e,t);return await n.read(),n}const L=e=>u(e).then((e=>e.arrayBuffer())),U=e=>new Promise(((t,i)=>{let n=new FileReader;n.onloadend=()=>t(n.result||new ArrayBuffer),n.onerror=i,n.readAsArrayBuffer(e)}));class F extends Map{get tagKeys(){return this.allKeys||(this.allKeys=Array.from(this.keys())),this.allKeys}get tagValues(){return this.allValues||(this.allValues=Array.from(this.values())),this.allValues}}function B(e,t,i){let n=new F;for(let[e,t]of i)n.set(e,t);if(Array.isArray(t))for(let i of t)e.set(i,n);else e.set(t,n);return n}function E(e,t,i){let n,s=e.get(t);for(n of i)s.set(n[0],n[1])}const N=new Map,G=new Map,V=new Map,z=37500,H=37510,j=700,W=33723,K=34675,X=34665,_=34853,Y=40965,$=["chunked","firstChunkSize","firstChunkSizeNode","firstChunkSizeBrowser","chunkSize","chunkLimit"],J=["jfif","xmp","icc","iptc","ihdr"],q=["tiff",...J],Q=["ifd0","ifd1","exif","gps","interop"],Z=[...q,...Q],ee=["makerNote","userComment"],te=["translateKeys","translateValues","reviveValues","multiSegment"],ie=[...te,"sanitize","mergeOutput","silentErrors"];class ne{get translate(){return this.translateKeys||this.translateValues||this.reviveValues}}class se extends ne{get needed(){return this.enabled||this.deps.size>0}constructor(e,t,i,n){if(super(),f(this,"enabled",!1),f(this,"skip",new Set),f(this,"pick",new Set),f(this,"deps",new Set),f(this,"translateKeys",!1),f(this,"translateValues",!1),f(this,"reviveValues",!1),this.key=e,this.enabled=t,this.parse=this.enabled,this.applyInheritables(n),this.canBeFiltered=Q.includes(e),this.canBeFiltered&&(this.dict=N.get(e)),void 0!==i)if(Array.isArray(i))this.parse=this.enabled=!0,this.canBeFiltered&&i.length>0&&this.translateTagSet(i,this.pick);else if("object"==typeof i){if(this.enabled=!0,this.parse=!1!==i.parse,this.canBeFiltered){let{pick:e,skip:t}=i;e&&e.length>0&&this.translateTagSet(e,this.pick),t&&t.length>0&&this.translateTagSet(t,this.skip)}this.applyInheritables(i)}else!0===i||!1===i?this.parse=this.enabled=i:m(`Invalid options argument: ${i}`)}applyInheritables(e){let t,i;for(t of te)i=e[t],void 0!==i&&(this[t]=i)}translateTagSet(e,t){if(this.dict){let i,n,{tagKeys:s,tagValues:r}=this.dict;for(i of e)"string"==typeof i?(n=r.indexOf(i),-1===n&&(n=s.indexOf(Number(i))),-1!==n&&t.add(Number(s[n]))):t.add(i)}else for(let i of e)t.add(i)}finalizeFilters(){!this.enabled&&this.deps.size>0?(this.enabled=!0,ue(this.pick,this.deps)):this.enabled&&this.pick.size>0&&ue(this.pick,this.deps)}}var re={jfif:!1,tiff:!0,xmp:!1,icc:!1,iptc:!1,ifd0:!0,ifd1:!1,exif:!0,gps:!0,interop:!1,ihdr:void 0,makerNote:!1,userComment:!1,multiSegment:!1,skip:[],pick:[],translateKeys:!0,translateValues:!0,reviveValues:!0,sanitize:!0,mergeOutput:!0,silentErrors:!0,chunked:!0,firstChunkSize:void 0,firstChunkSizeNode:512,firstChunkSizeBrowser:65536,chunkSize:65536,chunkLimit:5},ae=new Map;class oe extends ne{static useCached(e){let t=ae.get(e);return void 0!==t||(t=new this(e),ae.set(e,t)),t}constructor(e){super(),!0===e?this.setupFromTrue():void 0===e?this.setupFromUndefined():Array.isArray(e)?this.setupFromArray(e):"object"==typeof e?this.setupFromObject(e):m(`Invalid options argument ${e}`),void 0===this.firstChunkSize&&(this.firstChunkSize=i?this.firstChunkSizeBrowser:this.firstChunkSizeNode),this.mergeOutput&&(this.ifd1.enabled=!1),this.filterNestedSegmentTags(),this.traverseTiffDependencyTree(),this.checkLoadedPlugins()}setupFromUndefined(){let e;for(e of $)this[e]=re[e];for(e of ie)this[e]=re[e];for(e of ee)this[e]=re[e];for(e of Z)this[e]=new se(e,re[e],void 0,this)}setupFromTrue(){let e;for(e of $)this[e]=re[e];for(e of ie)this[e]=re[e];for(e of ee)this[e]=!0;for(e of Z)this[e]=new se(e,!0,void 0,this)}setupFromArray(e){let t;for(t of $)this[t]=re[t];for(t of ie)this[t]=re[t];for(t of ee)this[t]=re[t];for(t of Z)this[t]=new se(t,!1,void 0,this);this.setupGlobalFilters(e,void 0,Q)}setupFromObject(e){let t;for(t of(Q.ifd0=Q.ifd0||Q.image,Q.ifd1=Q.ifd1||Q.thumbnail,Object.assign(this,e),$))this[t]=he(e[t],re[t]);for(t of ie)this[t]=he(e[t],re[t]);for(t of ee)this[t]=he(e[t],re[t]);for(t of q)this[t]=new se(t,re[t],e[t],this);for(t of Q)this[t]=new se(t,re[t],e[t],this.tiff);this.setupGlobalFilters(e.pick,e.skip,Q,Z),!0===e.tiff?this.batchEnableWithBool(Q,!0):!1===e.tiff?this.batchEnableWithUserValue(Q,e):Array.isArray(e.tiff)?this.setupGlobalFilters(e.tiff,void 0,Q):"object"==typeof e.tiff&&this.setupGlobalFilters(e.tiff.pick,e.tiff.skip,Q)}batchEnableWithBool(e,t){for(let i of e)this[i].enabled=t}batchEnableWithUserValue(e,t){for(let i of e){let e=t[i];this[i].enabled=!1!==e&&void 0!==e}}setupGlobalFilters(e,t,i,n=i){if(e&&e.length){for(let e of n)this[e].enabled=!1;let t=le(e,i);for(let[e,i]of t)ue(this[e].pick,i),this[e].enabled=!0}else if(t&&t.length){let e=le(t,i);for(let[t,i]of e)ue(this[t].skip,i)}}filterNestedSegmentTags(){let{ifd0:e,exif:t,xmp:i,iptc:n,icc:s}=this;this.makerNote?t.deps.add(z):t.skip.add(z),this.userComment?t.deps.add(H):t.skip.add(H),i.enabled||e.skip.add(j),n.enabled||e.skip.add(W),s.enabled||e.skip.add(K)}traverseTiffDependencyTree(){let{ifd0:e,exif:t,gps:i,interop:n}=this;n.needed&&(t.deps.add(Y),e.deps.add(Y)),t.needed&&e.deps.add(X),i.needed&&e.deps.add(_),this.tiff.enabled=Q.some((e=>!0===this[e].enabled))||this.makerNote||this.userComment;for(let e of Q)this[e].finalizeFilters()}get onlyTiff(){return!J.map((e=>this[e].enabled)).some((e=>!0===e))&&this.tiff.enabled}checkLoadedPlugins(){for(let e of q)this[e].enabled&&!A.has(e)&&k("segment parser",e)}}function le(e,t){let i,n,s,r,a=[];for(s of t){for(r of(i=N.get(s),n=[],i))(e.includes(r[0])||e.includes(r[1]))&&n.push(r[0]);n.length&&a.push([s,n])}return a}function he(e,t){return void 0!==e?e:void 0!==t?t:void 0}function ue(e,t){for(let i of t)e.add(i)}f(oe,"default",re);class ce{constructor(e){f(this,"parsers",{}),f(this,"output",{}),f(this,"errors",[]),f(this,"pushToErrors",(e=>this.errors.push(e))),this.options=oe.useCached(e)}async read(e){this.file=await x(e,this.options)}setup(){if(this.fileParser)return;let{file:e}=this,t=e.getUint16(0);for(let[i,n]of T)if(n.canHandle(e,t))return this.fileParser=new n(this.options,this.file,this.parsers),e[i]=!0;this.file.close&&this.file.close(),m("Unknown file format")}async parse(){let{output:e,errors:t}=this;return this.setup(),this.options.silentErrors?(await this.executeParsers().catch(this.pushToErrors),t.push(...this.fileParser.errors)):await this.executeParsers(),this.file.close&&this.file.close(),this.options.silentErrors&&t.length>0&&(e.errors=t),d(e)}async executeParsers(){let{output:e}=this;await this.fileParser.parse();let t=Object.values(this.parsers).map((async t=>{let i=await t.parse();t.assignToOutput(e,i)}));this.options.silentErrors&&(t=t.map((e=>e.catch(this.pushToErrors)))),await Promise.all(t)}async extractThumbnail(){this.setup();let{options:e,file:t}=this,i=A.get("tiff",e);var n;if(t.tiff?n={start:0,type:"tiff"}:t.jpeg&&(n=await this.fileParser.getOrFindSegment("tiff")),void 0===n)return;let s=await this.fileParser.ensureSegmentChunk(n),r=this.parsers.tiff=new i(s,e,t),a=await r.extractThumbnail();return t.close&&t.close(),a}}async function fe(e,t){let i=new ce(t);return await i.read(e),i.parse()}var de=Object.freeze({__proto__:null,parse:fe,Exifr:ce,fileParsers:T,segmentParsers:A,fileReaders:D,tagKeys:N,tagValues:G,tagRevivers:V,createDictionary:B,extendDictionary:E,fetchUrlAsArrayBuffer:L,readBlobAsArrayBuffer:U,chunkedProps:$,otherSegments:J,segments:q,tiffBlocks:Q,segmentsAndBlocks:Z,tiffExtractables:ee,inheritables:te,allFormatters:ie,Options:oe});class pe{constructor(e,t,i){f(this,"errors",[]),f(this,"ensureSegmentChunk",(async e=>{let t=e.start,i=e.size||65536;if(this.file.chunked)if(this.file.available(t,i))e.chunk=this.file.subarray(t,i);else try{e.chunk=await this.file.readChunk(t,i)}catch(t){m(`Couldn't read segment: ${JSON.stringify(e)}. ${t.message}`)}else this.file.byteLength>t+i?e.chunk=this.file.subarray(t,i):void 0===e.size?e.chunk=this.file.subarray(t):m("Segment unreachable: "+JSON.stringify(e));return e.chunk})),this.extendOptions&&this.extendOptions(e),this.options=e,this.file=t,this.parsers=i}injectSegment(e,t){this.options[e].enabled&&this.createParser(e,t)}createParser(e,t){let i=new(A.get(e))(t,this.options,this.file);return this.parsers[e]=i}createParsers(e){for(let t of e){let{type:e,chunk:i}=t,n=this.options[e];if(n&&n.enabled){let t=this.parsers[e];t&&t.append||t||this.createParser(e,i)}}}async readSegments(e){let t=e.map(this.ensureSegmentChunk);await Promise.all(t)}}class ge{static findPosition(e,t){let i=e.getUint16(t+2)+2,n="function"==typeof this.headerLength?this.headerLength(e,t,i):this.headerLength,s=t+n,r=i-n;return{offset:t,length:i,headerLength:n,start:s,size:r,end:s+r}}static parse(e,t={}){return new this(e,new oe({[this.type]:t}),e).parse()}normalizeInput(e){return e instanceof I?e:new I(e)}constructor(e,t={},i){f(this,"errors",[]),f(this,"raw",new Map),f(this,"handleError",(e=>{if(!this.options.silentErrors)throw e;this.errors.push(e.message)})),this.chunk=this.normalizeInput(e),this.file=i,this.type=this.constructor.type,this.globalOptions=this.options=t,this.localOptions=t[this.type],this.canTranslate=this.localOptions&&this.localOptions.translate}translate(){this.canTranslate&&(this.translated=this.translateBlock(this.raw,this.type))}get output(){return this.translated?this.translated:this.raw?Object.fromEntries(this.raw):void 0}translateBlock(e,t){let i=V.get(t),n=G.get(t),s=N.get(t),r=this.options[t],a=r.reviveValues&&!!i,o=r.translateValues&&!!n,l=r.translateKeys&&!!s,h={};for(let[t,r]of e)a&&i.has(t)?r=i.get(t)(r):o&&n.has(t)&&(r=this.translateValue(r,n.get(t))),l&&s.has(t)&&(t=s.get(t)||t),h[t]=r;return h}translateValue(e,t){return t[e]||t.DEFAULT||e}assignToOutput(e,t){this.assignObjectToOutput(e,this.constructor.type,t)}assignObjectToOutput(e,t,i){if(this.globalOptions.mergeOutput)return Object.assign(e,i);e[t]?Object.assign(e[t],i):e[t]=i}}f(ge,"headerLength",4),f(ge,"type",void 0),f(ge,"multiSegment",!1),f(ge,"canHandle",(()=>!1));function me(e){return 192===e||194===e||196===e||219===e||221===e||218===e||254===e}function Se(e){return e>=224&&e<=239}function Ce(e,t,i){for(let[n,s]of A)if(s.canHandle(e,t,i))return n}class ye extends pe{constructor(...e){super(...e),f(this,"appSegments",[]),f(this,"jpegSegments",[]),f(this,"unknownSegments",[])}static canHandle(e,t){return 65496===t}async parse(){await this.findAppSegments(),await this.readSegments(this.appSegments),this.mergeMultiSegments(),this.createParsers(this.mergedAppSegments||this.appSegments)}setupSegmentFinderArgs(e){!0===e?(this.findAll=!0,this.wanted=new Set(A.keyList())):(e=void 0===e?A.keyList().filter((e=>this.options[e].enabled)):e.filter((e=>this.options[e].enabled&&A.has(e))),this.findAll=!1,this.remaining=new Set(e),this.wanted=new Set(e)),this.unfinishedMultiSegment=!1}async findAppSegments(e=0,t){this.setupSegmentFinderArgs(t);let{file:i,findAll:n,wanted:s,remaining:r}=this;if(!n&&this.file.chunked&&(n=Array.from(s).some((e=>{let t=A.get(e),i=this.options[e];return t.multiSegment&&i.multiSegment})),n&&await this.file.readWhole()),e=this.findAppSegmentsInRange(e,i.byteLength),!this.options.onlyTiff&&i.chunked){let t=!1;for(;r.size>0&&!t&&(i.canReadNextChunk||this.unfinishedMultiSegment);){let{nextChunkOffset:n}=i,s=this.appSegments.some((e=>!this.file.available(e.offset||e.start,e.length||e.size)));if(t=e>n&&!s?!await i.readNextChunk(e):!await i.readNextChunk(n),void 0===(e=this.findAppSegmentsInRange(e,i.byteLength)))return}}}findAppSegmentsInRange(e,t){t-=2;let i,n,s,r,a,o,{file:l,findAll:h,wanted:u,remaining:c,options:f}=this;for(;ee.multiSegment)))return;let e=function(e,t){let i,n,s,r=new Map;for(let a=0;a{let i=A.get(e,this.options);if(i.handleMultiSegments){return{type:e,chunk:i.handleMultiSegments(t)}}return t[0]}))}getSegment(e){return this.appSegments.find((t=>t.type===e))}async getOrFindSegment(e){let t=this.getSegment(e);return void 0===t&&(await this.findAppSegments(0,[e]),t=this.getSegment(e)),t}}f(ye,"type","jpeg"),T.set("jpeg",ye);const be=[void 0,1,1,2,4,8,1,1,2,4,8,4,8,4];class Pe extends ge{parseHeader(){var e=this.chunk.getUint16();18761===e?this.le=!0:19789===e&&(this.le=!1),this.chunk.le=this.le,this.headerParsed=!0}parseTags(e,t,i=new Map){let{pick:n,skip:s}=this.options[t];n=new Set(n);let r=n.size>0,a=0===s.size,o=this.chunk.getUint16(e);e+=2;for(let l=0;l13)&&m(`Invalid TIFF value type. block: ${i.toUpperCase()}, tag: ${t.toString(16)}, type: ${s}, offset ${e}`),e>n.byteLength&&m(`Invalid TIFF value offset. block: ${i.toUpperCase()}, tag: ${t.toString(16)}, type: ${s}, offset ${e} is outside of chunk size ${n.byteLength}`),1===s)return n.getUint8Array(e,r);if(2===s)return S(n.getString(e,r));if(7===s)return n.getUint8Array(e,r);if(1===r)return this.parseTagValue(s,e);{let t=new(function(e){switch(e){case 1:return Uint8Array;case 3:return Uint16Array;case 4:return Uint32Array;case 5:return Array;case 6:return Int8Array;case 8:return Int16Array;case 9:return Int32Array;case 10:return Array;case 11:return Float32Array;case 12:return Float64Array;default:return Array}}(s))(r),i=a;for(let n=0;ne.byteLength&&m(`IFD0 offset points to outside of file.\nthis.ifd0Offset: ${this.ifd0Offset}, file.byteLength: ${e.byteLength}`),e.tiff&&await e.ensureChunk(this.ifd0Offset,C(this.options));let t=this.parseBlock(this.ifd0Offset,"ifd0");return 0!==t.size?(this.exifOffset=t.get(X),this.interopOffset=t.get(Y),this.gpsOffset=t.get(_),this.xmp=t.get(j),this.iptc=t.get(W),this.icc=t.get(K),this.options.sanitize&&(t.delete(X),t.delete(Y),t.delete(_),t.delete(j),t.delete(W),t.delete(K)),t):void 0}async parseExifBlock(){if(this.exif)return;if(this.ifd0||await this.parseIfd0Block(),void 0===this.exifOffset)return;this.file.tiff&&await this.file.ensureChunk(this.exifOffset,C(this.options));let e=this.parseBlock(this.exifOffset,"exif");return this.interopOffset||(this.interopOffset=e.get(Y)),this.makerNote=e.get(z),this.userComment=e.get(H),this.options.sanitize&&(e.delete(Y),e.delete(z),e.delete(H)),this.unpack(e,41728),this.unpack(e,41729),e}unpack(e,t){let i=e.get(t);i&&1===i.length&&e.set(t,i[0])}async parseGpsBlock(){if(this.gps)return;if(this.ifd0||await this.parseIfd0Block(),void 0===this.gpsOffset)return;let e=this.parseBlock(this.gpsOffset,"gps");return e&&e.has(2)&&e.has(4)&&(e.set("latitude",ke(...e.get(2),e.get(1))),e.set("longitude",ke(...e.get(4),e.get(3)))),e}async parseInteropBlock(){if(!this.interop&&(this.ifd0||await this.parseIfd0Block(),void 0!==this.interopOffset||this.exif||await this.parseExifBlock(),void 0!==this.interopOffset))return this.parseBlock(this.interopOffset,"interop")}async parseThumbnailBlock(e=!1){if(!this.ifd1&&!this.ifd1Parsed&&(!this.options.mergeOutput||e))return this.findIfd1Offset(),this.ifd1Offset>0&&(this.parseBlock(this.ifd1Offset,"ifd1"),this.ifd1Parsed=!0),this.ifd1}async extractThumbnail(){if(this.headerParsed||this.parseHeader(),this.ifd1Parsed||await this.parseThumbnailBlock(!0),void 0===this.ifd1)return;let e=this.ifd1.get(513),t=this.ifd1.get(514);return this.chunk.getUint8Array(e,t)}get image(){return this.ifd0}get thumbnail(){return this.ifd1}createOutput(){let e,t,i,n={};for(t of Q)if(e=this[t],!g(e))if(i=this.canTranslate?this.translateBlock(e,t):Object.fromEntries(e),this.options.mergeOutput){if("ifd1"===t)continue;Object.assign(n,i)}else n[t]=i;return this.makerNote&&(n.makerNote=this.makerNote),this.userComment&&(n.userComment=this.userComment),n}assignToOutput(e,t){if(this.globalOptions.mergeOutput)Object.assign(e,t);else for(let[i,n]of Object.entries(t))this.assignObjectToOutput(e,i,n)}}function ke(e,t,i,n){var s=e+t/60+i/3600;return"S"!==n&&"W"!==n||(s*=-1),s}f(Ie,"type","tiff"),f(Ie,"headerLength",10),A.set("tiff",Ie);var we=Object.freeze({__proto__:null,default:de,Exifr:ce,fileParsers:T,segmentParsers:A,fileReaders:D,tagKeys:N,tagValues:G,tagRevivers:V,createDictionary:B,extendDictionary:E,fetchUrlAsArrayBuffer:L,readBlobAsArrayBuffer:U,chunkedProps:$,otherSegments:J,segments:q,tiffBlocks:Q,segmentsAndBlocks:Z,tiffExtractables:ee,inheritables:te,allFormatters:ie,Options:oe,parse:fe});const Te={ifd0:!1,ifd1:!1,exif:!1,gps:!1,interop:!1,sanitize:!1,reviveValues:!0,translateKeys:!1,translateValues:!1,mergeOutput:!1},Ae=Object.assign({},Te,{firstChunkSize:4e4,gps:[1,2,3,4]});async function De(e){let t=new ce(Ae);await t.read(e);let i=await t.parse();if(i&&i.gps){let{latitude:e,longitude:t}=i.gps;return{latitude:e,longitude:t}}}const Oe=Object.assign({},Te,{tiff:!1,ifd1:!0,mergeOutput:!1});async function xe(e){let t=new ce(Oe);await t.read(e);let i=await t.extractThumbnail();return i&&o?r.from(i):i}async function ve(e){let t=await this.thumbnail(e);if(void 0!==t){let e=new Blob([t]);return URL.createObjectURL(e)}}const Me=Object.assign({},Te,{firstChunkSize:4e4,ifd0:[274]});async function Re(e){let t=new ce(Me);await t.read(e);let i=await t.parse();if(i&&i.ifd0)return i.ifd0[274]}const Le=Object.freeze({1:{dimensionSwapped:!1,scaleX:1,scaleY:1,deg:0,rad:0},2:{dimensionSwapped:!1,scaleX:-1,scaleY:1,deg:0,rad:0},3:{dimensionSwapped:!1,scaleX:1,scaleY:1,deg:180,rad:180*Math.PI/180},4:{dimensionSwapped:!1,scaleX:-1,scaleY:1,deg:180,rad:180*Math.PI/180},5:{dimensionSwapped:!0,scaleX:1,scaleY:-1,deg:90,rad:90*Math.PI/180},6:{dimensionSwapped:!0,scaleX:1,scaleY:1,deg:90,rad:90*Math.PI/180},7:{dimensionSwapped:!0,scaleX:1,scaleY:-1,deg:270,rad:270*Math.PI/180},8:{dimensionSwapped:!0,scaleX:1,scaleY:1,deg:270,rad:270*Math.PI/180}});if(e.rotateCanvas=!0,e.rotateCss=!0,"object"==typeof navigator){let t=navigator.userAgent;if(t.includes("iPad")||t.includes("iPhone")){let i=t.match(/OS (\d+)_(\d+)/);if(i){let[,t,n]=i,s=Number(t)+.1*Number(n);e.rotateCanvas=s<13.4,e.rotateCss=!1}}else if(t.includes("OS X 10")){let[,i]=t.match(/OS X 10[_.](\d+)/);e.rotateCanvas=e.rotateCss=Number(i)<15}if(t.includes("Chrome/")){let[,i]=t.match(/Chrome\/(\d+)/);e.rotateCanvas=e.rotateCss=Number(i)<81}else if(t.includes("Firefox/")){let[,i]=t.match(/Firefox\/(\d+)/);e.rotateCanvas=e.rotateCss=Number(i)<77}}async function Ue(t){let i=await Re(t);return Object.assign({canvas:e.rotateCanvas,css:e.rotateCss},Le[i])}class Fe extends I{constructor(...e){super(...e),f(this,"ranges",new Be),0!==this.byteLength&&this.ranges.add(0,this.byteLength)}_tryExtend(e,t,i){if(0===e&&0===this.byteLength&&i){let e=new DataView(i.buffer||i,i.byteOffset,i.byteLength);this._swapDataView(e)}else{let i=e+t;if(i>this.byteLength){let{dataView:e}=this._extend(i);this._swapDataView(e)}}}_extend(e){let t;t=o?r.allocUnsafe(e):new Uint8Array(e);let i=new DataView(t.buffer,t.byteOffset,t.byteLength);return t.set(new Uint8Array(this.buffer,this.byteOffset,this.byteLength),0),{uintView:t,dataView:i}}subarray(e,t,i=!1){return t=t||this._lengthToEnd(e),i&&this._tryExtend(e,t),this.ranges.add(e,t),super.subarray(e,t)}set(e,t,i=!1){i&&this._tryExtend(t,e.byteLength,e);let n=super.set(e,t);return this.ranges.add(t,n.byteLength),n}async ensureChunk(e,t){this.chunked&&(this.ranges.available(e,t)||await this.readChunk(e,t))}available(e,t){return this.ranges.available(e,t)}}class Be{constructor(){f(this,"list",[])}get length(){return this.list.length}add(e,t,i=0){let n=e+t,s=this.list.filter((t=>Ee(e,t.offset,n)||Ee(e,t.end,n)));if(s.length>0){e=Math.min(e,...s.map((e=>e.offset))),n=Math.max(n,...s.map((e=>e.end))),t=n-e;let i=s.shift();i.offset=e,i.length=t,i.end=n,this.list=this.list.filter((e=>!s.includes(e)))}else this.list.push({offset:e,length:t,end:n})}available(e,t){let i=e+t;return this.list.some((t=>t.offset<=e&&i<=t.end))}}function Ee(e,t,i){return e<=t&&t<=i}class Ne extends Fe{constructor(e,t){super(0),f(this,"chunksRead",0),this.input=e,this.options=t}async readWhole(){this.chunked=!1,await this.readChunk(this.nextChunkOffset)}async readChunked(){this.chunked=!0,await this.readChunk(0,this.options.firstChunkSize)}async readNextChunk(e=this.nextChunkOffset){if(this.fullyRead)return this.chunksRead++,!1;let t=this.options.chunkSize,i=await this.readChunk(e,t);return!!i&&i.byteLength===t}async readChunk(e,t){if(this.chunksRead++,0!==(t=this.safeWrapAddress(e,t)))return this._readChunk(e,t)}safeWrapAddress(e,t){return void 0!==this.size&&e+t>this.size?Math.max(0,this.size-e):t}get nextChunkOffset(){if(0!==this.ranges.list.length)return this.ranges.list[0].length}get canReadNextChunk(){return this.chunksReade.kind===t))}parseBoxHead(e){let t=this.file.getUint32(e),i=this.file.getString(e+4,4),n=e+8;return 1===t&&(t=this.file.getUint64(e+8),n+=8),{offset:e,length:t,kind:i,start:n}}parseBoxFullHead(e){if(void 0!==e.version)return;let t=this.file.getUint32(e.start);e.version=t>>24,e.start+=4}}class ze extends Ve{static canHandle(e,t){if(0!==t)return!1;let i=e.getUint16(2);if(i>50)return!1;let n=16,s=[];for(;n=2&&(n=3===t.version?4:2,s=this.file.getString(i+n+2,4),"Exif"===s))return this.file.getUintBytes(i,n);r+=t.length}}get8bits(e){let t=this.file.getUint8(e);return[t>>4,15&t]}findExtentInIloc(e,t){this.parseBoxFullHead(e);let i=e.start,[n,s]=this.get8bits(i++),[r,a]=this.get8bits(i++),o=2===e.version?4:2,l=1===e.version||2===e.version?2:0,h=a+n+s,u=2===e.version?4:2,c=this.file.getUintBytes(i,u);for(i+=u;c--;){let e=this.file.getUintBytes(i,o);i+=o+l+2+r;let u=this.file.getUint16(i);if(i+=2,e===t)return u>1&&console.warn("ILOC box has more than one extent but we're only processing one\nPlease create an issue at https://github.com/MikeKovarik/exifr with this file"),[this.file.getUintBytes(i+a,n),this.file.getUintBytes(i+a+n,s)];i+=u*h}}}class He extends ze{}f(He,"type","heic");class je extends ze{}f(je,"type","avif"),T.set("heic",He),T.set("avif",je),B(N,["ifd0","ifd1"],[[256,"ImageWidth"],[257,"ImageHeight"],[258,"BitsPerSample"],[259,"Compression"],[262,"PhotometricInterpretation"],[270,"ImageDescription"],[271,"Make"],[272,"Model"],[273,"StripOffsets"],[274,"Orientation"],[277,"SamplesPerPixel"],[278,"RowsPerStrip"],[279,"StripByteCounts"],[282,"XResolution"],[283,"YResolution"],[284,"PlanarConfiguration"],[296,"ResolutionUnit"],[301,"TransferFunction"],[305,"Software"],[306,"ModifyDate"],[315,"Artist"],[316,"HostComputer"],[317,"Predictor"],[318,"WhitePoint"],[319,"PrimaryChromaticities"],[513,"ThumbnailOffset"],[514,"ThumbnailLength"],[529,"YCbCrCoefficients"],[530,"YCbCrSubSampling"],[531,"YCbCrPositioning"],[532,"ReferenceBlackWhite"],[700,"ApplicationNotes"],[33432,"Copyright"],[33723,"IPTC"],[34665,"ExifIFD"],[34675,"ICC"],[34853,"GpsIFD"],[330,"SubIFD"],[40965,"InteropIFD"],[40091,"XPTitle"],[40092,"XPComment"],[40093,"XPAuthor"],[40094,"XPKeywords"],[40095,"XPSubject"]]),B(N,"exif",[[33434,"ExposureTime"],[33437,"FNumber"],[34850,"ExposureProgram"],[34852,"SpectralSensitivity"],[34855,"ISO"],[34858,"TimeZoneOffset"],[34859,"SelfTimerMode"],[34864,"SensitivityType"],[34865,"StandardOutputSensitivity"],[34866,"RecommendedExposureIndex"],[34867,"ISOSpeed"],[34868,"ISOSpeedLatitudeyyy"],[34869,"ISOSpeedLatitudezzz"],[36864,"ExifVersion"],[36867,"DateTimeOriginal"],[36868,"CreateDate"],[36873,"GooglePlusUploadCode"],[36880,"OffsetTime"],[36881,"OffsetTimeOriginal"],[36882,"OffsetTimeDigitized"],[37121,"ComponentsConfiguration"],[37122,"CompressedBitsPerPixel"],[37377,"ShutterSpeedValue"],[37378,"ApertureValue"],[37379,"BrightnessValue"],[37380,"ExposureCompensation"],[37381,"MaxApertureValue"],[37382,"SubjectDistance"],[37383,"MeteringMode"],[37384,"LightSource"],[37385,"Flash"],[37386,"FocalLength"],[37393,"ImageNumber"],[37394,"SecurityClassification"],[37395,"ImageHistory"],[37396,"SubjectArea"],[37500,"MakerNote"],[37510,"UserComment"],[37520,"SubSecTime"],[37521,"SubSecTimeOriginal"],[37522,"SubSecTimeDigitized"],[37888,"AmbientTemperature"],[37889,"Humidity"],[37890,"Pressure"],[37891,"WaterDepth"],[37892,"Acceleration"],[37893,"CameraElevationAngle"],[40960,"FlashpixVersion"],[40961,"ColorSpace"],[40962,"ExifImageWidth"],[40963,"ExifImageHeight"],[40964,"RelatedSoundFile"],[41483,"FlashEnergy"],[41486,"FocalPlaneXResolution"],[41487,"FocalPlaneYResolution"],[41488,"FocalPlaneResolutionUnit"],[41492,"SubjectLocation"],[41493,"ExposureIndex"],[41495,"SensingMethod"],[41728,"FileSource"],[41729,"SceneType"],[41730,"CFAPattern"],[41985,"CustomRendered"],[41986,"ExposureMode"],[41987,"WhiteBalance"],[41988,"DigitalZoomRatio"],[41989,"FocalLengthIn35mmFormat"],[41990,"SceneCaptureType"],[41991,"GainControl"],[41992,"Contrast"],[41993,"Saturation"],[41994,"Sharpness"],[41996,"SubjectDistanceRange"],[42016,"ImageUniqueID"],[42032,"OwnerName"],[42033,"SerialNumber"],[42034,"LensInfo"],[42035,"LensMake"],[42036,"LensModel"],[42037,"LensSerialNumber"],[42080,"CompositeImage"],[42081,"CompositeImageCount"],[42082,"CompositeImageExposureTimes"],[42240,"Gamma"],[59932,"Padding"],[59933,"OffsetSchema"],[65e3,"OwnerName"],[65001,"SerialNumber"],[65002,"Lens"],[65100,"RawFile"],[65101,"Converter"],[65102,"WhiteBalance"],[65105,"Exposure"],[65106,"Shadows"],[65107,"Brightness"],[65108,"Contrast"],[65109,"Saturation"],[65110,"Sharpness"],[65111,"Smoothness"],[65112,"MoireFilter"],[40965,"InteropIFD"]]),B(N,"gps",[[0,"GPSVersionID"],[1,"GPSLatitudeRef"],[2,"GPSLatitude"],[3,"GPSLongitudeRef"],[4,"GPSLongitude"],[5,"GPSAltitudeRef"],[6,"GPSAltitude"],[7,"GPSTimeStamp"],[8,"GPSSatellites"],[9,"GPSStatus"],[10,"GPSMeasureMode"],[11,"GPSDOP"],[12,"GPSSpeedRef"],[13,"GPSSpeed"],[14,"GPSTrackRef"],[15,"GPSTrack"],[16,"GPSImgDirectionRef"],[17,"GPSImgDirection"],[18,"GPSMapDatum"],[19,"GPSDestLatitudeRef"],[20,"GPSDestLatitude"],[21,"GPSDestLongitudeRef"],[22,"GPSDestLongitude"],[23,"GPSDestBearingRef"],[24,"GPSDestBearing"],[25,"GPSDestDistanceRef"],[26,"GPSDestDistance"],[27,"GPSProcessingMethod"],[28,"GPSAreaInformation"],[29,"GPSDateStamp"],[30,"GPSDifferential"],[31,"GPSHPositioningError"]]),B(G,["ifd0","ifd1"],[[274,{1:"Horizontal (normal)",2:"Mirror horizontal",3:"Rotate 180",4:"Mirror vertical",5:"Mirror horizontal and rotate 270 CW",6:"Rotate 90 CW",7:"Mirror horizontal and rotate 90 CW",8:"Rotate 270 CW"}],[296,{1:"None",2:"inches",3:"cm"}]]);let We=B(G,"exif",[[34850,{0:"Not defined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"}],[37121,{0:"-",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"}],[37383,{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"}],[37384,{0:"Unknown",1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"}],[37385,{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"}],[41495,{1:"Not defined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"}],[41728,{1:"Film Scanner",2:"Reflection Print Scanner",3:"Digital Camera"}],[41729,{1:"Directly photographed"}],[41985,{0:"Normal",1:"Custom",2:"HDR (no original saved)",3:"HDR (original saved)",4:"Original (for HDR)",6:"Panorama",7:"Portrait HDR",8:"Portrait"}],[41986,{0:"Auto",1:"Manual",2:"Auto bracket"}],[41987,{0:"Auto",1:"Manual"}],[41990,{0:"Standard",1:"Landscape",2:"Portrait",3:"Night",4:"Other"}],[41991,{0:"None",1:"Low gain up",2:"High gain up",3:"Low gain down",4:"High gain down"}],[41996,{0:"Unknown",1:"Macro",2:"Close",3:"Distant"}],[42080,{0:"Unknown",1:"Not a Composite Image",2:"General Composite Image",3:"Composite Image Captured While Shooting"}]]);const Ke={1:"No absolute unit of measurement",2:"Inch",3:"Centimeter"};We.set(37392,Ke),We.set(41488,Ke);const Xe={0:"Normal",1:"Low",2:"High"};function _e(e){return"object"==typeof e&&void 0!==e.length?e[0]:e}function Ye(e){let t=Array.from(e).slice(1);return t[1]>15&&(t=t.map((e=>String.fromCharCode(e)))),"0"!==t[2]&&0!==t[2]||t.pop(),t.join(".")}function $e(e){if("string"==typeof e){var[t,i,n,s,r,a]=e.trim().split(/[-: ]/g).map(Number),o=new Date(t,i-1,n);return Number.isNaN(s)||Number.isNaN(r)||Number.isNaN(a)||(o.setHours(s),o.setMinutes(r),o.setSeconds(a)),Number.isNaN(+o)?e:o}}function Je(e){if("string"==typeof e)return e;let t=[];if(0===e[1]&&0===e[e.length-1])for(let i=0;iArray.from(e).join(".")],[7,e=>Array.from(e).join(":")]]);const Qe="http://ns.adobe.com/",Ze="http://ns.adobe.com/xmp/extension/";class et extends ge{static canHandle(e,t){return 225===e.getUint8(t+1)&&1752462448===e.getUint32(t+4)&&e.getString(t+4,Qe.length)===Qe}static headerLength(e,t){return e.getString(t+4,Ze.length)===Ze?79:4+"http://ns.adobe.com/xap/1.0/".length+1}static findPosition(e,t){let i=super.findPosition(e,t);return i.multiSegment=i.extended=79===i.headerLength,i.multiSegment?(i.chunkCount=e.getUint8(t+72),i.chunkNumber=e.getUint8(t+76),0!==e.getUint8(t+77)&&i.chunkNumber++):(i.chunkCount=1/0,i.chunkNumber=-1),i}static handleMultiSegments(e){return e.map((e=>e.chunk.getString())).join("")}normalizeInput(e){return"string"==typeof e?e:I.from(e).getString()}parse(e=this.chunk){if(!this.localOptions.parse)return e;e=function(e){let t={},i={};for(let e of ut)t[e]=[],i[e]=0;return e.replace(ct,((e,n,s)=>{if("<"===n){let n=++i[s];return t[s].push(n),`${e}#${n}`}return`${e}#${t[s].pop()}`}))}(e);let t=nt.findAll(e,"rdf","Description");0===t.length&&t.push(new nt("rdf","Description",void 0,e));let i,n={};for(let e of t)for(let t of e.properties)i=ot(t.ns,n),st(t,i);return function(e){let t;for(let i in e)t=e[i]=d(e[i]),void 0===t&&delete e[i];return d(e)}(n)}assignToOutput(e,t){if(this.localOptions.parse)for(let[i,n]of Object.entries(t))switch(i){case"tiff":this.assignObjectToOutput(e,"ifd0",n);break;case"exif":this.assignObjectToOutput(e,"exif",n);break;case"xmlns":break;default:this.assignObjectToOutput(e,i,n)}else e.xmp=t}}f(et,"type","xmp"),f(et,"multiSegment",!0),A.set("xmp",et);class tt{static findAll(e){return lt(e,/([a-zA-Z0-9-]+):([a-zA-Z0-9-]+)=("[^"]*"|'[^']*')/gm).map(tt.unpackMatch)}static unpackMatch(e){let t=e[1],i=e[2],n=e[3].slice(1,-1);return n=ht(n),new tt(t,i,n)}constructor(e,t,i){this.ns=e,this.name=t,this.value=i}serialize(){return this.value}}const it="[\\w\\d-]+";class nt{static findAll(e,t,i){if(void 0!==t||void 0!==i){t=t||it,i=i||it;var n=new RegExp(`<(${t}):(${i})(#\\d+)?((\\s+?[\\w\\d-:]+=("[^"]*"|'[^']*'))*\\s*)(\\/>|>([\\s\\S]*?)<\\/\\1:\\2\\3>)`,"gm")}else n=/<([\w\d-]+):([\w\d-]+)(#\d+)?((\s+?[\w\d-:]+=("[^"]*"|'[^']*'))*\s*)(\/>|>([\s\S]*?)<\/\1:\2\3>)/gm;return lt(e,n).map(nt.unpackMatch)}static unpackMatch(e){let t=e[1],i=e[2],n=e[4],s=e[8];return new nt(t,i,n,s)}constructor(e,t,i,n){this.ns=e,this.name=t,this.attrString=i,this.innerXml=n,this.attrs=tt.findAll(i),this.children=nt.findAll(n),this.value=0===this.children.length?ht(n):void 0,this.properties=[...this.attrs,...this.children]}get isPrimitive(){return void 0!==this.value&&0===this.attrs.length&&0===this.children.length}get isListContainer(){return 1===this.children.length&&this.children[0].isList}get isList(){let{ns:e,name:t}=this;return"rdf"===e&&("Seq"===t||"Bag"===t||"Alt"===t)}get isListItem(){return"rdf"===this.ns&&"li"===this.name}serialize(){if(0===this.properties.length&&void 0===this.value)return;if(this.isPrimitive)return this.value;if(this.isListContainer)return this.children[0].serialize();if(this.isList)return at(this.children.map(rt));if(this.isListItem&&1===this.children.length&&0===this.attrs.length)return this.children[0].serialize();let e={};for(let t of this.properties)st(t,e);return void 0!==this.value&&(e.value=this.value),d(e)}}function st(e,t){let i=e.serialize();void 0!==i&&(t[e.name]=i)}var rt=e=>e.serialize(),at=e=>1===e.length?e[0]:e,ot=(e,t)=>t[e]?t[e]:t[e]={};function lt(e,t){let i,n=[];if(!e)return n;for(;null!==(i=t.exec(e));)n.push(i);return n}function ht(e){if(function(e){return null==e||"null"===e||"undefined"===e||""===e||""===e.trim()}(e))return;let t=Number(e);if(!Number.isNaN(t))return t;let i=e.toLowerCase();return"true"===i||"false"!==i&&e.trim()}const ut=["rdf:li","rdf:Seq","rdf:Bag","rdf:Alt","rdf:Description"],ct=new RegExp(`(<|\\/)(${ut.join("|")})`,"g");var ft=Object.freeze({__proto__:null,default:Ge,Exifr:ce,fileParsers:T,segmentParsers:A,fileReaders:D,tagKeys:N,tagValues:G,tagRevivers:V,createDictionary:B,extendDictionary:E,fetchUrlAsArrayBuffer:L,readBlobAsArrayBuffer:U,chunkedProps:$,otherSegments:J,segments:q,tiffBlocks:Q,segmentsAndBlocks:Z,tiffExtractables:ee,inheritables:te,allFormatters:ie,Options:oe,parse:fe,gpsOnlyOptions:Ae,gps:De,thumbnailOnlyOptions:Oe,thumbnail:xe,thumbnailUrl:ve,orientationOnlyOptions:Me,orientation:Re,rotations:Le,get rotateCanvas(){return e.rotateCanvas},get rotateCss(){return e.rotateCss},rotation:Ue});const dt=["xmp","icc","iptc","tiff"],pt=()=>{};async function gt(e,t,i){let n=i[e];return n.enabled=!0,n.parse=!0,A.get(e).parse(t,n)}let mt=h("fs",(e=>e.promises));D.set("fs",class extends Ne{async readWhole(){this.chunked=!1,this.fs=await mt;let e=await this.fs.readFile(this.input);this._swapBuffer(e)}async readChunked(){this.chunked=!0,this.fs=await mt,await this.open(),await this.readChunk(0,this.options.firstChunkSize)}async open(){void 0===this.fh&&(this.fh=await this.fs.open(this.input,"r"),this.size=(await this.fh.stat(this.input)).size)}async _readChunk(e,t){void 0===this.fh&&await this.open(),e+t>this.size&&(t=this.size-e);var i=this.subarray(e,t,!0);return await this.fh.read(i.dataView,0,t,e),i}async close(){if(this.fh){let e=this.fh;this.fh=void 0,await e.close()}}});D.set("base64",class extends Ne{constructor(...e){super(...e),this.input=this.input.replace(/^data:([^;]+);base64,/gim,""),this.size=this.input.length/4*3,this.input.endsWith("==")?this.size-=2:this.input.endsWith("=")&&(this.size-=1)}async _readChunk(e,t){let i,n,s=this.input;void 0===e?(e=0,i=0,n=0):(i=4*Math.floor(e/3),n=e-i/4*3),void 0===t&&(t=this.size);let a=e+t,l=i+4*Math.ceil(a/3);s=s.slice(i,l);let h=Math.min(t,this.size-e);if(o){let t=r.from(s,"base64").slice(n,n+h);return this.set(t,e,!0)}{let t=this.subarray(e,h,!0),i=atob(s),r=t.toUint8();for(let e=0;ethis.errors.push(e))),f(this,"metaChunks",[]),f(this,"unknownChunks",[])}static canHandle(e,t){return 35152===t&&2303741511===e.getUint32(0)&&218765834===e.getUint32(4)}async parse(){let{file:e}=this;await this.findPngChunksInRange("‰PNG\r\n\n".length,e.byteLength),await this.readSegments(this.metaChunks),this.findIhdr(),this.parseTextChunks(),await this.findExif().catch(this.catchError),await this.findXmp().catch(this.catchError),await this.findIcc().catch(this.catchError)}async findPngChunksInRange(e,t){let{file:i}=this;for(;ee.type===It));for(let t of e){let[e,i]=this.file.getString(t.start,t.size).split("\0");this.injectKeyValToIhdr(e,i)}}injectKeyValToIhdr(e,t){let i=this.parsers.ihdr;i&&i.raw.set(e,t)}findIhdr(){let e=this.metaChunks.find((e=>e.type===bt));e&&!1!==this.options.ihdr.enabled&&this.createParser(bt,e.chunk)}async findExif(){let e=this.metaChunks.find((e=>"exif"===e.type));e&&this.injectSegment("tiff",e.chunk)}async findXmp(){let e=this.metaChunks.filter((e=>e.type===kt));for(let t of e){t.chunk.getString(0,yt.length)===yt&&this.injectSegment("xmp",t.chunk)}}async findIcc(){let e=this.metaChunks.find((e=>e.type===Pt));if(!e)return;let{chunk:t}=e,i=t.getUint8Array(0,81),n=0;for(;n<80&&0!==i[n];)n++;let r=n+2,a=t.getString(0,n);if(this.injectKeyValToIhdr("ProfileName",a),s){let e=await Ct,i=t.getUint8Array(r);i=e.inflateSync(i),this.injectSegment("icc",i)}}}f(Tt,"type","png"),T.set("png",Tt),B(N,"interop",[[1,"InteropIndex"],[2,"InteropVersion"],[4096,"RelatedImageFileFormat"],[4097,"RelatedImageWidth"],[4098,"RelatedImageHeight"]]),E(N,"ifd0",[[11,"ProcessingSoftware"],[254,"SubfileType"],[255,"OldSubfileType"],[263,"Thresholding"],[264,"CellWidth"],[265,"CellLength"],[266,"FillOrder"],[269,"DocumentName"],[280,"MinSampleValue"],[281,"MaxSampleValue"],[285,"PageName"],[286,"XPosition"],[287,"YPosition"],[290,"GrayResponseUnit"],[297,"PageNumber"],[321,"HalftoneHints"],[322,"TileWidth"],[323,"TileLength"],[332,"InkSet"],[337,"TargetPrinter"],[18246,"Rating"],[18249,"RatingPercent"],[33550,"PixelScale"],[34264,"ModelTransform"],[34377,"PhotoshopSettings"],[50706,"DNGVersion"],[50707,"DNGBackwardVersion"],[50708,"UniqueCameraModel"],[50709,"LocalizedCameraModel"],[50736,"DNGLensInfo"],[50739,"ShadowScale"],[50740,"DNGPrivateData"],[33920,"IntergraphMatrix"],[33922,"ModelTiePoint"],[34118,"SEMInfo"],[34735,"GeoTiffDirectory"],[34736,"GeoTiffDoubleParams"],[34737,"GeoTiffAsciiParams"],[50341,"PrintIM"],[50721,"ColorMatrix1"],[50722,"ColorMatrix2"],[50723,"CameraCalibration1"],[50724,"CameraCalibration2"],[50725,"ReductionMatrix1"],[50726,"ReductionMatrix2"],[50727,"AnalogBalance"],[50728,"AsShotNeutral"],[50729,"AsShotWhiteXY"],[50730,"BaselineExposure"],[50731,"BaselineNoise"],[50732,"BaselineSharpness"],[50734,"LinearResponseLimit"],[50735,"CameraSerialNumber"],[50741,"MakerNoteSafety"],[50778,"CalibrationIlluminant1"],[50779,"CalibrationIlluminant2"],[50781,"RawDataUniqueID"],[50827,"OriginalRawFileName"],[50828,"OriginalRawFileData"],[50831,"AsShotICCProfile"],[50832,"AsShotPreProfileMatrix"],[50833,"CurrentICCProfile"],[50834,"CurrentPreProfileMatrix"],[50879,"ColorimetricReference"],[50885,"SRawType"],[50898,"PanasonicTitle"],[50899,"PanasonicTitle2"],[50931,"CameraCalibrationSig"],[50932,"ProfileCalibrationSig"],[50933,"ProfileIFD"],[50934,"AsShotProfileName"],[50936,"ProfileName"],[50937,"ProfileHueSatMapDims"],[50938,"ProfileHueSatMapData1"],[50939,"ProfileHueSatMapData2"],[50940,"ProfileToneCurve"],[50941,"ProfileEmbedPolicy"],[50942,"ProfileCopyright"],[50964,"ForwardMatrix1"],[50965,"ForwardMatrix2"],[50966,"PreviewApplicationName"],[50967,"PreviewApplicationVersion"],[50968,"PreviewSettingsName"],[50969,"PreviewSettingsDigest"],[50970,"PreviewColorSpace"],[50971,"PreviewDateTime"],[50972,"RawImageDigest"],[50973,"OriginalRawFileDigest"],[50981,"ProfileLookTableDims"],[50982,"ProfileLookTableData"],[51043,"TimeCodes"],[51044,"FrameRate"],[51058,"TStop"],[51081,"ReelName"],[51089,"OriginalDefaultFinalSize"],[51090,"OriginalBestQualitySize"],[51091,"OriginalDefaultCropSize"],[51105,"CameraLabel"],[51107,"ProfileHueSatMapEncoding"],[51108,"ProfileLookTableEncoding"],[51109,"BaselineExposureOffset"],[51110,"DefaultBlackRender"],[51111,"NewRawImageDigest"],[51112,"RawToPreviewGain"]]);let At=[[273,"StripOffsets"],[279,"StripByteCounts"],[288,"FreeOffsets"],[289,"FreeByteCounts"],[291,"GrayResponseCurve"],[292,"T4Options"],[293,"T6Options"],[300,"ColorResponseUnit"],[320,"ColorMap"],[324,"TileOffsets"],[325,"TileByteCounts"],[326,"BadFaxLines"],[327,"CleanFaxData"],[328,"ConsecutiveBadFaxLines"],[330,"SubIFD"],[333,"InkNames"],[334,"NumberofInks"],[336,"DotRange"],[338,"ExtraSamples"],[339,"SampleFormat"],[340,"SMinSampleValue"],[341,"SMaxSampleValue"],[342,"TransferRange"],[343,"ClipPath"],[344,"XClipPathUnits"],[345,"YClipPathUnits"],[346,"Indexed"],[347,"JPEGTables"],[351,"OPIProxy"],[400,"GlobalParametersIFD"],[401,"ProfileType"],[402,"FaxProfile"],[403,"CodingMethods"],[404,"VersionYear"],[405,"ModeNumber"],[433,"Decode"],[434,"DefaultImageColor"],[435,"T82Options"],[437,"JPEGTables"],[512,"JPEGProc"],[515,"JPEGRestartInterval"],[517,"JPEGLosslessPredictors"],[518,"JPEGPointTransforms"],[519,"JPEGQTables"],[520,"JPEGDCTables"],[521,"JPEGACTables"],[559,"StripRowCounts"],[999,"USPTOMiscellaneous"],[18247,"XP_DIP_XML"],[18248,"StitchInfo"],[28672,"SonyRawFileType"],[28688,"SonyToneCurve"],[28721,"VignettingCorrection"],[28722,"VignettingCorrParams"],[28724,"ChromaticAberrationCorrection"],[28725,"ChromaticAberrationCorrParams"],[28726,"DistortionCorrection"],[28727,"DistortionCorrParams"],[29895,"SonyCropTopLeft"],[29896,"SonyCropSize"],[32781,"ImageID"],[32931,"WangTag1"],[32932,"WangAnnotation"],[32933,"WangTag3"],[32934,"WangTag4"],[32953,"ImageReferencePoints"],[32954,"RegionXformTackPoint"],[32955,"WarpQuadrilateral"],[32956,"AffineTransformMat"],[32995,"Matteing"],[32996,"DataType"],[32997,"ImageDepth"],[32998,"TileDepth"],[33300,"ImageFullWidth"],[33301,"ImageFullHeight"],[33302,"TextureFormat"],[33303,"WrapModes"],[33304,"FovCot"],[33305,"MatrixWorldToScreen"],[33306,"MatrixWorldToCamera"],[33405,"Model2"],[33421,"CFARepeatPatternDim"],[33422,"CFAPattern2"],[33423,"BatteryLevel"],[33424,"KodakIFD"],[33445,"MDFileTag"],[33446,"MDScalePixel"],[33447,"MDColorTable"],[33448,"MDLabName"],[33449,"MDSampleInfo"],[33450,"MDPrepDate"],[33451,"MDPrepTime"],[33452,"MDFileUnits"],[33589,"AdventScale"],[33590,"AdventRevision"],[33628,"UIC1Tag"],[33629,"UIC2Tag"],[33630,"UIC3Tag"],[33631,"UIC4Tag"],[33918,"IntergraphPacketData"],[33919,"IntergraphFlagRegisters"],[33921,"INGRReserved"],[34016,"Site"],[34017,"ColorSequence"],[34018,"IT8Header"],[34019,"RasterPadding"],[34020,"BitsPerRunLength"],[34021,"BitsPerExtendedRunLength"],[34022,"ColorTable"],[34023,"ImageColorIndicator"],[34024,"BackgroundColorIndicator"],[34025,"ImageColorValue"],[34026,"BackgroundColorValue"],[34027,"PixelIntensityRange"],[34028,"TransparencyIndicator"],[34029,"ColorCharacterization"],[34030,"HCUsage"],[34031,"TrapIndicator"],[34032,"CMYKEquivalent"],[34152,"AFCP_IPTC"],[34232,"PixelMagicJBIGOptions"],[34263,"JPLCartoIFD"],[34306,"WB_GRGBLevels"],[34310,"LeafData"],[34687,"TIFF_FXExtensions"],[34688,"MultiProfiles"],[34689,"SharedData"],[34690,"T88Options"],[34732,"ImageLayer"],[34750,"JBIGOptions"],[34856,"Opto-ElectricConvFactor"],[34857,"Interlace"],[34908,"FaxRecvParams"],[34909,"FaxSubAddress"],[34910,"FaxRecvTime"],[34929,"FedexEDR"],[34954,"LeafSubIFD"],[37387,"FlashEnergy"],[37388,"SpatialFrequencyResponse"],[37389,"Noise"],[37390,"FocalPlaneXResolution"],[37391,"FocalPlaneYResolution"],[37392,"FocalPlaneResolutionUnit"],[37397,"ExposureIndex"],[37398,"TIFF-EPStandardID"],[37399,"SensingMethod"],[37434,"CIP3DataFile"],[37435,"CIP3Sheet"],[37436,"CIP3Side"],[37439,"StoNits"],[37679,"MSDocumentText"],[37680,"MSPropertySetStorage"],[37681,"MSDocumentTextPosition"],[37724,"ImageSourceData"],[40965,"InteropIFD"],[40976,"SamsungRawPointersOffset"],[40977,"SamsungRawPointersLength"],[41217,"SamsungRawByteOrder"],[41218,"SamsungRawUnknown"],[41484,"SpatialFrequencyResponse"],[41485,"Noise"],[41489,"ImageNumber"],[41490,"SecurityClassification"],[41491,"ImageHistory"],[41494,"TIFF-EPStandardID"],[41995,"DeviceSettingDescription"],[42112,"GDALMetadata"],[42113,"GDALNoData"],[44992,"ExpandSoftware"],[44993,"ExpandLens"],[44994,"ExpandFilm"],[44995,"ExpandFilterLens"],[44996,"ExpandScanner"],[44997,"ExpandFlashLamp"],[46275,"HasselbladRawImage"],[48129,"PixelFormat"],[48130,"Transformation"],[48131,"Uncompressed"],[48132,"ImageType"],[48256,"ImageWidth"],[48257,"ImageHeight"],[48258,"WidthResolution"],[48259,"HeightResolution"],[48320,"ImageOffset"],[48321,"ImageByteCount"],[48322,"AlphaOffset"],[48323,"AlphaByteCount"],[48324,"ImageDataDiscard"],[48325,"AlphaDataDiscard"],[50215,"OceScanjobDesc"],[50216,"OceApplicationSelector"],[50217,"OceIDNumber"],[50218,"OceImageLogic"],[50255,"Annotations"],[50459,"HasselbladExif"],[50547,"OriginalFileName"],[50560,"USPTOOriginalContentType"],[50656,"CR2CFAPattern"],[50710,"CFAPlaneColor"],[50711,"CFALayout"],[50712,"LinearizationTable"],[50713,"BlackLevelRepeatDim"],[50714,"BlackLevel"],[50715,"BlackLevelDeltaH"],[50716,"BlackLevelDeltaV"],[50717,"WhiteLevel"],[50718,"DefaultScale"],[50719,"DefaultCropOrigin"],[50720,"DefaultCropSize"],[50733,"BayerGreenSplit"],[50737,"ChromaBlurRadius"],[50738,"AntiAliasStrength"],[50752,"RawImageSegmentation"],[50780,"BestQualityScale"],[50784,"AliasLayerMetadata"],[50829,"ActiveArea"],[50830,"MaskedAreas"],[50935,"NoiseReductionApplied"],[50974,"SubTileBlockSize"],[50975,"RowInterleaveFactor"],[51008,"OpcodeList1"],[51009,"OpcodeList2"],[51022,"OpcodeList3"],[51041,"NoiseProfile"],[51114,"CacheVersion"],[51125,"DefaultUserCrop"],[51157,"NikonNEFInfo"],[65024,"KdcIFD"]];E(N,"ifd0",At),E(N,"exif",At),B(G,"gps",[[23,{M:"Magnetic North",T:"True North"}],[25,{K:"Kilometers",M:"Miles",N:"Nautical Miles"}]]);class Dt extends ge{static canHandle(e,t){return 224===e.getUint8(t+1)&&1246120262===e.getUint32(t+4)&&0===e.getUint8(t+8)}parse(){return this.parseTags(),this.translate(),this.output}parseTags(){this.raw=new Map([[0,this.chunk.getUint16(0)],[2,this.chunk.getUint8(2)],[3,this.chunk.getUint16(3)],[5,this.chunk.getUint16(5)],[7,this.chunk.getUint8(7)],[8,this.chunk.getUint8(8)]])}}f(Dt,"type","jfif"),f(Dt,"headerLength",9),A.set("jfif",Dt),B(N,"jfif",[[0,"JFIFVersion"],[2,"ResolutionUnit"],[3,"XResolution"],[5,"YResolution"],[7,"ThumbnailWidth"],[8,"ThumbnailHeight"]]);class Ot extends ge{parse(){return this.parseTags(),this.translate(),this.output}parseTags(){this.raw=new Map([[0,this.chunk.getUint32(0)],[4,this.chunk.getUint32(4)],[8,this.chunk.getUint8(8)],[9,this.chunk.getUint8(9)],[10,this.chunk.getUint8(10)],[11,this.chunk.getUint8(11)],[12,this.chunk.getUint8(12)],...Array.from(this.raw)])}}f(Ot,"type","ihdr"),A.set("ihdr",Ot),B(N,"ihdr",[[0,"ImageWidth"],[4,"ImageHeight"],[8,"BitDepth"],[9,"ColorType"],[10,"Compression"],[11,"Filter"],[12,"Interlace"]]),B(G,"ihdr",[[9,{0:"Grayscale",2:"RGB",3:"Palette",4:"Grayscale with Alpha",6:"RGB with Alpha",DEFAULT:"Unknown"}],[10,{0:"Deflate/Inflate",DEFAULT:"Unknown"}],[11,{0:"Adaptive",DEFAULT:"Unknown"}],[12,{0:"Noninterlaced",1:"Adam7 Interlace",DEFAULT:"Unknown"}]]);const xt="\0\0\0\0";class vt extends ge{static canHandle(e,t){return 226===e.getUint8(t+1)&&1229144927===e.getUint32(t+4)}static findPosition(e,t){let i=super.findPosition(e,t);return i.chunkNumber=e.getUint8(t+16),i.chunkCount=e.getUint8(t+17),i.multiSegment=i.chunkCount>1,i}static handleMultiSegments(e){return function(e){let t=function(e){let t=e[0].constructor,i=0;for(let t of e)i+=t.length;let n=new t(i),s=0;for(let t of e)n.set(t,s),s+=t.length;return n}(e.map((e=>e.chunk.toUint8())));return new I(t)}(e)}parse(){return this.raw=new Map,this.parseHeader(),this.parseTags(),this.translate(),this.output}parseHeader(){let{raw:e}=this;this.chunk.byteLength<84&&m("ICC header is too short");for(let[t,i]of Object.entries(Mt)){t=parseInt(t,10);let n=i(this.chunk,t);n!==xt&&e.set(t,n)}}parseTags(){let e,t,i,n,s,{raw:r}=this,a=this.chunk.getUint32(128),o=132,l=this.chunk.byteLength;for(;a--;){if(e=this.chunk.getString(o,4),t=this.chunk.getUint32(o+4),i=this.chunk.getUint32(o+8),n=this.chunk.getString(t,4),t+i>l)return void console.warn("reached the end of the first ICC chunk. Enable options.tiff.multiSegment to read all ICC segments.");s=this.parseTag(n,t,i),void 0!==s&&s!==xt&&r.set(e,s),o+=12}}parseTag(e,t,i){switch(e){case"desc":return this.parseDesc(t);case"mluc":return this.parseMluc(t);case"text":return this.parseText(t,i);case"sig ":return this.parseSig(t)}if(!(t+i>this.chunk.byteLength))return this.chunk.getUint8Array(t,i)}parseDesc(e){let t=this.chunk.getUint32(e+8)-1;return S(this.chunk.getString(e+12,t))}parseText(e,t){return S(this.chunk.getString(e+8,t-8))}parseSig(e){return S(this.chunk.getString(e+8,4))}parseMluc(e){let{chunk:t}=this,i=t.getUint32(e+8),n=t.getUint32(e+12),s=e+16,r=[];for(let a=0;a>4,e.getUint8(t+1)%16].map((e=>e.toString(10))).join(".")},12:Rt,16:Rt,20:Rt,24:function(e,t){const i=e.getUint16(t),n=e.getUint16(t+2)-1,s=e.getUint16(t+4),r=e.getUint16(t+6),a=e.getUint16(t+8),o=e.getUint16(t+10);return new Date(Date.UTC(i,n,s,r,a,o))},36:Rt,40:Rt,48:Rt,52:Rt,64:(e,t)=>e.getUint32(t),80:Rt};function Rt(e,t){return S(e.getString(t,4))}A.set("icc",vt),B(N,"icc",[[4,"ProfileCMMType"],[8,"ProfileVersion"],[12,"ProfileClass"],[16,"ColorSpaceData"],[20,"ProfileConnectionSpace"],[24,"ProfileDateTime"],[36,"ProfileFileSignature"],[40,"PrimaryPlatform"],[44,"CMMFlags"],[48,"DeviceManufacturer"],[52,"DeviceModel"],[56,"DeviceAttributes"],[64,"RenderingIntent"],[68,"ConnectionSpaceIlluminant"],[80,"ProfileCreator"],[84,"ProfileID"],["Header","ProfileHeader"],["MS00","WCSProfiles"],["bTRC","BlueTRC"],["bXYZ","BlueMatrixColumn"],["bfd","UCRBG"],["bkpt","MediaBlackPoint"],["calt","CalibrationDateTime"],["chad","ChromaticAdaptation"],["chrm","Chromaticity"],["ciis","ColorimetricIntentImageState"],["clot","ColorantTableOut"],["clro","ColorantOrder"],["clrt","ColorantTable"],["cprt","ProfileCopyright"],["crdi","CRDInfo"],["desc","ProfileDescription"],["devs","DeviceSettings"],["dmdd","DeviceModelDesc"],["dmnd","DeviceMfgDesc"],["dscm","ProfileDescriptionML"],["fpce","FocalPlaneColorimetryEstimates"],["gTRC","GreenTRC"],["gXYZ","GreenMatrixColumn"],["gamt","Gamut"],["kTRC","GrayTRC"],["lumi","Luminance"],["meas","Measurement"],["meta","Metadata"],["mmod","MakeAndModel"],["ncl2","NamedColor2"],["ncol","NamedColor"],["ndin","NativeDisplayInfo"],["pre0","Preview0"],["pre1","Preview1"],["pre2","Preview2"],["ps2i","PS2RenderingIntent"],["ps2s","PostScript2CSA"],["psd0","PostScript2CRD0"],["psd1","PostScript2CRD1"],["psd2","PostScript2CRD2"],["psd3","PostScript2CRD3"],["pseq","ProfileSequenceDesc"],["psid","ProfileSequenceIdentifier"],["psvm","PS2CRDVMSize"],["rTRC","RedTRC"],["rXYZ","RedMatrixColumn"],["resp","OutputResponse"],["rhoc","ReflectionHardcopyOrigColorimetry"],["rig0","PerceptualRenderingIntentGamut"],["rig2","SaturationRenderingIntentGamut"],["rpoc","ReflectionPrintOutputColorimetry"],["sape","SceneAppearanceEstimates"],["scoe","SceneColorimetryEstimates"],["scrd","ScreeningDesc"],["scrn","Screening"],["targ","CharTarget"],["tech","Technology"],["vcgt","VideoCardGamma"],["view","ViewingConditions"],["vued","ViewingCondDesc"],["wtpt","MediaWhitePoint"]]);const Lt={"4d2p":"Erdt Systems",AAMA:"Aamazing Technologies",ACER:"Acer",ACLT:"Acolyte Color Research",ACTI:"Actix Sytems",ADAR:"Adara Technology",ADBE:"Adobe",ADI:"ADI Systems",AGFA:"Agfa Graphics",ALMD:"Alps Electric",ALPS:"Alps Electric",ALWN:"Alwan Color Expertise",AMTI:"Amiable Technologies",AOC:"AOC International",APAG:"Apago",APPL:"Apple Computer",AST:"AST","AT&T":"AT&T",BAEL:"BARBIERI electronic",BRCO:"Barco NV",BRKP:"Breakpoint",BROT:"Brother",BULL:"Bull",BUS:"Bus Computer Systems","C-IT":"C-Itoh",CAMR:"Intel",CANO:"Canon",CARR:"Carroll Touch",CASI:"Casio",CBUS:"Colorbus PL",CEL:"Crossfield",CELx:"Crossfield",CGS:"CGS Publishing Technologies International",CHM:"Rochester Robotics",CIGL:"Colour Imaging Group, London",CITI:"Citizen",CL00:"Candela",CLIQ:"Color IQ",CMCO:"Chromaco",CMiX:"CHROMiX",COLO:"Colorgraphic Communications",COMP:"Compaq",COMp:"Compeq/Focus Technology",CONR:"Conrac Display Products",CORD:"Cordata Technologies",CPQ:"Compaq",CPRO:"ColorPro",CRN:"Cornerstone",CTX:"CTX International",CVIS:"ColorVision",CWC:"Fujitsu Laboratories",DARI:"Darius Technology",DATA:"Dataproducts",DCP:"Dry Creek Photo",DCRC:"Digital Contents Resource Center, Chung-Ang University",DELL:"Dell Computer",DIC:"Dainippon Ink and Chemicals",DICO:"Diconix",DIGI:"Digital","DL&C":"Digital Light & Color",DPLG:"Doppelganger",DS:"Dainippon Screen",DSOL:"DOOSOL",DUPN:"DuPont",EPSO:"Epson",ESKO:"Esko-Graphics",ETRI:"Electronics and Telecommunications Research Institute",EVER:"Everex Systems",EXAC:"ExactCODE",Eizo:"Eizo",FALC:"Falco Data Products",FF:"Fuji Photo Film",FFEI:"FujiFilm Electronic Imaging",FNRD:"Fnord Software",FORA:"Fora",FORE:"Forefront Technology",FP:"Fujitsu",FPA:"WayTech Development",FUJI:"Fujitsu",FX:"Fuji Xerox",GCC:"GCC Technologies",GGSL:"Global Graphics Software",GMB:"Gretagmacbeth",GMG:"GMG",GOLD:"GoldStar Technology",GOOG:"Google",GPRT:"Giantprint",GTMB:"Gretagmacbeth",GVC:"WayTech Development",GW2K:"Sony",HCI:"HCI",HDM:"Heidelberger Druckmaschinen",HERM:"Hermes",HITA:"Hitachi America",HP:"Hewlett-Packard",HTC:"Hitachi",HiTi:"HiTi Digital",IBM:"IBM",IDNT:"Scitex",IEC:"Hewlett-Packard",IIYA:"Iiyama North America",IKEG:"Ikegami Electronics",IMAG:"Image Systems",IMI:"Ingram Micro",INTC:"Intel",INTL:"N/A (INTL)",INTR:"Intra Electronics",IOCO:"Iocomm International Technology",IPS:"InfoPrint Solutions Company",IRIS:"Scitex",ISL:"Ichikawa Soft Laboratory",ITNL:"N/A (ITNL)",IVM:"IVM",IWAT:"Iwatsu Electric",Idnt:"Scitex",Inca:"Inca Digital Printers",Iris:"Scitex",JPEG:"Joint Photographic Experts Group",JSFT:"Jetsoft Development",JVC:"JVC Information Products",KART:"Scitex",KFC:"KFC Computek Components",KLH:"KLH Computers",KMHD:"Konica Minolta",KNCA:"Konica",KODA:"Kodak",KYOC:"Kyocera",Kart:"Scitex",LCAG:"Leica",LCCD:"Leeds Colour",LDAK:"Left Dakota",LEAD:"Leading Technology",LEXM:"Lexmark International",LINK:"Link Computer",LINO:"Linotronic",LITE:"Lite-On",Leaf:"Leaf",Lino:"Linotronic",MAGC:"Mag Computronic",MAGI:"MAG Innovision",MANN:"Mannesmann",MICN:"Micron Technology",MICR:"Microtek",MICV:"Microvitec",MINO:"Minolta",MITS:"Mitsubishi Electronics America",MITs:"Mitsuba",MNLT:"Minolta",MODG:"Modgraph",MONI:"Monitronix",MONS:"Monaco Systems",MORS:"Morse Technology",MOTI:"Motive Systems",MSFT:"Microsoft",MUTO:"MUTOH INDUSTRIES",Mits:"Mitsubishi Electric",NANA:"NANAO",NEC:"NEC",NEXP:"NexPress Solutions",NISS:"Nissei Sangyo America",NKON:"Nikon",NONE:"none",OCE:"Oce Technologies",OCEC:"OceColor",OKI:"Oki",OKID:"Okidata",OKIP:"Okidata",OLIV:"Olivetti",OLYM:"Olympus",ONYX:"Onyx Graphics",OPTI:"Optiquest",PACK:"Packard Bell",PANA:"Matsushita Electric Industrial",PANT:"Pantone",PBN:"Packard Bell",PFU:"PFU",PHIL:"Philips Consumer Electronics",PNTX:"HOYA",POne:"Phase One A/S",PREM:"Premier Computer Innovations",PRIN:"Princeton Graphic Systems",PRIP:"Princeton Publishing Labs",QLUX:"Hong Kong",QMS:"QMS",QPCD:"QPcard AB",QUAD:"QuadLaser",QUME:"Qume",RADI:"Radius",RDDx:"Integrated Color Solutions",RDG:"Roland DG",REDM:"REDMS Group",RELI:"Relisys",RGMS:"Rolf Gierling Multitools",RICO:"Ricoh",RNLD:"Edmund Ronald",ROYA:"Royal",RPC:"Ricoh Printing Systems",RTL:"Royal Information Electronics",SAMP:"Sampo",SAMS:"Samsung",SANT:"Jaime Santana Pomares",SCIT:"Scitex",SCRN:"Dainippon Screen",SDP:"Scitex",SEC:"Samsung",SEIK:"Seiko Instruments",SEIk:"Seikosha",SGUY:"ScanGuy.com",SHAR:"Sharp Laboratories",SICC:"International Color Consortium",SONY:"Sony",SPCL:"SpectraCal",STAR:"Star",STC:"Sampo Technology",Scit:"Scitex",Sdp:"Scitex",Sony:"Sony",TALO:"Talon Technology",TAND:"Tandy",TATU:"Tatung",TAXA:"TAXAN America",TDS:"Tokyo Denshi Sekei",TECO:"TECO Information Systems",TEGR:"Tegra",TEKT:"Tektronix",TI:"Texas Instruments",TMKR:"TypeMaker",TOSB:"Toshiba",TOSH:"Toshiba",TOTK:"TOTOKU ELECTRIC",TRIU:"Triumph",TSBT:"Toshiba",TTX:"TTX Computer Products",TVM:"TVM Professional Monitor",TW:"TW Casper",ULSX:"Ulead Systems",UNIS:"Unisys",UTZF:"Utz Fehlau & Sohn",VARI:"Varityper",VIEW:"Viewsonic",VISL:"Visual communication",VIVO:"Vivo Mobile Communication",WANG:"Wang",WLBR:"Wilbur Imaging",WTG2:"Ware To Go",WYSE:"WYSE Technology",XERX:"Xerox",XRIT:"X-Rite",ZRAN:"Zoran",Zebr:"Zebra Technologies",appl:"Apple Computer",bICC:"basICColor",berg:"bergdesign",ceyd:"Integrated Color Solutions",clsp:"MacDermid ColorSpan",ds:"Dainippon Screen",dupn:"DuPont",ffei:"FujiFilm Electronic Imaging",flux:"FluxData",iris:"Scitex",kart:"Scitex",lcms:"Little CMS",lino:"Linotronic",none:"none",ob4d:"Erdt Systems",obic:"Medigraph",quby:"Qubyx Sarl",scit:"Scitex",scrn:"Dainippon Screen",sdp:"Scitex",siwi:"SIWI GRAFIKA",yxym:"YxyMaster"},Ut={scnr:"Scanner",mntr:"Monitor",prtr:"Printer",link:"Device Link",abst:"Abstract",spac:"Color Space Conversion Profile",nmcl:"Named Color",cenc:"ColorEncodingSpace profile",mid:"MultiplexIdentification profile",mlnk:"MultiplexLink profile",mvis:"MultiplexVisualization profile",nkpf:"Nikon Input Device Profile (NON-STANDARD!)"};B(G,"icc",[[4,Lt],[12,Ut],[40,Object.assign({},Lt,Ut)],[48,Lt],[80,Lt],[64,{0:"Perceptual",1:"Relative Colorimetric",2:"Saturation",3:"Absolute Colorimetric"}],["tech",{amd:"Active Matrix Display",crt:"Cathode Ray Tube Display",kpcd:"Photo CD",pmd:"Passive Matrix Display",dcam:"Digital Camera",dcpj:"Digital Cinema Projector",dmpc:"Digital Motion Picture Camera",dsub:"Dye Sublimation Printer",epho:"Electrophotographic Printer",esta:"Electrostatic Printer",flex:"Flexography",fprn:"Film Writer",fscn:"Film Scanner",grav:"Gravure",ijet:"Ink Jet Printer",imgs:"Photo Image Setter",mpfr:"Motion Picture Film Recorder",mpfs:"Motion Picture Film Scanner",offs:"Offset Lithography",pjtv:"Projection Television",rpho:"Photographic Paper Printer",rscn:"Reflective Scanner",silk:"Silkscreen",twax:"Thermal Wax Printer",vidc:"Video Camera",vidm:"Video Monitor"}]]);class Ft extends ge{static canHandle(e,t,i){return 237===e.getUint8(t+1)&&"Photoshop"===e.getString(t+4,9)&&void 0!==this.containsIptc8bim(e,t,i)}static headerLength(e,t,i){let n,s=this.containsIptc8bim(e,t,i);if(void 0!==s)return n=e.getUint8(t+s+7),n%2!=0&&(n+=1),0===n&&(n=4),s+8+n}static containsIptc8bim(e,t,i){for(let n=0;n { - if (x.name.startsWith('enable_') && !x.checked) disable.push(x.name.substring(7)); - if (x.name.startsWith('update_') && x.checked) update.push(x.name.substring(7)); - }); - restartReload(); - log('Extensions apply:', { disable, update }); - return [JSON.stringify(disable), JSON.stringify(update), disable_all]; -} - -function extensions_check(info, extensions_disabled_list, search_text, sort_column) { - const disable = []; - gradioApp().querySelectorAll('#extensions input[type="checkbox"]').forEach((x) => { - if (x.name.startsWith('enable_') && !x.checked) disable.push(x.name.substring(7)); - }); - const id = randomId(); - log('Extensions check:', { disable }); - return [id, JSON.stringify(disable), search_text, sort_column]; -} - -function install_extension(button, url) { - button.disabled = 'disabled'; - button.value = 'Installing...'; - button.innerHTML = 'installing'; - const textarea = gradioApp().querySelector('#extension_to_install textarea'); - textarea.value = url; - updateInput(textarea); - log('Extension install:', { url }); - gradioApp().querySelector('#install_extension_button').click(); -} - -function uninstall_extension(button, url) { - button.disabled = 'disabled'; - button.value = 'Uninstalling...'; - button.innerHTML = 'uninstalling'; - const textarea = gradioApp().querySelector('#extension_to_install textarea'); - textarea.value = url; - updateInput(textarea); - log('Extension uninstall:', { url }); - gradioApp().querySelector('#uninstall_extension_button').click(); -} - -function update_extension(button, url) { - button.value = 'Updating...'; - button.innerHTML = 'updating'; - const textarea = gradioApp().querySelector('#extension_to_install textarea'); - textarea.value = url; - updateInput(textarea); - log('Extension update:', { url }); - gradioApp().querySelector('#update_extension_button').click(); -} diff --git a/javascript/generationParams.js b/javascript/generationParams.js deleted file mode 100644 index 33219e916..000000000 --- a/javascript/generationParams.js +++ /dev/null @@ -1,44 +0,0 @@ -// attaches listeners to the txt2img and img2img galleries to update displayed generation param text when the image changes - -function attachGalleryListeners(tabName) { - const gallery = gradioApp().querySelector(`#${tabName}_gallery`); - if (!gallery) return null; - gallery.addEventListener('click', () => { - // log('galleryItemSelected:', tabName); - const btn = gradioApp().getElementById(`${tabName}_generation_info_button`); - if (btn) btn.click(); - }); - gallery?.addEventListener('keydown', (e) => { - if (e.keyCode === 37 || e.keyCode === 39) gradioApp().getElementById(`${tabName}_generation_info_button`).click(); // left or right arrow - }); - return gallery; -} - -let txt2img_gallery; -let img2img_gallery; -let control_gallery; -let modal; - -async function initiGenerationParams() { - const t0 = performance.now(); - if (!modal) modal = gradioApp().getElementById('lightboxModal'); - if (!modal) return; - - const modalObserver = new MutationObserver((mutations) => { - mutations.forEach((mutationRecord) => { - const tabName = getENActiveTab(); - if (mutationRecord.target.style.display === 'none') { - const btn = gradioApp().getElementById(`${tabName}_generation_info_button`); - if (btn) btn.click(); - } - }); - }); - - if (!txt2img_gallery) txt2img_gallery = attachGalleryListeners('txt2img'); - if (!img2img_gallery) img2img_gallery = attachGalleryListeners('img2img'); - if (!control_gallery) control_gallery = attachGalleryListeners('control'); - modalObserver.observe(modal, { attributes: true, attributeFilter: ['style'] }); - const t1 = performance.now(); - log('initGenerationParams', Math.round(t1 - t0)); - timer('initGenerationParams', t1 - t0); -} diff --git a/javascript/hires.js b/javascript/hires.js deleted file mode 100644 index e0bd546dc..000000000 --- a/javascript/hires.js +++ /dev/null @@ -1,10 +0,0 @@ -function onCalcResolutionHires(width, height, hr_scale, hr_resize_x, hr_resize_y, hr_upscaler) { - const setInactive = (elem, inactive) => elem.classList.toggle('inactive', !!inactive); - const hrUpscaleBy = gradioApp().getElementById('txt2img_hr_scale'); - const hrResizeX = gradioApp().getElementById('txt2img_hr_resize_x'); - const hrResizeY = gradioApp().getElementById('txt2img_hr_resize_y'); - setInactive(hrUpscaleBy, hr_resize_x > 0 || hr_resize_y > 0); - setInactive(hrResizeX, hr_resize_x === 0); - setInactive(hrResizeY, hr_resize_y === 0); - return [width, height, hr_scale, hr_resize_x, hr_resize_y, hr_upscaler]; -} diff --git a/javascript/iframeResizer.min.js b/javascript/iframeResizer.min.js deleted file mode 100644 index d0556306b..000000000 --- a/javascript/iframeResizer.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/*! iFrame Resizer (iframeSizer.contentWindow.min.js) - v4.3.5 - 2023-03-08 - * Desc: Include this file in any page being loaded into an iframe - * to force the iframe to resize to the content size. - * Requires: iframeResizer.min.js on host page. - * Copyright: (c) 2023 David J. Bradshaw - dave@bradshaw.net - * License: MIT - */ -!function(a){if("undefined"!=typeof window){var r=!0,P="",u=0,c="",s=null,D="",d=!1,j={resize:1,click:1},l=128,q=!0,f=1,n="bodyOffset",m=n,H=!0,W="",h={},g=32,B=null,p=!1,v=!1,y="[iFrameSizer]",J=y.length,w="",U={max:1,min:1,bodyScroll:1,documentElementScroll:1},b="child",V=!0,X=window.parent,T="*",E=0,i=!1,Y=null,O=16,S=1,K="scroll",M=K,Q=window,G=function(){x("onMessage function not defined")},Z=function(){},$=function(){},_={height:function(){return x("Custom height calculation function not defined"),document.documentElement.offsetHeight},width:function(){return x("Custom width calculation function not defined"),document.body.scrollWidth}},ee={},te=!1;try{var ne=Object.create({},{passive:{get:function(){te=!0}}});window.addEventListener("test",ae,ne),window.removeEventListener("test",ae,ne)}catch(e){}var oe,o,I,ie,N,A,C={bodyOffset:function(){return document.body.offsetHeight+ye("marginTop")+ye("marginBottom")},offset:function(){return C.bodyOffset()},bodyScroll:function(){return document.body.scrollHeight},custom:function(){return _.height()},documentElementOffset:function(){return document.documentElement.offsetHeight},documentElementScroll:function(){return document.documentElement.scrollHeight},max:function(){return Math.max.apply(null,e(C))},min:function(){return Math.min.apply(null,e(C))},grow:function(){return C.max()},lowestElement:function(){return Math.max(C.bodyOffset()||C.documentElementOffset(),we("bottom",Te()))},taggedElement:function(){return be("bottom","data-iframe-height")}},z={bodyScroll:function(){return document.body.scrollWidth},bodyOffset:function(){return document.body.offsetWidth},custom:function(){return _.width()},documentElementScroll:function(){return document.documentElement.scrollWidth},documentElementOffset:function(){return document.documentElement.offsetWidth},scroll:function(){return Math.max(z.bodyScroll(),z.documentElementScroll())},max:function(){return Math.max.apply(null,e(z))},min:function(){return Math.min.apply(null,e(z))},rightMostElement:function(){return we("right",Te())},taggedElement:function(){return be("right","data-iframe-width")}},re=(oe=Ee,N=null,A=0,function(){var e=Date.now(),t=O-(e-(A=A||e));return o=this,I=arguments,t<=0||O+~]|"+ge+")"+ge+"*"),b=new RegExp(ge+"|>"),A=new RegExp(g),D=new RegExp("^"+t+"$"),N={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+d),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},L=/^(?:input|select|textarea|button)$/i,j=/^h\d$/i,O=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,P=/[+~]/,H=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),q=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=K(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{E.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){E={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(V(e),e=e||T,C)){if(11!==d&&(u=O.exec(t)))if(i=u[1]){if(9===d){if(!(a=e.getElementById(i)))return n;if(a.id===i)return E.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return E.call(n,a),n}else{if(u[2])return E.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return E.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||p&&p.test(t))){if(c=t,f=e,1===d&&(b.test(t)||m.test(t))){(f=P.test(t)&&X(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=k)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+G(l[o]);c=l.join(",")}try{return E.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>x.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function B(e){return e[k]=!0,e}function F(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function $(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function U(a){return B(function(o){return o=+o,B(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function X(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",R),le.getById=F(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=F(function(e){return i.call(e,"*")}),le.scope=F(function(){return T.querySelectorAll(":scope")}),le.cssHas=F(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(x.filter.ID=function(e){var t=e.replace(H,q);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(x.filter.ID=function(e){var n=e.replace(H,q);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),x.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},x.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},p=[],F(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||p.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+k+"-]").length||p.push("~="),e.querySelectorAll("a#"+k+"+*").length||p.push(".#.+[+~]"),e.querySelectorAll(":checked").length||p.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||p.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!p||!p.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(H,q),e[3]=(e[3]||e[4]||e[5]||"").replace(H,q),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return N.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&A.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(H,q).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function C(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||E,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:k.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:m,!0)),T.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=m.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,E=ce(m);var S=/^(?:parents|prev(?:Until|All))/,A={children:!0,contents:!0,next:!0,prev:!0};function D(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Te=/^$|^module$|\/(?:java|ecma)script/i;re=m.createDocumentFragment().appendChild(m.createElement("div")),(be=m.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),re.appendChild(be),le.checkClone=re.cloneNode(!0).cloneNode(!0).lastChild.checked,re.innerHTML="",le.noCloneChecked=!!re.cloneNode(!0).lastChild.defaultValue,re.innerHTML="",le.option=!!re.lastChild;var Ce={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Ee(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function ke(e,t){for(var n=0,r=e.length;n",""]);var Se=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Me(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Ie(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function We(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n