From e9ea4c5248bc6b761cbf847109f3991dd57cd238 Mon Sep 17 00:00:00 2001 From: Nan <7956213+icrdr@users.noreply.github.com> Date: Wed, 8 Jul 2026 13:48:52 +0800 Subject: [PATCH] 5.0 (#62) * feat: Add Bioxel asset catalog and layer management functionality - Introduced a new asset catalog definition file for Blender to manage Bioxel assets. - Implemented layer caching and snapshot functionality in `layer.py`, allowing for VDB file generation and low-resolution snapshots. - Created node management functions in `node.py` for handling Bioxel nodes within Blender's Geometry Node Editor. - Added an operator to extract mesh data from selected nodes in `structure.py`. - Developed UI panels in `panels.py` for layer management, including import options and layer library display. * Add unit tests for bioxel module and documentation - Created README.md for test instructions and categories. - Implemented comprehensive unit tests for the Data, Layer, and utility functions in the bioxel module. - Added tests for reading NRRD and DICOM formats, data properties, and edge cases. - Included tests for real data files to ensure functionality with actual datasets. * feat: Update .gitattributes and .gitignore for improved asset management and ignore patterns chore: Add app.json and omoolab.css for Obsidian integration refactor: Clean up AGENTS.md and remove outdated test files * feat: Update .gitignore to include scipy_ndimage directory * feat: Update release workflow and manifest for improved dependency management and layer handling * feat: Update .gitignore and add binary files for scipy_ndimage across multiple platforms * feat: Add OPSX commands for archiving, exploring, and proposing changes * feat: Refactor asset library management and update manifest for improved organization * feat: Downgrade h5py version to 3.14.0 in requirements and manifest * feat: Update Help operator and panel labels to use English terminology * Translate documentation to Chinese, add support format details, and enhance styling with new fonts. Update mkdocs configuration for multilingual support and improve package dependencies. * feat: Remove default version setting from extra configuration in mkdocs.yml * fix: Update documentation links to point to the correct URLs for Chinese and English versions * Add documentation for basic usage, supported formats, and performance tips - Created English and Chinese documentation for basic usage of the add-on, including data download, import, extraction, and rendering steps. - Added support format documentation listing compatible file types for the add-on. - Included links to open databases for volumetric data. - Provided performance improvement tips for voxel reconstruction and rendering, including settings for low-resolution previews and balanced rendering configurations. * Add OpenSpec skills for change management and exploration - Implement openspec-apply-change skill for applying tasks from OpenSpec changes. - Create openspec-archive-change skill for archiving completed changes. - Introduce openspec-explore skill for exploring ideas and clarifying requirements. - Add openspec-propose skill for proposing new changes with generated artifacts. - Migrate source command skills: source-command-opsx-apply, source-command-opsx-archive, source-command-opsx-explore, and source-command-opsx-propose for improved command handling. * feat: Update version to 2.0.1, refactor asset library handling, and enhance layer import process * fix: downgrade scipy version to 1.16.3 in build.py and pyproject.toml * Remove deprecated modules and functions from bioxel package - Deleted _ni_support.py, _utils.py, and dtype.py as they contained unused or redundant functions. - Removed the resize function and related utilities from _warps.py to streamline image processing. - Cleaned up the skimage module by removing unnecessary imports and functions. * feat: Add SKIP_MODULE_NAMES to exclude specific modules during import and refactor io_worker import logic * refactor: Remove known limitations section from documentation for EEVEE NEXT support --- .../skills/openspec-apply-change/SKILL.md | 0 .../skills/openspec-archive-change/SKILL.md | 0 .../skills/openspec-explore/SKILL.md | 0 .../skills/openspec-propose/SKILL.md | 0 .../skills/source-command-opsx-apply/SKILL.md | 12 +- .../source-command-opsx-archive/SKILL.md | 12 +- .../source-command-opsx-explore/SKILL.md | 10 +- .../source-command-opsx-propose/SKILL.md | 12 +- .gitignore | 12 +- CLAUDE.md | 1 - README.md | 5 - build.py | 11 +- docs/index.en.md | 9 +- docs/index.md | 10 +- pyproject.toml | 5 +- .../_nd_image.cpython-311-x86_64-linux-gnu.so | Bin 147184 -> 0 bytes .../_nd_image.cpython-313-x86_64-linux-gnu.so | 3 - .../_nd_image.cpython-311-darwin.so | Bin 156204 -> 0 bytes .../_nd_image.cpython-313-darwin.so | 3 - .../macos-x64/_nd_image.cpython-311-darwin.so | Bin 187712 -> 0 bytes .../macos-x64/_nd_image.cpython-313-darwin.so | 3 - .../windows-x64/_nd_image.cp311-win_amd64.pyd | Bin 176128 -> 0 bytes .../windows-x64/_nd_image.cp313-win_amd64.pyd | Bin 177664 -> 0 bytes src/bioxelnodes/__init__.py | 36 +- src/bioxelnodes/asset_library.py | 73 + .../assets/O_Bioxel/O_Bioxel_Nodes.blend | 4 +- src/bioxelnodes/auto_load.py | 5 + src/bioxelnodes/bioxel/layer.py | 25 +- src/bioxelnodes/bioxel/scipy/__init__.py | 5 - src/bioxelnodes/bioxel/scipy/_filters.py | 1823 ----------------- .../bioxel/scipy/_interpolation.py | 314 --- src/bioxelnodes/bioxel/scipy/_ni_support.py | 120 -- src/bioxelnodes/bioxel/scipy/_utils.py | 10 - src/bioxelnodes/bioxel/skimage/__init__.py | 1 - src/bioxelnodes/bioxel/skimage/_utils.py | 37 - src/bioxelnodes/bioxel/skimage/_warps.py | 319 --- src/bioxelnodes/bioxel/skimage/dtype.py | 605 ------ src/bioxelnodes/blender_manifest.toml | 7 +- src/bioxelnodes/layer.py | 26 +- src/bioxelnodes/operators/io.py | 498 ++--- src/bioxelnodes/operators/io_worker.py | 263 +++ src/bioxelnodes/operators/misc.py | 22 + src/bioxelnodes/panels.py | 21 +- uv.lock | 25 +- 44 files changed, 658 insertions(+), 3689 deletions(-) rename {.claude => .agents}/skills/openspec-apply-change/SKILL.md (100%) rename {.claude => .agents}/skills/openspec-archive-change/SKILL.md (100%) rename {.claude => .agents}/skills/openspec-explore/SKILL.md (100%) rename {.claude => .agents}/skills/openspec-propose/SKILL.md (100%) rename .claude/commands/opsx/apply.md => .agents/skills/source-command-opsx-apply/SKILL.md (94%) rename .claude/commands/opsx/archive.md => .agents/skills/source-command-opsx-archive/SKILL.md (95%) rename .claude/commands/opsx/explore.md => .agents/skills/source-command-opsx-explore/SKILL.md (97%) rename .claude/commands/opsx/propose.md => .agents/skills/source-command-opsx-propose/SKILL.md (94%) delete mode 100644 CLAUDE.md delete mode 100644 scipy_ndimage/linux-x64/_nd_image.cpython-311-x86_64-linux-gnu.so delete mode 100644 scipy_ndimage/linux-x64/_nd_image.cpython-313-x86_64-linux-gnu.so delete mode 100644 scipy_ndimage/macos-arm64/_nd_image.cpython-311-darwin.so delete mode 100644 scipy_ndimage/macos-arm64/_nd_image.cpython-313-darwin.so delete mode 100644 scipy_ndimage/macos-x64/_nd_image.cpython-311-darwin.so delete mode 100644 scipy_ndimage/macos-x64/_nd_image.cpython-313-darwin.so delete mode 100644 scipy_ndimage/windows-x64/_nd_image.cp311-win_amd64.pyd delete mode 100644 scipy_ndimage/windows-x64/_nd_image.cp313-win_amd64.pyd create mode 100644 src/bioxelnodes/asset_library.py delete mode 100644 src/bioxelnodes/bioxel/scipy/__init__.py delete mode 100644 src/bioxelnodes/bioxel/scipy/_filters.py delete mode 100644 src/bioxelnodes/bioxel/scipy/_interpolation.py delete mode 100644 src/bioxelnodes/bioxel/scipy/_ni_support.py delete mode 100644 src/bioxelnodes/bioxel/scipy/_utils.py delete mode 100644 src/bioxelnodes/bioxel/skimage/__init__.py delete mode 100644 src/bioxelnodes/bioxel/skimage/_utils.py delete mode 100644 src/bioxelnodes/bioxel/skimage/_warps.py delete mode 100644 src/bioxelnodes/bioxel/skimage/dtype.py create mode 100644 src/bioxelnodes/operators/io_worker.py diff --git a/.claude/skills/openspec-apply-change/SKILL.md b/.agents/skills/openspec-apply-change/SKILL.md similarity index 100% rename from .claude/skills/openspec-apply-change/SKILL.md rename to .agents/skills/openspec-apply-change/SKILL.md diff --git a/.claude/skills/openspec-archive-change/SKILL.md b/.agents/skills/openspec-archive-change/SKILL.md similarity index 100% rename from .claude/skills/openspec-archive-change/SKILL.md rename to .agents/skills/openspec-archive-change/SKILL.md diff --git a/.claude/skills/openspec-explore/SKILL.md b/.agents/skills/openspec-explore/SKILL.md similarity index 100% rename from .claude/skills/openspec-explore/SKILL.md rename to .agents/skills/openspec-explore/SKILL.md diff --git a/.claude/skills/openspec-propose/SKILL.md b/.agents/skills/openspec-propose/SKILL.md similarity index 100% rename from .claude/skills/openspec-propose/SKILL.md rename to .agents/skills/openspec-propose/SKILL.md diff --git a/.claude/commands/opsx/apply.md b/.agents/skills/source-command-opsx-apply/SKILL.md similarity index 94% rename from .claude/commands/opsx/apply.md rename to .agents/skills/source-command-opsx-apply/SKILL.md index ae14f0f..1cb9c4b 100644 --- a/.claude/commands/opsx/apply.md +++ b/.agents/skills/source-command-opsx-apply/SKILL.md @@ -1,10 +1,14 @@ --- -name: "OPSX: Apply" -description: Implement tasks from an OpenSpec change (Experimental) -category: Workflow -tags: [workflow, artifacts, experimental] +name: "source-command-opsx-apply" +description: "Implement tasks from an OpenSpec change (Experimental)" --- +# source-command-opsx-apply + +Use this skill when the user asks to run the migrated source command `opsx-apply`. + +## Command Template + Implement tasks from an OpenSpec change. **Input**: Optionally specify a change name (e.g., `/opsx:apply add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes. diff --git a/.claude/commands/opsx/archive.md b/.agents/skills/source-command-opsx-archive/SKILL.md similarity index 95% rename from .claude/commands/opsx/archive.md rename to .agents/skills/source-command-opsx-archive/SKILL.md index 5e91608..47b6b07 100644 --- a/.claude/commands/opsx/archive.md +++ b/.agents/skills/source-command-opsx-archive/SKILL.md @@ -1,10 +1,14 @@ --- -name: "OPSX: Archive" -description: Archive a completed change in the experimental workflow -category: Workflow -tags: [workflow, archive, experimental] +name: "source-command-opsx-archive" +description: "Archive a completed change in the experimental workflow" --- +# source-command-opsx-archive + +Use this skill when the user asks to run the migrated source command `opsx-archive`. + +## Command Template + Archive a completed change in the experimental workflow. **Input**: Optionally specify a change name after `/opsx:archive` (e.g., `/opsx:archive add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes. diff --git a/.claude/commands/opsx/explore.md b/.agents/skills/source-command-opsx-explore/SKILL.md similarity index 97% rename from .claude/commands/opsx/explore.md rename to .agents/skills/source-command-opsx-explore/SKILL.md index 1757907..8b5c091 100644 --- a/.claude/commands/opsx/explore.md +++ b/.agents/skills/source-command-opsx-explore/SKILL.md @@ -1,10 +1,14 @@ --- -name: "OPSX: Explore" +name: "source-command-opsx-explore" description: "Enter explore mode - think through ideas, investigate problems, clarify requirements" -category: Workflow -tags: [workflow, explore, experimental, thinking] --- +# source-command-opsx-explore + +Use this skill when the user asks to run the migrated source command `opsx-explore`. + +## Command Template + Enter explore mode. Think deeply. Visualize freely. Follow the conversation wherever it goes. **IMPORTANT: Explore mode is for thinking, not implementing.** You may read files, search code, and investigate the codebase, but you must NEVER write code or implement features. If the user asks you to implement something, remind them to exit explore mode first and create a change proposal. You MAY create OpenSpec artifacts (proposals, designs, specs) if the user asks—that's capturing thinking, not implementing. diff --git a/.claude/commands/opsx/propose.md b/.agents/skills/source-command-opsx-propose/SKILL.md similarity index 94% rename from .claude/commands/opsx/propose.md rename to .agents/skills/source-command-opsx-propose/SKILL.md index 05276f4..c488f25 100644 --- a/.claude/commands/opsx/propose.md +++ b/.agents/skills/source-command-opsx-propose/SKILL.md @@ -1,10 +1,14 @@ --- -name: "OPSX: Propose" -description: Propose a new change - create it and generate all artifacts in one step -category: Workflow -tags: [workflow, artifacts, experimental] +name: "source-command-opsx-propose" +description: "Propose a new change - create it and generate all artifacts in one step" --- +# source-command-opsx-propose + +Use this skill when the user asks to run the migrated source command `opsx-propose`. + +## Command Template + Propose a new change - create the change and generate all artifacts in one step. I'll create a change with artifacts: diff --git a/.gitignore b/.gitignore index 4075260..1539f22 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ # Tempary files temp sandbox.* -notes/ +/notes/ # Environments .env @@ -22,11 +22,11 @@ secrets/ SECRETS/ secrets.bak/ -# Claude +# Claude Code +.claude/settings.local.json .claudian # Obsidian - .obsidian/* !.obsidian/snippets !.obsidian/app.json @@ -389,8 +389,4 @@ dist # Vite files vite.config.js.timestamp-* vite.config.ts.timestamp-* -.vite/ - - -# Scipy -!scipy_ndimage/*/** \ No newline at end of file +.vite/ \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index eef4bd2..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -@AGENTS.md \ No newline at end of file diff --git a/README.md b/README.md index dd740f9..74dbd12 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,6 @@ If you want to cite this work, you can cite it from Zenodo: [![DOI](https://zenodo.org/badge/786623459.svg)](https://zenodo.org/badge/latestdoi/786623459) -## Known Limitations - -- Only one cutter supported in EEVEE render -- Shader fail to work when convert to mesh. -- Section surface cannot be generated when convert to mesh (will be supported soon) ## Roadmap diff --git a/build.py b/build.py index bb61153..a74e49c 100644 --- a/build.py +++ b/build.py @@ -19,7 +19,8 @@ required_packages = ["SimpleITK==2.5.5", "transforms3d==0.4.2", "tifffile==2024.7.24", "matplotlib==3.10.7", - "pillow==11.2.1"] + "pillow==11.2.1", + "scipy==1.16.3"] platforms = {"windows-x64": Platform(pypi_suffix="win_amd64", @@ -33,7 +34,8 @@ platforms = {"windows-x64": Platform(pypi_suffix="win_amd64", packages_to_remove = { "imagecodecs", - "numpy" + "numpy", + "packaging" } @@ -45,7 +47,6 @@ def run_python(args: str): def build_extension(platform: Platform, python_version: str) -> None: wheel_dirpath = Path("./src/bioxelnodes/wheels") toml_filepath = Path("./src/bioxelnodes/blender_manifest.toml") - scipy_ndimage_dirpath = Path("./scipy_ndimage", platform.blender_tag) # download required_packages run_python( @@ -62,10 +63,6 @@ def build_extension(platform: Platform, python_version: str) -> None: and "universal2" in f.name ): f.rename(Path(f.parent, f.name.replace("universal2", "arm64"))) - - for ndimage_filepath in scipy_ndimage_dirpath.iterdir(): - to_filepath = Path("./src/bioxelnodes/bioxel/scipy", ndimage_filepath.name) - shutil.copy(ndimage_filepath, to_filepath) # Load the TOML file with toml_filepath.open("r") as file: diff --git a/docs/index.en.md b/docs/index.en.md index 8127958..38bd37f 100644 --- a/docs/index.en.md +++ b/docs/index.en.md @@ -49,15 +49,8 @@ Welcome to our [discord server](https://discord.gg/pYkNyq2TjE), if you have any ![eevee](https://omoolab.github.io/BioxelNodes/latest/assets/eevee.gif) -👍 EEVEE NEXT is absolutely AWESOME! Bioxel Nodes is fully support EEVEE NEXT now! However, there are some limitations: +👍 EEVEE NEXT is absolutely AWESOME! Bioxel Nodes is fully support EEVEE NEXT now! -1. Only one cutter supported. -2. EEVEE result is not that great as Cycles does. - -## Known Limitations - -- Only works with Cycles CPU , Cycles GPU (OptiX), EEVEE -- Section surface cannot be generated when convert to mesh (will be supported soon) ## Roadmap diff --git a/docs/index.md b/docs/index.md index eb49c69..08bdb10 100644 --- a/docs/index.md +++ b/docs/index.md @@ -49,15 +49,7 @@ Bioxel Nodes 是一款用于科学体数据可视化的 Blender 插件。它利 ![eevee](https://omoolab.github.io/BioxelNodes/latest/assets/eevee.gif) -EEVEE NEXT 太棒了!Bioxel Nodes 现在全面支持 EEVEE NEXT!但仍有以下限制: - -1. 仅支持一个切割器 -2. EEVEE 渲染效果不如 Cycles - -## 已知限制 - -- 仅支持 Cycles CPU、Cycles GPU (OptiX)、EEVEE -- 转换为网格时无法生成剖面(即将支持) +EEVEE NEXT 太棒了!Bioxel Nodes 现在全面支持 EEVEE NEXT! ## 路线图 diff --git a/pyproject.toml b/pyproject.toml index 76a5938..585afb5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,8 @@ [project] name = "bioxelnodes" -version = "1.0.9" +version = "2.0.1" description = "" -authors = [{ name = "Ma Nan", email = "icrdr2010@outlook.com" }] +authors = [{ name = "MaNan", email = "icrdr2010@outlook.com" }] requires-python = ">=3.11.0,<3.12.dev0" readme = "README.md" license = "MIT" @@ -13,6 +13,7 @@ dependencies = [ "h5py==3.11.0", "transforms3d==0.4.2", "matplotlib==3.10.7", + "scipy==1.16.3", ] [dependency-groups] diff --git a/scipy_ndimage/linux-x64/_nd_image.cpython-311-x86_64-linux-gnu.so b/scipy_ndimage/linux-x64/_nd_image.cpython-311-x86_64-linux-gnu.so deleted file mode 100644 index 60edc5b7eb2f2b640974eefeea88046a24485117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147184 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 diff --git a/scipy_ndimage/linux-x64/_nd_image.cpython-313-x86_64-linux-gnu.so b/scipy_ndimage/linux-x64/_nd_image.cpython-313-x86_64-linux-gnu.so deleted file mode 100644 index e510baa..0000000 --- a/scipy_ndimage/linux-x64/_nd_image.cpython-313-x86_64-linux-gnu.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:132fd2fbc28d98b7f21e33e75516def2d8ea86d2ad2547cfe25ea419e33098ea -size 175504 diff --git a/scipy_ndimage/macos-arm64/_nd_image.cpython-311-darwin.so b/scipy_ndimage/macos-arm64/_nd_image.cpython-311-darwin.so deleted file mode 100644 index 15ffc086f01bc73e9e2abbe48411d9ab29d350ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156204 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

{h0ZrZ$-8~RNmFFy$@&$CA{Q?9 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 F{uku+yr2L8 diff --git a/scipy_ndimage/macos-arm64/_nd_image.cpython-313-darwin.so b/scipy_ndimage/macos-arm64/_nd_image.cpython-313-darwin.so deleted file mode 100644 index ac493f0..0000000 --- a/scipy_ndimage/macos-arm64/_nd_image.cpython-313-darwin.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd95c5ce36744532629f59bd8610ae67631b3f37916d71d0e3f869c0ab54bd7e -size 156160 diff --git a/scipy_ndimage/macos-x64/_nd_image.cpython-311-darwin.so b/scipy_ndimage/macos-x64/_nd_image.cpython-311-darwin.so deleted file mode 100644 index 3a51057538d70da5984068012cf1e76b318b9946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187712 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

wm3r#kt_WAi2hl1bjT(;LJRT#U_uI+ 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 cvj{Zw9gMo1?Y}}Ow|>RSq+c1> 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 diff --git a/scipy_ndimage/windows-x64/_nd_image.cp313-win_amd64.pyd b/scipy_ndimage/windows-x64/_nd_image.cp313-win_amd64.pyd deleted file mode 100644 index 6d433a110872d3031f8723118764d8e7fd490d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177664 zcmdpf3wTu3)%Hx1fp9%R8H*Qc)X@e}APOz1w?q;>gC~fJ5|q+tG$LY2bs}gHqM1OZ zhr#HFEp2T@d$Sf5tp&7JCjr7m&~Ot3te~iKh)P7|=4Jl(UHhE5WkBuU@A;qp^FYqo zx3%|Ld+oK>Ui)&&uWfQ=yIigu{Ex+4uBCYLS1f;z{-+Mfy-$9jx9hoX>rPqfHrAao zX5uY(uS3zb(J&`k(w{N+AD+oAPh3{Ym~UKgln>{HpxhrrdbbpkBSY`)tso z%UrG-XZ1*_sKYhr)E-$`K38d$%k?b&5&LGy_@A);50Tv`k=r~(*lTp{9@q2CKC6w{FScJm4j})KEQS^^59P;@^rydw{gcS zf5ooK$e`O*#+ow_QG;|gYE-9u#e-^8KEV;VO5Jy+=NnQyXqsKI1~`lCe6up-yWx&I zkVE>+6-iB(c>Jkj`)*S3gyx{Vi&=k>n!nhEdT&wrq)&Dty&v+;@02exXvCFc2)~kl zT;Ks_VLOw4#jfJWpul8lpKw8*osT@0^pkwI-!yqjl}q(?zMb#6^n61uPAc|a`KpI| z9eO&;WlfH_UE0aTu9B-u##}x2nyd8s4+{LDwdJ7|4I66jHoYGpQ(>fG!;A^_d)&I& zzwbR+uCl`2FS~(t$onc%b@S{?U(a&2_tZ`fmls?&;m1EJ8DH|FW!lNE`onIm;b|n? zq?nfwJ2{9nq!zVm!6kUH8=!{{vH|C^_IH?n*d*59 zrT(B>)o*rbh-kq-qJ$m!0$v+pTJSzXGd znOY6}J4aUwT|n;;ibX#F!YjK1mP?;~u4J~{u~@802x?u8SCzjoqR-B@0`ahJdM#;D zuMK#t>_VDFUj{Ji0_JH#`d?J~gLp*$$ZEQ<%~pY=D{^=FCkpgLL{rH%>~ZPud=Tes z6!M4Gg^nu;Z8Ad3(DxHePsfv4E}%awIoSOjxGyiw*?Ll5nXn2EYmyx@Kxk^bRQ>h{U6# zyVfCRs1+@lR8s$iyS65JGN^_07f1v);x#8n?VNZs|ADx8;CIP^KB&Q}M6<~E(f?6p z0XbW17>QWxWc+DjO$Ws#Nz|(Hm8ED<3J<)q@=N1N}X>+>MSwi$L?=eU*|5 ze%3>4zyh-tV#xJDCp00@jX8G%4%@M;DfP#JI0QhaqeNNZ>N4;{XyeLKUp{4A;RYSA zqHbbMm52bB>Y;4yp@_CP0%8xjZkZ~7Uaz4TnkX5#2(X64VI=`@U>*sOc5)q2QhdFV zWZ+mu4N2G&Kgf;34KeS$O{}k(!`V8BLJomS#wv~z8FTLk(Oem1zx!*J%P@=c^l;Ee z3q%jCH$uS72+#2?l5nYS2oo1F5cXbj9if8?F>eo4#1VWhm_Rp!lHDBLPd9b&v!@Jz zV@(}71lj5&>*na;x>=ED7WXSP?>-4|CYOXSjnyCQrp?}r3S!=mHY)fvAgC4`4;>3w zhn_%W_(fj?S;|6(gzNN`K?#!{{?I|xnx}`R`zqNl#fWp^Ioy6yc)8*o#+Q7?#G0Zg z?H2*51v{YEbyHz&gcthSkfZQJBeW-)^#Iuad9r$0=&%v??7J4tY1psLeFjC$c|w|! z`dD{u_PK!P(EGBgoF>B^iR}aeO~fkf?Zbj*Zp^DQjAqoZ8M=uV{odv55k~-*Oep!W zJx+Bq8^XY=qax`b^U6HE2qN4-gUT9KYYh*9#(wjfJij@r04aB7>!BL5J zUEyj!g?bQLci{Y7a$fKK>1Jat!uol7?me6JsttO5vs(|%*|e3B z*$;2pN+O2K+@c-tLUV0?(L*bQWoB)LEHtz6-bHITfI`3l#7y)xyZU;FDE2OUS-NHn z&_GXTNk_Av-$#4U&BH~O1*Lh~V)9K2tl@y=6<9VL_So>OJG(Sy5wtK+b|2)b|0NO{ zv#cnjsKd`kfVTo!>~_^o9-cKL9o9XU1I_}%k^TW6Cm03&qXmNsK!WeaBLXQive8T6 zJ7${mmjwT!Fz8JeLvA5CxrrW(W6!fh^5gkI2&+<@*5!z4^TW?fN_Dx1t zLIuXWC&HLk)|M9hGv-x#!-rbK89n*3Ukk2d3{9SCy}(D{kuF+r0~0a&r|F@gTbVt0 za~@*qm$~)x#``L?hPLjQj+ig{>R7qC(AS8kfoGG1hkg7iWbErADIXG0hHrHA#>H;r zo#UI2JkhZdFnrUZ<#_Wa>i4t$6F^nF{M64$x#-kw#t95dJG*KPS1=Gd6!TVs zfN{BHjX*Sd=gy>#s-M8l!?1qp3&j?sF#3oh$?T?wa=KgdkV1)K9wYJSrTY+*&Z=bl zNdhCz_O;g+Wnt`7wjnkADFzN$zKq~Z&v76HB=1t zk6=CtK6oC9)?TzU=KT}%K@ZhfwTB6)TPTZ-{3U=Jp^szUp8&44RoJSJ_HwTFa^JjA z+Y6A?t^up+BW`^@RV~U__(RL1yPiW;2#nT4E2US?llp9(0!^~?=jRX!|=14J;) zhedXZ9r!F8hDD z)BTH6(ZAg8{?lZh^PlN|g+GL%gTH8~;7t%n-~_X8-auy@bQ%TQpGl*_FcEzTDm*(o zL4{KA{z8l<$^v^Bh$)vg3{3DjsGx%i7zDjI2nJ>)jes#W2?`SWT=aJ1k;Z{x)=_U8 z=M^ix?FSl02>dU48~Pi1o8v&}@CE}I2Y1Ri=qC0j@ZTbGAp87W$VS?pkO5yr-&~Z2 z{SSm>3GAPnmB2oM{843q8D{|?-@``U8T?n+sGn}zWB0 z65o3%!I|0Vez@UYMCb9g#>8ZdJLIxJoqkT7JT zJ#37p>2%ID?FWsNITf4<{ZP1_p$eBa_twvl60(g{JZYqshLrJYz_hG%{BSvMB1H_P zN?O084b!)^ykWOCH;WKVPxs%z6$Yce+`MMEVK(jrcfw|>Lz()6m}KAjDQvT_XZdAW zE*MG9EL&RwJH6UA)U7L#M_Y`TMrFBMC5X^Xx9;9b)M&(8gO~??6WZP5B)JU!jA`Ff zW^WnH#Sx69X+Lo}tVCGx4L_7JYzkPOhCA^}x6t*KIm4MFVX1qjE(3tD_r8&|N@1Q} zim*js34K)xc#{ibWet&;r&zy0ac90BI;_{PgrtQv8bL9C(U*a{L8aZl%ECnCpzVVD zgD-+2CC}5PMFr}3KWMENBaZHnA$&5Tz|N@&8~h8z zq2}6IG^%U-p$+dY|w(=Ay368{G(*TpVR8h_l<#% zAIWYw+I-*0UYMBgp9eg&;Aw1RXoWQtlBEnSD-E>`beB2}vu;3iiM9m1wxnB0sAa&a zYL%wXN3*R`NqrfqFEh1$XBq^R>${R`F>)THl!;OUlI_zY!I~OYL_H8 zWed7b>_?hmGW5-WZyFXFbaQB{9?n_DaZ?8}>SjN3YC~kkFv)L(-j*Kk+nnXP%$)Nc z%_@KWax7JhF3{mzGRzYU?dk0!Lp}Q$MeoVKJ*j_`oi*%)moauO=^zn27vde` z&~=GD4tq0f4mY$}0++|UMW`7vqYQbjK_1xf@RBEawqYqj z+T^>wMt?SXp`DmYpAY2E5#+nYynPUdT<62L zEk%khEJ!b zYPcTuY=o~15PK0KqOjT{9xRv%NSp=f%wnTij4u`Pf_zv3>V~>O=e`Eo4e>n&jxUf` zkA7T5xx*?NRtNH6cEPObrpzjL;AW9cnNohll!{C#r^UP;)P<2$7%2yn_QK-bjo7ad z^R^-y$WL6>6!W&=y?wJIPh#F@8GaxUevIMYIAPFd8tCK2`X4bKZ_}re_>n%aLcqvO znh5F~C{ffQ!QQ5)(4iDO4?-zY0OXmNM4mlMg*-!PxJ)E&uoMm7cp7?ADjyW9h?YJh zBhuT13XnW8)>I?&X0{*$`5=&yDO1WBG4D>)m_nqB(CnD^(dUIo(}X``-d`iwj+Md( z`CODl5AuuW9YqiLFpt15?;K(d@0-PnBEm1=F2yfhSo}!*^2U+`zkpSMJ(1C)4@~+x ze#yuc!Y`vUkpld(8Fi(QVkp`h^Zo)9a`@#zyeIR^eGDh@%k2y&_~qUYXcmD)Z|@=j zY%4}lNxGd}Gm(TC&D2I@2ANtfQe@J}NjEZ8c&dhPWTuA>0vO(fjKXsmcAQy&h&4&f z^xMTkyUTUcu9$4FPs>vk83@&ou_{T{X#xZW_@hF$Iqb60-?0AZ9(PA#OroR>Oc$R_F=JI=!NZJN!Traj{S%JZg6h){pA| zfj=hX$GkuMyO6jNgbR>F(}cXz>E;|?9Wo-{aCQKjBl9(`)Ul%#oe5_MO4krx)Ep%Q zKYtDhuF5B9j>&Xq%8qyPWl9_z^SaT%6tY)dK(e2RI-cs}j@5+#`M07#~g1nv%PRzqz4b>4x;a~_%A+juA+5B6R5P`|;Tfi*^ zAn+T169Ny@L8ByrNcACIoloYiiQfLG5H8y!;l5rXRtr04A{pp;1X+1z%=;V~lS0g6 z&nGc!pA%w|G!U1iuw1>95Y_%_%zFc$4?6UVd9P$RPETilg}sBzd}fHu{l);(F#cdq zPkCrv^cqkSOGUCe#LZQDs0F(0LWPLgLkm(tgDI&GKBs zyaaCNmYDY*Nn9a?4hcY%C}5eWJdh>-cVRQnVG^gvV-_+5r_*mLR*#qSUZ!tWwxDQ`rGK(>$_!`?wZRNT%1 zuy>ylB*OV3;~~3kK?2@}@U{gH*j~gJx2M#Bp!{*5I78rd?2P1m0xUmS_?9NYL<2H~ z9LJ0t9MdRQ>g=NV(R8r^wckLS zzB)*{*b?J|c-H86kLo-wQW6BTMAL|kA=-H(HXhC#xe>}_Z zEQkJ({|qPk!?u6lP=f&$ob<$K;4eJ^15k9Uht2|Y#86btsFWce=S6j> z^hOfdw>~LkA4qDz?F(z4vL7TETksxVC8*e6oWHgb%|3?t}w=yN8 zEjb|O{XH6&LhP*Xlh`+6(>KYx!_eM1&nJr^ zypz}YW3hbrZ?PW{!{CQHp_OOrfY}qW4O)ibZ8*n0|^lAyj>SLXo; z5<6WXppO&1DI!hmQyE=i3_+lIrhTA#7$VKlFUt5t!(8Z2N@V_o3u4~8uul@*`D5wE zQuHa)OHF^jvZ7U5!**swq%vL&-{hp(0|lmVlC5{dp3RR=8_Xh}yYBsleNKWUE1ynG z!F^?HUB-ULd~S}kF6R9uFoC}he^WZT<{Up|3%m;cltZ#y^rAuP8j{a6s=|dZ&dxifQ@JWCsex;R)#%^SBVx}UMDTM zjV(wXZV5&xU_85kKNb^Z$BtqETw!+wSR%n6;0n*=J&G5=7YYFLgE2~d(+P3`;o*l@ z_5y#*kRS6_JuX}^#pxI_2D8K&V-NEpasi$Ox}Xuyq^VC*Z6+EAVK6;uTIso#g+15I zB+XS>M{wJu!PxJ_2aiaVs<&ymcgir=&cL>0GVRB)vIR(td2a=NG4H#7PUDr*A&mYL z62U9%$@qR+kDHNLjYAIMlV72%WyJa9ZX~xq67$}Ur*)0P53v6krZFn=0{pQGP{AJ? z)+_#)hoH#wd1~u4x`O@6AG@N)={Pct)8P{t$<{GPWpbYjUx*Mz3iv|x53_+aJQJdd z8^9T=H<>_@(ZI$)6%+u$eS?8u5^wOGJK#YsNeLQdJpMuccbm~vMG~^ zB{)A}c4Cl;C1x;@^=C@_sZ&v=#IwLBe@tT^&mgkT&7cO@haH`y{}I`~7WyAgYm&nc z(Eki`ubiz<&SAdUj{b4xht3%vE_ac9y7`hbQ=BHI0A`9tNR6cE_ueOKDIWuNx`tLn zy@UMDGPIyqAs zFbdPjOVxC85E8Lq38(?gt5qxf81i|b+l(=K_~Kl>Xqgs#i#3N!uoK{5wl-_MRKKb) z;$I*2H}A|5{HwLRo>^L-p4r$ZlxGx0YCqCLtMvMvU)Aq&2fBl4a#|opa+YHDj-{iDY_A37p@lwGPNVD$8AEXnBpD?fVUtvT&6FnsxzKT}W zerV~)mB!EF7h3?L=w==H*sgmrComPOfZT*4~!jY_KcPApxa^46x<)%EPI&) z|FVf6_j=TJ6QchfFw|~m$9FM2<+z32-(1fQ_d5Gb4*!X4M`#&G!xP-<0cw8y zcyA`*W#0&ljjt3!n-xNL!7D&-j=hqS9Vo}vmB2CfaOh4}<8TOEBC_Ea;T+kT(a0lU zan5Zxh|Uuxco6kidk_-3O4rOp6kW9Ndr6z7F#NQ`#ahGNfF#7chGi!s1SV1bfP}qt zr7Wp9W`oQsr=jmB^+0UZ9jza@;cjnf0O)9BROMZX|e`7!me{3h>~zpV16E=5HsP=Ls8H9iN#r;IHfq zBta%UCjR3ENQ`-}K}|7l+wan}+Tiao`T;g0VHDZ@hjmqCM{_43lQj2Ugp=%|8&E9a z?}YwC*t!fnAp8RT$MAS3%(G~@06+&mL#>XvkRpbfumb`#)c*c2#e2mpvcS$orrfbIi7ACFXak$aA6}QL zH-YN7t>!;WZq$PJBF)jxWJ>0ZoAV$Q_sfwQwA$DhQhEWNBrvNIlkIW5pphcDS+6qc ziNp|OuT!b{QQr?)&Qp5_nZll*#f>$G6Fc$pODN9lf>&RnSn(dBxZvk0i-gkbJ#_SjS82tw%CQP_u;^Jl$?0=*y`yVB(vxRYsQQ~eSw?7K| zA5ZHC4nM>GXIM{!uVi?f6He2ITuXg^1sRj#4W}x@aCy-)Fd9vkPR&OX=1CKqf33Q; z8|*a0oJ_A+z&Dy=ys;IXsRh?yBX)^-Nk8=c+)ruDRju-CPp{LPcjZK1dI!2e58sTKP#44WOu!3a7VDwIG4EC&AUg(&uoYCB+bs4b2Sey{y-M!~)3JN_ zq;7iEcI;kx%U^%~4%f5=G4CFh5)Fwh8dAg)LzH0-Yr>;&Kbr&Y1RR_fCF-M?2^;P8 z_6xWkAlo&Q7BHR_!tUc~(2%9qx4L8A`&k7c@K9AzO+Rg}2Qd6*&mASP*Znx9BWYE| z{jf008Y7CgSeiGS`nb)yh#4Jyiag{6vO(Ys8`%>bEneG4G!|%d!=vMK#b{f>f!APCS z&UqPEc5pO_Ms|F$sG24@B2!kB?vm}cR{>Fb-)Q5de79{Et)Yk^Zn^yoEwKh7 zIhbrM=cv4i%n(5-rc^@mJ$)N;0onq@@n_praStVR0)NaedQIt64j@2UV5d;8y=gn2 zMXyl|tI-p5>S$J7zr99qL$D4_O@C0rYwMxJJ) zF0Id`Ex%&Zj;2okX=jMw8T0-CB*px99$E$w*U*7Tn|45fJ%mkGKcO$-yUcezazll- zAzn7Q)!_xTd7fwau=j`ki6G3|D;P#2$g7|M)VdZt9jq@)16tz=e3g-oiye9)5c6t) zY-QoCx(Rv<75)OSV%`n{idU%gQOx@`V(lZ&7@zP1GyEO~lx=^uFnquXvmxX!45wW$ zVUWTcz4w1)#%bM*JWZUZA7f7yW%9%Y@<1Q#rHfZ=%M+|#-we=&k@nq5LpDv{V`}&+ z+F#urEe~xe$7#@?@vvY0a0KBn`93;OCQffYC=-g35;MnVgsO8XU2;lLwZ0MuNnEaK zZEr*ya0zy*&dNs_{$zV!{B9Q8HvvK)t2Q%YFK+Lc_etPJZM6c0uuIhJA4CLe#HL+u z6Drk7fbztS{pI817}BNTy&r?HTvE;JP`8l=jy%9((I?{|3&&!XDUzy$)ByYI>a@ z$=>zs@1sh?o_D$%Z;6e8kyQy}6;p&*TOQMojjqtFZti;q{`CLsj%>MsE!$GXE z3^lB-J>B}fLl11Jht+`1d`Q0>5LeP=rUmN}K~qC*`FN1YAs7-?Y-34irOkfJm0Hj7 z)xN-<+1&m&=mU(eajY!tJzg4t@zn=mdusz|xKWytZ5FI$Cx)@nWsPALfW8ax_rmSu^n`Y3xwmT?KUqoh1y9F&cgWbwdn`gj0(wjUX0( zohET2x5M6k!~rr`v>b&K1C_vZbu|)_Rn6DW=tS93To8sRJ4f@SDhFu3ciPZWKN5%|lz4Iv3;8`{VQU?2PusJj4Jpq4HmObzCGI~3rp_@2naQ6@FS5FaR!rm8< zEJJ?%97Ps~5Dip@?75wQj`M7kskTjB41f=!cw)U1>z@oyfi$u8>Fo^nPlRt^cqw4m zdJ($gWY!25=p=`+EZ#n4>xZDP1J%;dV*S?Vl7g`3E|!9y={URHMF?9z6u`wyAD5PX zJkw9G)2ZBSW6JxuY!Or;sM(lzHX}mYKs{>?s!I|%O_Vp}OLjiwP5;G8-Yj4fkG!ZW zvPHNv?EQ*#29s8D;6E+Q@1xefl8ulJ@EGYvMp}7$mlmT6g7|$+*k-p&=JN;3nx7y>*pshHVIWXSO zbU4L&J9)hCM0+^i*-q|r#C+!BNFlc)25ZXS@gwQd)Hjayi|YA3ePe(WYnCc*UtKl8_!mL8OP8kEcqH>zD}X zF$Ar5q=(SNmL3DYaJ!<_a0=KK2J`X90YQ{98W7y?%?yzvW%#X~LD0!$qtKT@2qaP_ z0X36}f`10-b$iS^CzvLn+Ivz!l{bJu_b%rMrGP4yE+)E=Px~?QEl&IyAM>7xtQKXK z$T8SA3@7cw>&|e}KD@)Iv3(ZSiSe{zB1L4r|2D(FcEaeSLPUUbPVLRUf;{`U9vK|J zDp{Q~Xv!nD%X&fCAB7v>%(b4Rw2}6RTpNp$lxycW1H?Mhk!z@DHB-ahZN2PzLagTl z$xv*|x1B&d=IzIfASXj2-wxb|2qoXnV~q)SWc<8pzG0qTCl&O15fzlgHaT;vEVe%E z-Gx}0hy5D4Fp=!+f#sxArs1+J!}L6gTKz?(KFs&e01P$X_x_BrW?!Ek@;p8cA|XCk z?(5TnGuUGK4_2Z;EbjsYabuTfCNgTXxuO(nnh*a($a527>JMt#+^g6+*a-;7nwpTt z(m2S4RJeDJ!^;bwWfOs3=Ntyl*W&_G9u&}Hr?;RX)lGtuMoN}|H5i7UB}RIgo?HO6 z=uubm;1Y>N2S@K^a{q1!!^LoR%zHp0JbBCz_7-YP&W&vpkBO=eyvYd#d*?A`4)+Rx ze-l)0AVanPUF_*y3j7n2&-*jv6KM7<{ek!_eYUjqDpV@I9I&ES(*o^0D7O@5bwuzY*GL21myyC z0BR6nnEekhCG36N=FpASE?|XZO(kzt$!mMq7|Bv<>UF10C1aP)?*j*)TuaMMO3^(5 z^xJ^t0OLBH1;NQ1_0T%=%6|T;gSvTHemM?>L+?b;O#b*zF~pxb2JI|)=;n2K;%;h% z$HpI8=5PM+BENfufBl!nfRFV0kKEi7bR#wsxo2E6GMw|_K_CYk(z_Iv3M7562%bhb zCmV}s*}2$8WZ*W0zP9}%yHe`+M7}$!HcZ^CDNlXQ5417^VqG*8&mnxULKPnF$lDq%L!{-2GnHMdE z(pT%H(Z-9!_chg#*wHQ3ARz<-$r4?I0Qg}hXo<0+Hlg6O9EhH2U4}PF`f=l=A2+eh zc^e~1a9fSP6;LlWa@!mVTc@!dK#n!3)62xq)^&A=1kZ8_N>E`!estS~Y^@gL4p|nZ zhEN!?sN>tPMAhb!JSat#>cV@f5gtKFrWVkYh*L0nmykmXen@6S1w(MKHPJR@l(AV! zaM{G+fJS}ZSxqNEf7b^6AV6cE!3-=^Ufs_yrDHHdldc8|3jhgMXZONlQ@(EIU|~=^ zMEGNb_KpeDbbXt7^WdH~v$Od=dbz_KQ9qhxFcpV`Vl1DW`G5K#u8k#cMa zYj~V-NMm=gIW;Uhni&vTY(FdP0?aT`%^ys(92e5UPl?_6Y>Dz%VlO77Gp?}#hpeA* zMST4c-QKeR+%~Q!G{#}{cQ?K0s~NuJ^qjVR+PIvJdVPy~pH{I-<$1mKT@1-wux~DR z{Vnx_kBw|J)5zvAxFW1WYYp@=a9lK^^5|pbq)tEs8l);n(m*#YZN>!%!)9D4mpnSN z{$r*?{{0G33NLB7MaDrSFl>c8_=K^%gVc zY?QV$8xg5}i>>$9FO$|kE0=pK^00!rgV69eoNrQ3#W$>HGce|02K<2cHYzka?jmPrW?n%U3Ti z`i9^Ia=zcmww%X?J<555Lx@Re*)(LJfpMh{#sYqDZNysOa~ ziD`3R=<0G^7S8#~U$h*L^R@qJ_T!HD|B2)_Yr)<~^W*Ag$o$^gEEhtMJdg!4+Y5F0 z>vwfjYXzrofkMNx|66>PYEv$F4=?5JU9bxf%**AU;(Yuq*v>y2vFTLL!=GtGz<+SU zN9zzhW-b3LM|4dDeYr-<6E5irL1j0fVj5X5WvDU@*=T!ad(a z`&`jme?(cN_Bf5}f$2}A5QpGhC3WZLxB`6$B&QXB`;@MO-otI(Sb+t2$o(*s6s{l3 zmm95cqbDs8#NjL)Cg`>l9L_43RDcuMSdYLh?9^9slpFhIrbXW!&wF{S=$rD~72S*{ z?t81vay4lMw%{&s1a|?9QAlTqO~@Qab{8nw4FeI8j`%K6;u~KVK%^tV0Z&PA02B#+ z?{cb)6l*fBukF!g)rjIOR(1%n3NQ545h?SUeE46?%V9=cp3i&Ou%t~h@z{~dcsYqW z8&+IhE;94R(-x-d(RT_}I#(AAq&MXe7?d@D!%*i6S4H$CI}@)Ni+L*o)HA5XoC*yh zCYe$+=2+BT12?HB+)q@I{Rsh*mKm`x2?o=5p)NQ*=$6Zw@r}NTu$GLlcX1AaxGh^M zhP6`xnRFQc_u>B@{C^w&x5eq9o0kr+pLSADZFW8oGK){bRf6{!?lvq4#deZkz*bg` z+=WH*sBkzf{6t!KWmNDiE*$VE1G34 zSF}|N{uqJ{*UdH)J!1u&85?U~gRO=QpI|EHY~O^HPBj zZNIktx2C~Q;!n`9=W!{Wh`o>L5Vv)r^sF?9sr5$pT z$R6)P)uxeQU8hDb0uLo~o)6|lRmx!a6v$9lxcbReh0+{eg4@2h}7$ec-by z79OhRce0HEZ(xtCVVJ*W2BT`HQFLwYjDL(OdU$sox_@SOd4u$s*>j{B++7D4Fl?GJ zA9at+er|VTPkc)b&-s1v3_ZNN5tob01RK-p(ON^nA#Om0LR2$WEjaN2=h?U?A?DpN z8MEdJgeisvx5h5=r6ng^4P>p}P|qOjSrHtQlkZ|N6{eOa3>>vtxOLMd$=2I4Q2-=Z zQe7;nbth+)#<&hAFg zAKFy^HfCLWSNqq0;P19+pI`*5zo09meBlh>k<3QxIyBA&|P?0X9He zJe_y^SWy@Bxkx~cUFi^%o0=V1+Uy~yN5LDD3@?#Ei)XkwIYU|p{sQOYCh>sYhn5@I z!e22l)qng1cmV!m`YT2w1^33|B%mI~r#Q;1qIz@mBJSmfrTMz}ksa5hyR8&Q=tAr0 zU?uzWr>{TAAiYKW`3JO$pNv51nLu;lgI(r_BUuboWTCM*#2EOTZznRrtS!gR#656& zVcFmk8mD#06D_)eU1ocs&O#vO{oO6Lp)M`Pn0MT?#4W|Jmc}b@CL0XHm(5G}vJQy` zq}IUC(E_wXaI=`3jzV-H)*gj6v~AI5`d8Z!k?LP%Ynck+26XwBA3fje6>kQs z2kZ_QYjIC1vsWa;Mp#^{Y;QW$R%xvk{y&&BxchkXkO6XAY#cqzi{Ou-#4Q_|Pp z{9ZPtF6DiBIH#|CwQD0Y)_(;j=mxx%hYc@qYs1{2RpdGP1YVCw9!(j%>j(MbFKVuR zPscfdqK^U|MC4$^6|7oHy6n>?tP#&={pao(g$a93OxFlXk2hKb220qPd)k)nvf4NN z@Hrapj}7;>@}k391FsvPc&Uia8BPiXdV*{LP^#fY^a!QUMEFC0NQs186LBx*&5$-+ ztRw_(ZL-4XOo&gFGIvF{+MKx>;ia9{z16Z}zS&!)i_gEY5t1@K2 zyb(k8s(vLekv9o$ni{hs@(pt+&H=US&F|!Je?}=>7tXfiw~$$PFT>KC4BgAZfkCp9 zMYgzb_!{9mq=Rr%St$=q+E=|+MyrRYar|3Az{zO1?1`{Tn+spH+9%G{i3p-7u@~9T zReWNMF5pvpdW8`_2?sKQzI>2``SR>%0iVc6QmK4>Tj?@2amKGuTw*wy5`q8E+Kt>xMQif=^mO(@ZwMp;9w_SZChwEGqy zvk@AJrAzoo`((BM3HB^@ zGE%<62yMeEO|%j&8NGf5zACp+=&jxV3rYt_gqr9Wk*u}KSb1s4lID)ffHjL z7Wap0u zbXiBJrf(ks8_*4aF^MY&Q&y>XZPQ9*{2YO5c;j!tx&bmvvNj0;HYpAYU~fSElh8bt z+SH|YJHHj~d>;mC-T7H`yTiS-J!XKr!`$CgH$4juc{t-4>o0m$ zn|lbfN37(r^aUR$<)}kLCA)0l~xAF7en$Rcsf=c8$mKTp{vy zWh^wZ)HdTT#N;vt#|%}>&4}s77#!kJF;^p|J7X{?Rm=#)^k7U+C#DcFJsE=w%T%6| z5z~t?I6RV9vB$3%-*Ft~1MUE@uCX zOG=@!CW4LWgXWh9XWlJ;hAo&eUp|}r9bpB zy{;Go!$BAk?c$!ED5?g+b2RFKyw5K;FU^nsYnaI826c}TEQP3nhEivi;u-TUo?zR# zGBV*mRwEM*X^u?bA`a<@3|Ba$IXL5{Fo$`HDV)F~PvOxShh6qT>SCyp06rjMj?IUs z83r*w1Oi_=Jhb-IAJUV)f zot}$yoFn@Yl;PNZbTj+S+u&AaHME9J&)HcbXKeqn?aS6hyTQpY_fkx>>03x!YQqt5tzyLx_i=%i4bh;sym# z-K54_rq#2$eTH^c8y!}a@Zo5|Q$f+V|EB-}%5=^MTGEK2%`HQ}!(t#kxbiSsh{DsD z6esQ9MM2wfl!~$zT#Kb5!#p3Nazi<;m&qAv_PvnM`;n!4LgEj8MXUcQGO=xk4EJF; zqwZP+{S@~a?DcosLazZlWfiN%zu{Dsf;GP9`c0}jHtk`droRYZxnVsH zrE;YAllVrP%M%s+3J7WS0t7z3jT)=f6Z5t6+l#b>MHamVv9qUilW~f3!-K--hz_C{M@5Jew_WITcVV32pQjt-zt38mbx*NiBGeeOoi#(kL~ung7$nO z7LxGBH!kns^9IWQO$N8!L8U1jbQauqf(gB_omly96twk+bPvuOj!euife$<-s(&ty z_fHx7r!=X5(z<80@ihhAj}ta2!C|k`3`Ols1G`Sc}9j9Up(+sJz2-Z`7`^ zYEb@&IQ<3QaxD5C8K-klI*sL0H&(x9 zacjGju(rddlZ7v>PnpYVLx{QBkZbBADBEh6{Uu{xU@Tn?V`)nhruDF0;1L1)FAxXa z)$19APymiBdZYB`Ni_WGoCTpay>N}JUJ>ezEIOOp(NP~4>~#2T7bA4Oe?_-HoQ;DCj!qY;gJXxhp^i|m8;w78u|>;qW+ z%dFp^R!zi`N~K|uocmmAc2Nr|{VM1sr8ZS~3Z$?=DMjQtU+Ofc#o9%F3$0hvlZd|F(z~rED6DE!M66{@O(u-2%}P)5J{HV^;AkW; zef=Js&d|H9k!DEQ*(i(qk4B+?7VKrK=*NKnuOB87N#{qNxEMXD*8k{8p#P741o8jv zR4-VrQ7`cEqA+gOcxWHHzYPE3HDnZS4y7ZoJhZ}Z>iHohluFFe*ql7aH;p-x79!Mi zzTB+MSRVG9E6PO$tdL^#QCuhc97azP^0)bt+Te$bQ~E_ErD?XOL?_FHbVR8 zijqaJ`Dnc3#j6vJP8@=PJFhH1s+~%=S1rC@VXuJAKn?Wf-H9j8#f`MRc{0x6%~RtH z-aL*o$D5~y8oYTNYH@EK2W^@+uMX|O01Qf7jqr261qj0*l+XR4ItCtGcH*uxFe0O$ zfH~-r(b3VDx~fd)*_jr>Z^ukBfR*>HGWsh!({acY^PUT&cnqmA zsWG~24h>2%!<+_-Ml}-R0JrYuQ*bB|V3-Si4q5R<76^hUran4O9MJpP_9lc3JgGWB z3+1Ol5qQ@yHZ)%Ljl#iEfR%#+3;%cF{~Pe{sj6@o+TJ%h4u-nyqqtzlc9g8jnXS7I z#&#C2#!brGtpm^%;@o=*N`eOxak5BIZbF^1m{VI|jf44M+eMVM@Wsh)tUfu*xfK%U zXK-^Avfu{p6}Z4@eeE_8@7lGX3c8KnKykG$Z^zOG;cLNcah0h>Q>g{}F5$1-(0-B> zr7BTH;uUO5sz3{hgj8Ft?po)Ms}KKr%MbMdJtyj;{U4bz8epA;!(pNiWFIEASLYge zm@JOc7MKXQ;2h|%fzXeM0`2QE*D}zuz&Ul9}dpGlpa)YEO5VGpoIayCr+g8Mc}mJA$x2J*zK*n%8M zb%bQ+h|TluYcp5#J?kw<2W7_`36FmwN4%16kH^pGrHJq6%-p|YlS!2}E|z=)J{n*h z5ASG_JRz|bklf)Nq!YA#Z=eY*gkzzR}51WXX z6B~v`#`aw*O9EwBp`SWj4`1Q-hjTWyca#3*#1)JAK#Wkaru>V)c(JU&7!xG_q%rGepjk+kf`x@ zsG0YqjyC8yz^2!g?Iq6ofZu$vmGkWKfiE^6ecvn0qAvl+ARteDKR-uD$$mD5_D}FD_q-x%SA=oaK*$ zk@b3LaeQkYe|6k=Fi~q5Lq2er2UjPH>%(E7EhXTTC5VC?ij*{VRr_7>j?J%KWxp$# zCgMlnQ+p~r4>X$EX3u4@`LrEN1A{#?5Ub6agceBwYZ-D=Om?-nPm4LmOO6WW0QY!r zLl9H#!7aD{Hi=71Y&MPPg$LV1EOt7p!zU6GyJ08V0DBPN>=Ec-q&gd2ha>20bnR*t z+gW#FWN5Q}Dyy@}^>_qHsMJxg98|{M$qWO)(G%eHocKsc@azB8I5?)$IKcf6$^6fO zlGk$wMuER*TcE&Uex4g9^MA)5E^!;!l_pF-jznO79}JYUu(@Jy1OpJVFJgTK@meBr;SO?&G>C6TjF zLflI>vJ4@7C}A;e(%nx((KQSYQkRmFT?jGh3|#% z>vzWYEm2&VjJE$*__|j>|RQM@eTTiYMT%LRfU1ceSiuabGYd z(7j|ff~$+HA})L-s!Ew?ycP34H53z}rz}~#31alXdp>q)1&)Cvt>5gy1=Mo?7p{gz ziV?z%=m8!-+FXw7%$q;Dh>qZVZqJ_Qi|_;qJgRcNl;M7ri!yZti=V#!D<(|?AH@6v zKGxlzfD7cVM`Yr}oNo#e(yx`EebOWfVZ!~}% zpN@whdNTqgu`N`C&cQ7rmC?VAideZIq0V7QUFpaW_A0=L{uLK%pz`UcobH340UJ9n zng`D~x2Xaq-Miw|aL#pA60CEmQ#+JN{B^+Lnm1k5fRK1Ap!=udeqdIn9Rv7NDcwjGp zK9kJ@__hufE}}JGDIhffg75Ue^*qfrv%mEhfP&Gi_=z9j(Tl(@+S~`&4zza>pV{+d zIf3^!U=#l#hL=jZee6Sf`gI-wks}`6ATu)de3$BF29TeMQo52^@ z-*>^TLf-5rz2C3{?sqII_r~Ssa25S|Ihh2mqF0f{iXaXCeC~=q1E1|6IsSww5J^s2 z9Rtc+4F@yzaRjZUOAdm2(hV9H?f0k5sTWZ-eEgZ9uvxz7v=M_R?LvB7DYL@%uYYMRLw!j@SeSge`15oDV$| zQ+5MI3_h`e0joreGjO%pyaP-P-s4_`4ddKNfkhF(2+0x=)OndryLEdGCoj0E;gq;)4kAa6_=z3It-sdYL{zTms{p z#zmF3e{i+tK5&xEkK~g{YCK(w9G`I6h6lzH1s;(CgIR!!Ls$-qLNY1(w0Ec{R*&dF zP86CXg}U2?ko;Uq@?}V#`Yy~7obdzD16z@U*Viflm>6`m_@Sx3)+|!<|B7pE@HM7!*ypkAiNEN z8piUjGaUK+XNZJ^eEt>Ut?RgZ5#tD^*EA zAA8O5ar?g#Dcs*!gQx6o&K+hU$j4PF;1i%(CZJmXW$~4UD?s8fN@zU z=TmTV?RI?k`ZRn&;HRn_&B%(RDkh)`@-e<2h+Hx$R#ze~gY;qD_=p=M5-`+)b&#I) zc@*Qq1kQU8?i8WeAQM*DTlp@vi8(*!y$8T}@8i1||9aI37<2FV!$X%hL}q+PwL>>? z9C=x8bU8B=eNwxZ4O@ah%sT*O#k3VR!uCDIM%cbbHUdtt#T-t;_C0bE+#85=n5jT9 zlXE+y@YB7^$*w6juGk^G?{PFuSMYkr0-5fC-x`+4v2DvAX z9}@`v6Z=-`58~|XeRzR=c=KXX(Y}aF(T`nI`+_;5U;ROJQ6n&@KbWlrmk9`W?E*E0 zp6AoiXG*r`4aKtkppLt{L#lKrhYeV>)d(5B;RX(G57F^f5PiqTM&XUSJ%)gRTe;g| zxOEkTiRjm>^3nGGW6&ggJ0g6!jG9phwVz2oDghU!jT;ZfO$#>9V)sYUJ}r0*gj|`K zlf^-^K4s8gqc=xN=27EuwJ$~e=mQ=|t_2X>mN>(+`|oau0VOC3_XFIpw-E!WTA;pX zSZ<#GsdJ;be8_k@L_k~?fcp7b<03>EwwUnaynn+Z%wy&hfY)YRPFL=j&+u(%Iv9KL z^U=hUBOQYIOx|A1VLc9Few>VT+&;;R3dW^g0Xjes`o@)dgX zUQ~BLUmxSm@N&t>>A*vuZ`Z01I9MJ&ACsjzqW%r)z4P4UI&0Ti{CHyYM5vQwy!UEz zxVyvo4o39ze#z;zzqA%mzsBijR9yz4v#uPs49wMG5Ap6K%6kJ68(%yTKOgxx_%}Jx z?&Z^eV53p>oM;q3j60DJm*F$mmzhJcdmh&n+)ra>gxtXi1Lb&7a7|foyB2&6h?e6r z?}k=|vCNE=ioyU|1#L9r)WV3sld;H^NRl5wa;RmgRBGR)byr@rs&-D{YPr<_8H^K&78G<9CX)$ehhkt{NB7`V@Ci zg|{1U%hvDws-*rMH$Fuj&OsycAc@A|*$26CGkwwO+J~%uQZc;l;Y;KMFg{b!qBrlk zNO!mB>v8wJV5H6EEp)`H4oE8*lL4=`>F)x4J=CF%+CoOv-5q4q184}Zr=gvxS8dP- zw7{Uo%_E)Rw2(fvQJXkg!>#CM`Q)^%N2uxfrD>qzS@H}!vro?HY?0PO>@z4IeAb;_ z7ut4n&xa*UnXb$SB{xv?g6Sx#A83;%BJ&WxIrIxXobx3i(V7Tyr+wXY-w+4}O29rB zQXF{7S!0Bgow^N_)C$vU)@av2gBf2 zY@zZ{9b3SkBVs9!3kKSu#ZIW^w16qPNqo1BrG$ z18-owU0?YjrHrC4XTDBwOQC&SkQoLpL_=kU`!m#|A9z!ruMfbDX+v9+_!anqM4u(# zj&tAwU3?a0g}ZiJ60X;g4|p}7Y8RZ}@|_etJSw+vL-e0+YRpdc3OZBo)kAwqmSXfk zxAtt+4{XEW$;Ox14NY&s_Y{FZ^d6Qk5~A*dsG_6!>>20}{NDgy4zIDeCI`ci%CE&* zC!QQSz-{f#n}Jc~&^ABZO1Kqco)1UCC>tv<^{P51}1rg!0s$*!j&?cb%M-&~=1z=&A1ZW@3T+BAKah}gX0Hh+! zxN#qo1FS))BE|Ax+kxhX;IRrE6HGxsq5ynQRGWPnn_8w_L6`O5722#fu|a|Ls>=6i zE$iH}-lyfAed<%Jcnp{Lu7=*a21<8uRI6`=l}aq$WbgDw<3wHG#>{0}K@`9zY!zDv z>BANyn(5wq@FKZ*CR@uFR`4oDLy)v%XL}W~utirt7 z?D-f*tQ&*s3NDwh5fj)Do)MW4vFf>%0K&o%9QMEuLgL#4{}5D#^(1s5*9+nEUWc!H zK!*gn;9gAmR;%Y_KEmEbPq2P0r_Dsz@~DH9y@4eM^d-6YLRs9zUjd;56Tfz0wbpl) z)<@H;a90uzD&7EX{CfM4guK=VzPLGlUU%Rk+ohDNudK_XOvMkS&N9q8=aBAs#ku#a zu^mJ^bPNVKh<0$l?Wj<22WJ7igRLB^G!3_-fxyP{%ObjMFW}mpb`0KhK`lC=;a8x9 z-0q0(*>5cYNt&?B7VLm4Wq}0#Uz%eTLKd4{kVEWZqP`0HJQ?}jXtj3#v-n$ou!k13 zHxI9gPe?$Kz9V<8yi;Ba#I@{;2*%{y1cK4%o^bks`!fxCGT)P zA&d~o&kBvh=&0}xltj5GzSj@bJL1QCPfUvcUOc|SJ0dCmJ4x@yCcSG(?>&;CNlUw{jnGegFE;-8n1K)Y(0$c4xWT4!7zQ| z`2;5a3B@Dh8P%+^ia9UJFj2ibWBv}SH<&eJ1^$!*=;{wuB~*P@kfjpCkL%ly!(ou* z-`dj!qg>$J24fsJxKgaN1M#f zP+{~AsR}j-+}szVD*BA*FVd8KM02sc=&QiZaaYlY;wmywEXh^$M|_0UvOk$JE@u;~ zhIi17>R*r7z8N=(uhbf@MAx?0vFhBUs#l5uOMlXR0HtFVR=7d#BV0Y>F8#pkC2+5y zZOtEHc2$Qr7p60tU}y9638)hZT*e7nx!E^MFWRg%a94J55Z3oPN!~EyEa0DKY=-HT zao)jsGE8gQTy3?x#qChEruH`mHf>aj)9P?^#H-3_bs`#qS#6*jFo=2AL8_8PhaF_! z9K~PNml=xwrTkT05r}#3LRs-w30uHlMYdo+ID2l$NNJuYd?e^%oQuJy|JpC|yO;Ub ze~#no+T4+#X%dE|Vv5Ub5@TPv4;}orPT!3pMyRb!8}){A0ko-^mB0QlW>)-CXnECk z|A1wehjX@4E@pyL`@T&is09?THsFugxq29WHwZiW#quz3<}Jm!=moMDJ=vT?NxXS$ z!Y?MDDtQ|->9}8v6R#np#oQ(-G-5b4UZsI+N=N&#L;?QL;pQbI?mVh6!u_AZ7lz;w zgGcK8^3Ydut)M^LcT0KbHNYCKW^zc>p|C^v9t>$6!p@1k`)Q8j*5nvEwmNQ)_rk)A zvd3Wc>%Q#LG1{)!JRo=o7#t}|NoHp?(tPtSN?yF zNg!(Q2}+b&(AY*BidC@K5=Dn-qR)X7psm)R)KakwTCKDuh#kQwCz|8oL|X0CI<`Y+ zoT=k5qiwCy*3krz1iXcd0^$Xz*7F!Ih!znq`Mp1DKj#u|LY?{k^W*g*=Xv(CFKe&8 z_S$Q&wf5RoT!k_(7Floipv01bG70#0H8!p1h^W=Bt}Ol!{iMq8{FhKFxQus;Zm#{P zrh3=i;&f+Mj9igpI2!e$BAaiDyM-!j5P78{22}|w3`keMn zqL20bN9)zhTww&x%?cgsc$Z$Wl*$o=bA|>CcZS6b0)r;w z@Y)a27w?Pp>Nt^wC%+$j1%SN=^Lm=sQ8QbytZw8#$Cw8m!~eNO?&im2@uFYZIDX7c zUEl8xP7+x^x|e!Z@ex$I=0Rm%`wtq?*4b=smHVLb3Ef(TbtoEmCvOOD&8q?7Bd>xc zHT=+C8g9rId+TK@#-Hy(163RNPppv1x@1Bvbn+iwT=hO{ErZ;!GZ;!yNU6RcxLPbj zPyG3ANl%CO$X;4|4ap=cc$ms4^r)m_y3^1VR8bZ8!g4KYZ~`i`-twRED6V)cD?*_7 z9l1+VMX7AOy01Bh^}*0*Xd$U%*5@&v6kjtmmKyLEMxidzK7Ly14YA0I-px6BSEKyz zAhu#Nctvl#qu9IoAFpQ4qy}`lV&kS2-QY*MY~E?!3})VhW%Roe*)Xf`)4LDjn|rU% zi9`n--D0S4M8>qokuiXHwjKr-xehkh+&IVuWc5+Po|EsPhh6|hUF zRIy0D=)$Y}!zBE%_F`49j-E(G2tD3?=5EXvihRQwH98d# zuI!m4qCYx3zildc3x1TPi+y+OL--!`qez%ieyQVED}z@_baJ2u<#D@W%HB^d9!(z2 zgA#tdn;$W*c|q~vt|a6*Wxz2!2mi(g$*;TkFMshvc=51hY*`Yka6Fr#SyxA-Xr5>5 zxdxxB+Qj1$LtbJ~*|=3ir*)$%_miWri*KKMjAVjla$+l%Z`+RaHA^HAG=5qBPP4f= zJiYx*2}CpcvjFDFKYQ>wrVfhusVgdH<~bYJCbq$D1W|Y|?-gvVc$>+T=}lL6T5CTs z_gz;?1yXlcE&wR9jX;zZzj87HFcCxkQmmDH8qF8v1iAcfvueD!l%=~?wa6T4GgV3U zX*bzN+GAJW6}#23NUu<14Lw|i6j#&6M!Q&uB|iyVYP&+u`brFO zG?Frap1_eb5c)%Tugxr&3#EM=XC-Pc*m zj&z39uuvz?c-zurJ81uOYP{|bK_ftF{#Zc#;EOglrEksz%os_EwnYS@`a>}b!EwAR zf1+#N`$dfhW8G^kf@c>j7Ot1(_#5;lZ{588(jVCsg!?7MV%C01j&tS@Ag^8X2avBH z6b4~w@OonN_wUralVrO{*!e!kocOoFU> z1xHh|agea3M|^zjvwJRni!1SzdlQ-P_25Z3Q)ad5Pa8X!q-9EC@DwLyE}~KRF*Uz( z1bdrUa;lNS3_mqQ%A9Ozxx6PQRixMSkfzN2we>^gxFy}LBL;zVLAd}V@X9^0u z_`8^SMaMEqi0G6-1%JlCK_o3R$)zI%t!j{ex(R~Ud)%9SYR*1G_Iei8PqGJEwr)aL z2eSb5mTxKq4UF-m^f`hIh?8vqv~C|s{b`zvCW=1P znh-w}oH{ekTTNR;1T#jqTkRn{PL6uk#}N9Crv5_e^HXtm=Qq&UB*Grah!kiaJJm7u5@b2lAC{K3>=dguP@uf#<@r7Dsp4Qn)<+n4XXN8Dq=7N2`G7(zhu%d*|J1@4ScMX zS4h5xWS=u98sFN~Oxs_#DyyboEP1z8UO#QSv`LZ9=?mEE&ONL?u}S=Wsv6SG)8Eo& zbaowa++wNQjRW-z$;>0~zGwW-qUBTxSLQ~CbmWIaV#(6w7_OE?tAjZ&NftE-Se z+vV&eYC(mlT=6wBG=0B-<6mY1$VW?gyr1G>)h?bqR?32AvUopjm!(zg(`QFM+O}yRVFxPS1`@Bw&>zu1i1GOUP9|?l}t;?#3?f>pAsf^q>t4J8$M&G zzC+DURqt$cBb}PjxE|0f%M(N4r)oa-SEZEA%`{y~WNCkebs!fwDY75D3 z3!QA`zhkhlh`rU$O=Y6P*|Lr|R&u)#9v*LEPbnL4|34yUa=jvx4kXkVz|BVc2a z#`zJjx4*0P5Oh9Pm)Mkkoye4ET~C(4o%U|hNf74t6nRb5@Qm0x^v6`I?EL2@kt#fA z&cnm;r1i7DEU}wpGjk5T(6XKXq-6Pa@*#pRc?OmJdF+X%=%N8M(BIU)jlI!u#)b>m zV*-ZtmcteZKQe-grT)xh$+;k(SVZG?>Ef-oG3Hrcuk8Movc)rgYVv=%Z@&#fBzuJOo&t%h zW_?u{0blISz;(H@fIz-ivAUK zisc^0YW}t^6k0j@mRw{c5KDYipK9zMiN3dfLTZRyP$;j_tdaQhn!tE0{RELQ4Z_&4 z9gNWu)`K3|^rO{pHmwQK?mQtteq5fvYIt_|1wbE*C5s48xjd4NU_o-DGXL^E_?5&6 zro%OW$+b|UAS6qlh@Q)9dt(3zDF_>CVa4M3B!^GfOK5`LVVQ3?RxCVnhw@i`5-C8* zc%luyTglxKLFulV$)BAMnVIgzQ)I4VrnL;SQsJt>WSBj!u(XTC(#NrnTTTj4E8fcu z%TjNQHQI96EwX)yldbAgwf!S8Eh$VjE}=&XzorX5-g1+Pvmxk_NKpRrPWZ?d-t8# zZheacg6TQG5F7{pWE5QBXeoHe5CPj;6jq(#UsOkxMN7B~2h`Shbx*4*^TT5Pz*?E6 zag2Ha)oC>2r|=MbTVumeYrDbp{=P<-S4n{|@wwqT7z%}>Ym+mF)Xe*s;eMIcQ3-!` zft(e$W~a9Vxo(Q;pPnUR>R<4Co$Dt-5`g~cSrUT&1;gzS{H|-op*yrz6rZS{RQXA_ z>J5|h>+k77vi^lHIbfSriPus_EkS))RfZr$4MiovTX}=$LnJoqr(jgltTu`Xp2*9h zRPP}-n8ELM{qSh`;m%z@JQ9AmVV4hRL4o0Wd8v#DDU+3=C2VWBSZWk>8@-lw^b|&~ z5)cX)4rsNks58obl>@ghSEY-^`v^v3Z8SwEFWt}ZO z3QM99-l7NizvGB&?d{>pX4Qp9wZyL&8z09vJ=7=cZsv8Cq&qi~q57ky*MeVBMC0f1 zn}pj7zh7u`_`Ql>;rDv)W_gWjZN1ce>hNxQ^N@mq#kABM#QB!16nm282*Ymg42 zgm0syny!hemJ_nI?38?`YV@zUXLzojv%`As4D0zVzkX-C8}7kCs!9b zr{<@H#lFX{wSLVwpaJgB(ITvKOs=Ij7(Epk5f+(YMXoO>xaKGU`yH1|(N`g|#Rbj6 zxocWSd~_HkQ`fAaswX|)^<2NMXnRD|MA7*tuvrky#ihlq zSE8EHHsjheGcGvNS+zm48Bdxnm-rto0&iUv~I03HVBv=bsmKMQf&B* zdzdEkcJwx$5zY}`6XY584BASCQv--?xUn2tS%8~mO!t*dS)@5MJDfN8UTkyVMm zD)lvO)^48q7N~4?+tL2Ej$z!%U$=5psL0+{qwY6MUyc9J`SeBE1c3ha?aCU~n2he= z7*RPn7m|y)To8N~rw|a5jrKusb~Acl{v_JRR2-9}&YDeD82$EOFteKm*MKi+y(is* z*88&X z30C1GWi+MUsIV5Cu<-RK2D$;j_^GPV`hjyBH)Te&rf}TBRpZ5zR?9%$k@aje(H))` zi>^vX5AK$iZ@c>0!%*xQO0VsskPoO@HM2XYn}ZW_pt^pFhC@)jwm(rr@(_WEn|P)g z@SES=mx3+ut6eMT1H@PM3y5#+T8D6-?TGwwGlPcsxH~4c1VeVM zpbrqgp#txrKB%xb&V4blUL=`69)0S#QguA~Np;-5&pL*wjt4)fj!FBh;}xjhd*qYq zC{-O=S7*U3_t>dVhNDaTBOf1q2IX5e`^vNfDcNln{Uu0RVTtD-LZq6rciqIyoVi0o z$>MeM|G+z->k~TykI62+r45q_-hZG(@ECtw&LY=R@jNOZ1^eKww%%ZmRe5(T@()(A z_AlaYp_(s@Q{I8hYg_Fz+T(DzOq_C&6x+JGQxgaerxh_ai`u> z<)i0`Ln36~%zN;Up)B2(mo_RZ_qe(eCuK^UuM(H41l;`|*h)SZ{vNEbxBN7+^p+2@ z@{-^0TthBorDk&XVaHxeEDeeh{K>Dy>H6R8vG&Vd`!90n*C2j|U znc2n45iF$L>?lc8%)Sg@l(H`|UXU{e9L?wk*X4g1MHvYjK{=@+UpG`MqFq!>BFg?GOBh`wL@|Sta>^HOPS8$Qdh1{Bpa)r^3S^FpO zH>fv0p386=8Gxs^yvp(%BpCMw)mw^u5Jlw_z)_B-F*)6SWTQa^cCnI@7lXo@I9Xa&?`#tNus z?nh69KQgxq6>tZu-I@NLR}!BjfHB|aUYY&QMrsqAv{-Tm)<0HtYQhp&p=ZmSXAD$* z8DrpbPKNm^%ih_Hfv=^1XGwGduI2253~%}uO3hT(v8j+w?4Ta5CU+VF4u|p@rlQ#_ zBIq-g2^GCXMRgml9Jvym=^yDG`Vd#qKUJ|%zcOoEg3j{(PUag)l=tc(<=_$S)Ez4$ zN!4pRU*;Ojf!#`FkBi&g$c<4Mtlv*J;7Tcpb0ObIViT4K%)c^YuRud+0x#!2USP*I z>M=4hf^VmvrDVo))lU??BqPgjRa=6L2G-qXSV8adPiBr%=4is_}w zFc0KE~A{(z~PeZRZfoIjyhjX~eYm95m8bz3c0swB9sg1PD&rZd!+b4vC7sCA$t=RN|pSlBR+=_;l`|WJ=jVH+TP)0F~ zGG6=$ww>D6J+2ycBnhA8ZLIKHIV?BUol^4RXO?Jeuz>(?G|3Tg94`O3K}`E(OaN6J zP8vfFi5DZrrN)>I5%?PiT5otjFHtm_-pQuWAe+LM$Sx*dXRVeEJ(XY8%73)m91hCb z6-aV+g@Y{1`AF+C-YbX-VDduN}CB_Sr352Aa@LD-s{Wq6&l z3}a}JWw_n1-Y^Hh4_SuSNu#leIvJai7;y@%e#U50(@j}~q~IRZ`Uup_sxox@wfJ&p zE+Z=LYJnm%5ffwzZB{N2I#X*?122ZCwx#HI%|krK!gB|yG1O8E?HBee2V!5+o4U$) z!w%YB3}?~^iII$QZYGYlG3VSa3S!h$pRZ3&d8}Z3;h@JkP`!NoyfKd##JsxYY+KO% zcM%nV?CkI#Gwt zWWDAHyBcPR-7~UOa|i6B*w7bwJX(@o@BrrW?;HP{E|P4%eP@A7J|Vs?hUzo*E0$Q_ z`e*K5|I9tt|HH3a-B#zN)T8<7TKJ~bs{K=@omxww4*;+Bly9jFd8%6Q!E%*f>FvRh z2S+n4D1kU4oqNN<~L;r6mDWo8Ba|WO9a)?gjpW&TTDraIr zzJT+leOV}zBgAmd>vw)-GY~-`Y<|zP&2NJXAr$=5YRww(6DmSYS-)2Ek z+fVJ@wh<diE73X)`7?6+QUb0?7!}E+g{>eET`g#)@g5?Gi z^GIS)u)}t#8V@m!g@C2q<&1HKW76r>OL}AfMj!s#M~`uj z%Ht!np5JlFQOJ2gdcJBQENwyu7;z`17C-WW&nnAmBEjOfR3UNYGtuf}u@Mh;$1!@m z_$}_kwXZHO8jOvYsZ{+!(=)-8VItMgfBTnPCFxjHlm-T!jpSLvD0p<(lrzko5d2QWdiN8csV|3gu*U*j*HT0gH z4KwIpRYHbA{Ym&(2%zb1B?G6Hwt~hv4g$U8AULvTaz-A{@wokkW9F`Ke0w)I)Ecp( zT$7?J!LePKFe1w!@%lVC+nHYIwgda zG#NhBTDqNN9Wz<1&y3NC^ndfzTVAmt;@mh*pMV=@0W2KXO?DqVfO>P|tZ<1=rNFL@ z#Ee#<>Tc62WCB4=bvZ-D!VSx$z}Us-Q(H0-Vel(So$Pl}6fvA@pC zi3vrW6O%<HaqMK4q6wG<9OvP`j1pa`# zlLVs~u%~uSwXp^KlMjnQJv-Otkr8=5p|N~`4C==u?JUN!hk4qM=y2Oqyb{J2xo@*$ z(@Osojclmt-CRRprf_-xB5`Y0%pCzlCYZO+J$__+EV;-;qxxiNXEZs+LhesYmImT> zrSBs_UH5`S^|28x8JeAAV};@DJe@tMGk!~en~}M|cLhbiSb9*;Z8f-qxTcXOdg3P5 zoeSnhvJGF+bC^6$qJ@~PqSY(re0h9w%u^GRi=LF2HX(W9Tf9GB-||M&1^}#Vrpx2K z`>uNuNmYXD4vJj&B;5|owMOz{Ej_1N7AHgw(O{-yesWCbxa63({FdIv!|U-8Ijech z$psb)r8es$($&P0h%1)_LTM3N)??NXw&OqHA8 zpW220iC1QnGeIv4C2AcfHU08`s6zB;%zXm|e97(f8m5t%q!O#T)K+4-*YT1Mb2-oM)W3v$wG_ z6G%Z(6rLd7Z}tSJ3x*H!Etg1TpWXkwA{HSxZ8V_edTl=7#mWQ{!DowO8?4 z<2{;}K{l5xr8NEt03iesvyJj1P3})1mj1>7iWD7FnL{~y7*)y57!tOrkvMTZbIXgr zT1cjRx>=T^+U3SB(QX+!M6ztrcAWw<)@c7%oX}6IJbAg^u%1MD54ONJ#b4akt3DZ? zafjP>!EKxV0#6NIWNOqr3=|wjd|mhpk^CJYdHfX)$}_F>_JR=QuB%u|BV`yInh^2*Hz*kPO>tb!0mVi^@O&J0Zm`ssF%t0oQKcHX@Ht~R5 zkO7f77c%-AyEQ6P_?r)7&=2JI<+Bevu@yynCmWjZa0r^l<>`m)J;P^JF~-}LmFo6x zlj;a-?hTHBiU>@;ZoFI=*_{|}!QN=FuLBk*vmZ~Lwja(-<>=MDhaRApI($rnJJQ<#*_ptg*{WcMbkt;r+8o@E!v)wJq>FQXgz z>ka#+jv&J}?PYeB;`#C)+7Lou!K^F|lKMxtp_hWDBiNGvB~NwJ5gZMoAfe)Ae-GJ9 zI1KwI^64f`G{2SKoJW{fSbS$xQ;D?lU+Mkd*aqxuHAUR+bL_1z7tgn8}i~k*3E9Tgk zgS?wYNr6SD8lsWEa#^lU+$h|^J7;@Wl^!iAVG?orN(XbNN7vcjz}Qfv(WPav(~;Gi zHgf)$3=Op$${gKTSwC&vgydaoRa!b3Ni^rTSu^hg1e*Hfy%LV=Prtlm&Kku5L3chOvFLd-Lcdn!_vgmki(-2S&20RObpVC!X_KchD_2 zPW4F+HB}!yx3E5Obba-ZCD&sGSQ@EM3;{Eb@w}v@zWT|g4Z-uwtXT4h`qYKJ(f6Jc z6p0l|s(!(1YuBt36t_#__U>DsgJRHUqaA-Pibmd15IDat5E8eu`oH~!`kqA2Jb)3nheo9j-rshoSi7ICOMQc= zGpmgXq9hp%V>2-HKQI_>F&N^^KL~k0=|Db|eflpkLSvtV;18hx{|><(Q2(vnzWpc3 z^*;lHWnBM%vv2z{;6BkZkssKJF$npJUedI#bvCE$>K-#lPVtzx@;$VJ@3JC)tD^)SNE+l^KF{G-OD$(u3@G?6-4cy zCyAFA?d3>b_AY$f44OmXLx-0BR^cOPR#*2b;`|Fl6}Iv-9{=W6j^1Z0x`r)m<*HB9 z$^&e0_uiLvxmKR|G_6e7XDdy)aZ&u{zZqj`b~bzO3nFs{V>f=9zTCLaR)**LQt@f} zGGw2vG_(GMqu<2i-;A*b+0pJDW5?t$cEqQ_*ra{7@|9d)hG+W1W~Kb-i`W`{($-+* zZd-$3izyZNwgGt}*IGw@Yl|-Y+gfYfXKUYtD~01Uo<|!e_3g~Rv9*5I8j`kZ^4Z?7 z$$GYKEIgeZnRJP8=JSNcAu&OyJh6lK%lFbJ{1I4f7%Lkoc2>e@V0grp9Tl_f7%MJ`m`0C z^l2-2gN;QfhvJVt`!nc3a`!Qvc0coJ7-x!xPC~v)){K<`riNeiI_Puc4A@19Xwt9X z3vP~uHMnXK{-bg|$?l>>se44_Rr7ZC_inWiP02#(f5Lkh2`5Lai;m63>7sw7s)P$a zd-z~kZ*Sy=F8SY1!a)?3khDZx8pO2&>Gs)9Go;%AOwscsS)}NxPi#idUz?nSiYIOb zxk&_H!KJvZ*38?#j*;Z(!Px z!m>hQo!ke``xkMUSY<_eoSrxkcNV|g5|=)W-`?^?D!>*gtMLFAeKZ~+zP*PEqt(mn z6Oo$bHA9e2V_WNRvKWtNU2WpIo?{oV|MrL9u{U#57(dg3XUg0Z9vEEPfUlBYc-Ptn zbW3)8ab8D7Ou=?PX1YwkGuD(*$vQAeXdzTg>G{7h==D;OzMdE9aVqH8QZN1kS(52X zdI3%8ytw2Dt6skKY>rXeS9jKJV!@^4)Jb&fPJo0O+Wc{$RMMdmL9-+u+R?U zX7tTjqH?q*``9m-&PI^UixKs2<<0B^#Xsj&xn33;Q{@+{YT3QMMtZgyJBM1A^mI>z z1Lg}^V6MmqrY>=)KaDf&AWCuLwIYu7Q$^jnC9#%q9DdhoM|HAyF5UwHDsKFq;H|vQa5z6KwP_EfYIZNRlTyWv7Ye%ddnn=UUgCX9^lPjdmn3>feu)6wt@P%< zAXzsLchPyv@b6jmyhW6jL8(WgK19#wQ z86UKmuj3N&W$padrE0=4zk@fq*ACo@sUh#P4Q}Hc`;_kc$wsj868p5N?=GzcwIGu%&XFa7bI4nBQN9oi(YieTWc#d!@STEq9LCt)x5$+pLOBW9xv^%XIJRH5E0fYd?^!sFj@hCl)?K zQ*qOWq5CyCc7~Q_=GaGyphMF8^bDNROQw|l2%;QMS>q@vtC42fVTvzlcN!^ zn%0GuF+9qUjIYfWC=thuS2pW=r%P8kEGP7%o4RvZUSlx~9sQ%DJ@WG`O{X+TXGO51)gZ9*;*#j6GCNeq`jtk)!cH4CCT}QGRm%1 zo=BIZi4Tm0+-^kW-w}-ztXo04)W(DV>&5KSWNL^u| zJGkmv4-H1?*L%nd`rE^!UhpycuR8BR&m3Rtyhps?by7r3-oSH866XvK?kB6+trBka z2#%31*|9N`3&hp3qT%-Ywbm9N^&5Ut<#&veHPs1*YxxrNpro)xO0~04>3J%@!8o-7 z8=T5=rk+sAL4M*C7C6os&MXPO$anH`P=sjk3PZ1++b!Y>y|R#(d7BVT?zUM2Viu7? zetfVN*%-^wQmmF-;&0--?PL)S#mmBlGbCjeEyU=|ccgkvlhEVKU~or0G`H!2I}D?j zse0L@?7Ym>OFDdk@8i`MzRcE3GcS^(w62r8N|QI<&zKGjC=>09pz@%JtFrjGOdsJ+ zW0^-|ZOLDL?vMyK!IXG$Uo#hhOMSsKYK*H66EI?ro*O14OV>vuD>UufJ|vGWG5opz z-Ur4qWTA{E=T!LB{k^t}c&XtkR;Cg8aAHwD1>U1*>zRD?t7))pl*`6K|6lpp%x$jq zD3`5_^~+^rWxpvu+f=JIa&a{BVGSqehTz`*ZN6r& z&!KA{@D5a73#2PPC!(rNjXL=3)R=>5I{r2F6QZ5uPs0Yc9k;sE&hZ`^bBetGsuD|T zhwZEx)>#Ao2iJQ3&f4nh`91r3g}hy;nyPnrZLjm-vk|L<_YZbr=*4)zx#RK!eP&VS zxI8287kKeUkWNxXPg1PloYW}$_3x-jmL3EE{`QeO_0yh?asZ2y zZyZN*XB(o)vS>1*MdEpcpeXAhmT_7Zd|}~B%IXspj6)L^<>RDgGS!mT;^M!=E1Q)y zZx*!dl=W_&`vCcdISB1>KRLY?h2akGh7Q?4(oK8Kaq;uuC6rzZGH;eOn)p!DLrf#b ztHv!dUiCfwq{?5f(;K@4-J=zp#VKtVi$=UA@l1KVuWp_I)f9fO*J6;4#x>OpKog*FqJ5u+dxo!+YdO6XS324|qw_ z+3+-@%_8r<9l^O~{(YnI7}Fk{W%-9F|9JA-avU@v2KAQrSK?Pll)ox$O}x#CC*qK? z#MBaanz(Gs=aGuwbHQh2a!+s=iYB6ofx$w4VW(cpwLApB=Z{el=YxAbBfKW-ZE}zK zmkHG1<{r{-qU^L?&qH{2h|5wfEE}XEL-(*8u^85k!or?E|WP5Hr@R}dp zubKm0knMUioLyI4;wetMlpeyAI=dCRd=5_HzW#mY>m#Ly^lUnCa30(*aC&Y!@R}dl zubP8lbaW3K?tDhGx7^1S)Tv7|8u{Qd3tHp^r9Degu+x_3K~S)XKfUEe)B#%!Mo=)% zeRWs=Roh4pYpksBhH>))!z34SiA zj)7Es4>aZuV4bR0N7Ujbyvk4>@=6 zkvei|u05Upe+!HWoiAI{JZ!WxJxjLLdta=y-V`m>^AHr(ghQ_JrYz%L;VGO2w!8Us zTd*$a)J3@soRn`^rH=j^3F|m6t2;d>b35_mW&D2yP>E+g8AzrOh-At-{KL0hJ=vf4 zW{Hnyuh;S+91?>TBboSWFp(EORU^$R8*jaE0P)RyOdC9g?R*@s7mjbeO9e7GX2avB z#;otTC$wYP7NNS^Yx#g&!PlS_N0-7Xkqlfqa}#v)$E(tG zuCnP|Wz)IJrgN1|=PH}dRpE5LVVM{}AG@8d7i8a!%xss&=D*&+x_q| zO37V=B}=uP097v-pR8p+q?*ByRKL35#t5XR20HYRi7Ve494=S zU|J3K%fV%(L&#J81Q(fbCuXM#%^)?@;$-aR%7m8hfy&wLn}|kfD6hTvRtP$lI`J{m zNOa1U@u?!z1*3UK6YjP3gNnzcYQI#%gh)Ki1)IvZfc)e;QP21A44|%F7ikCko|Yj| z9U1O+nTOTu6p1^l1!dH8Y(DWiR-YIL3=>2odcPjmfJ9pSNmYhQ*qI9SFMaAH!PB6z z;Bp{E=Hb=X>r~xcQK8qd6jft9>ag-c_gIy_Q~ZSlaRR>(5^x>x3sFPTN56W6ck8tx zbi2vGz>X#ub{CQ)mUyK;@va7!^}dxVFv8po-l#=={)1Sv@#m4-Yg2v%Q?5w|+4ZC* z(axS|%F{b))@+h>zxH5e)5@l_pK_{RqM+3xKnSH^!>sEL)bzhxKwq}WBVqJpAaB{I zn?ID#Ydf4)q;1w){j?Q+;)9Xffp;OV6H<*&GN=Sl0Z7@MGhpkMm~^P4V4u8qA^v#H5NJ#Cpk5&1basx1I zPvg*SQAf{l!11^FL8ue*gXk*aSC?>9Kj2VsYo!*TOy9h=31Ec&xl5XESf*)|&-H`f z>oA|$#ghzs6TQE(q`qb2+#h6AkoC!71mqpLf{{iBTh=o)<4@CRb}S8DEYcH=q@&f3 zH=f>ndO_1GHHngFN^B&tgy{Z}xpqHRELrA9w!ybbY7>V`Yw%HhwY(K-S>unQPpv1A9Mai&n1Dt#e3|o0L#OWIQd1UMnrWF z$f%Sd<@U-l9%9KaJ$Aazi`DV?!?I|CkWx=4zmCrlw-CD734DB?SP@G+nQ<{%BBgoT z^U|oK#xnLh4)bn$MsEq-wy1TMdu+D)^EPkAB6jN9Q*_qOB)E;S$lKZZ_>Ol~8Q-6r zUh7@O?MLmrG;#~gO9+RT68Pn+ozuOk?@#w;Q0G-oO!vO~v@+VCB|LoxG3PQq+ozSt zKGRnz6-(P?s}Sw3l8kzZ(l4j3wX()xtegHcsl0?0T|ym~zpva~F5O#8?7OQz;AJ}2 z+Do_(hs^fbyPOw+l&y+tFQNU*0Z*mYE|IL!@&zUX8N1Njm?hAkw+SRr$oJ+h-M+;0 z;-^L!v*t1V5c+&J78?=XR(YvoE%my75hW9|SIH~AHf>QbKJ??tkd$ATO@5m(QF5V@ zi?Yejg~>%qF3u(|4U>zN+%KDKs%t7SNVvx!Z1SgJ?*7V+=o==_4UY!pd^CCxPqlhI?S-d`8>?r z@pD0lpMt>+7P-Bh?*Db?*7Pdi#gfy@G|@Dr%&+ZzDFa9IMpjwk_$EHhk@m_vj&q4s z+V{fJ5b(~eNJqb?+8QgAb0Lh&P5_&im7o5_*Q}+MazPOC|MVUIAP==eZpSj9Wjs(* zu)@XEUeE~l#dxTOk|pWGX6rY6myoH`+&!l%shMYrhliD)xy_6Y+x3$wzZvHmGdeuT zyOZCzR-+0}sR|}I0a!NiYXMl?1h2|W@G3XK;T>WU`5YMDp%xKhUk;wM6?uN862hQB z=hIMc`N;-_TjkQf{gHZEsU#^Xr8iH}c5TH!OyiAFF?^}Pv8WcxuX!V8d% zlJ8AiQkz&UhfF8XrSEJM@$prVPF3uCqYho9hK-{!MAZGjCKJ#M@&dA;6o?2L+q4D) zGNfcyTpp*Y7fJ)$Lj41k%_^RFF(x_qeaTKPVNqo(A0*=uN2OMGkz-8c!0kVmNbl)vXGVm8dndw)dX4Du8HORI->Qk`>0G5YfET;kPrtJ(I(6PR`P z&5h-5FEqZr!t;wmr`pM|%dDp6s)iRhyhs09Fi-)t=O)G7UMLK#n zdk?No93k@fAE6F%ahMOMZ>JH67hh-}C7vqlziN@6Hnt>6H&1uN>c!hgtVu=(<3V&; zs-_p)nRin^+7uhPpWkRTuAhG;Q(`3nHAuXNM0X&Xc|-(?t449((ZEqKc&@!cLGgN` zt41zCA19VXQ-jv9=NlleviLF;gjhJMyHvD>W6)WV#91XKI*DH?0?gm>0I02sRH#h8 zd_s+1rUotPIVZdRMw9b93q(;mtUUa#<>r`}JG5Ls{O%>8uOfc4_m;^@g>5%F>`Amy z=ljW9bUGk54b9QGlDWSdS3Q5(Lip(Qhu9ODuOFcMXN0}_)D@4>3U|{KE?Ra^DcczQ z85a-Y7k@_eXhPxL%esaL66n~%xiEj2b6(3ti9ayZW~wP5mKxR(4X<8%%m1?t+sh9~ zYCR%2mC3_+PEQZcif0MF|nA#hUK=s=-vOPmf z@jub1_aI?yS#cWAX1+E`>39ciiUO(t7(z~-_ZZ{4y76eHYB{x?SJ~jz-tIUKdblYX z4O5tGZCX>CXlLZR2zq5cr4AxyLMsq+JWqX5oUg_YBt!j71Jh71ZO_|K>fT=}MZ-0o4~x zU+V*stY{9T9I9sL({^{`XPWmk*_!hpS{ukNz~0GvDaObgg3g7g zc16%{@&|79UZDAo?U1D_UCsr61yr*OexRb7kcQ^NLvzR}%O{~z`#|$ycDQo5*-W>y z!?icuT-pa31^&wDE8SM@q`j=RUi<+J+rr8F3~9<#eLIxpp+P7D0e+(sGaG}`q;FwRBwOq3)J%T01AG25N#EhS zyS#X|7ysB!E)M2|Q;A_iYL8ay5Dr>bT2+0vM_*wFfdA?R`bm|iv69*L>?q!YSMUi_ z%gvPMP&xu*(^EaGk>q@4fv?bpw|59#(ZnE&(-^C6Z|Vt72H_)D_k12ff(Z?UAV_4k zE{#XIh%no5fui5s+VBi>W=Yc;??E?7f`ud#jqyZHqT&MYmSXDHMB=&SeK%J$nGm0k zkO<~izukBQ)ewo1YF09dT~mo}L?eudl2QIduLTh7e_sH}do2X0JrAI-lbq!Zjlb?o z@r_@BCk%8vq4CC$A2i;Wf_0Nl+%=!`b z(Tfk~CEL$s!4bUDrxW(jB`u9C5Tabq7~vYAEJmuQgcEHcs;T z)sR<1J`CN#T`UxPEm)S{^d)_pe%BTJ!k&o7i`Vfri|JROv%GFg$lWWZ&C4tU>!SRE z-N9Ct*u56ijda--ukKq=UWGaPo6c)8Q}Xnww{T`I)TdVPMf%hc{F**>tb3SWImtcT zUOANqKY2#e31SKTW64XfZDP<;YT}t_s8+=>T={jR)3Ot{3x<=1ko8Z`Tis)L+*4X& zxN+OhBn)Pitqb&)uWa3vQMUg5(0paUBl=dREl0 za?n86sH>Ut^{nqR7D~?7vyxjZNXhwnR+1kNlXuaxJ`g77>siVDi!gZ?J?l+ja=xB* z)tsxu9`DQNui!K8=qa;3lU>9 z@wSDKv*WGY+QFSMq&kf%LWHjr5wKFS>eN`Wt|Gk?vj)W5awA{uu%!hcSKjour&9p- zt_IRy=S9(`U%N!Vo6}qP?Ja*`E)$93cJ5ayPn(0NJlz~5=CqrGs65>qMCEC7@P=iY z$GfOJ$6|_mz`|8y$CG~Y$z0173*6hmgpcn&eHVku!If^N6}>J#+@|4sXp$~12?+QcX_<>R`5^| ziXH%hs7x$MG8TC8Z|S)JQGTKoM&wgbwnI9ZO-0PoPVBmr5&kWsfBq$Vf={_lqKT|A9!N$P}BcBQE~(n zCZGT6mvDgvv1;-t9lg^RP7*v*0_fbwGG`h+pqpFO{Umpo6d}|3-xhsZVB9|GBP@NH z1ID8Xz+tbE(Q}6fV`elq~*^UC`s~-o4!#q)9ALm7H>*c&El;+5;vX zf;mntp>~}KaHfBq>K<}7Ge7ZH+1{H;mth>8^j)Syl8$z4q5N4D#A{-<&T%FOaUsn7l&Sl0CGs!JQW0= z1Jzazg-Jnczq;0npp7K!)kqAtHblaTVy!zJ_2Zzy>8MXU5}uIJQEM!vmGe{IERj3l z{XBCg6D~rG)^ys{VTg7T>k~VPV^EWLt3L63ZoOA=@gnY>UmvSpWL(XQYbB_UJZU>C z;-Gi3F{(qX)=J>Dyu)8qfvx;V-?EBd)#AqRMY)HFpZU`W+Th){&76@|5s}=7h8pUU z7nanXKA7FIQsl*S3waqK7Xu&_E9M~6(^BX7r$20c@qXG-6UPVcF=GJZ5MwwuebYmF zORS2eYKwQUrC1fP+rm-N*7>4-PMM6waXDd)G3rU5+|~559LZ59bM&_pPp?KV8d>fq zi*Frt-wOIT{gqn6BuhsQy>ukJq zmJQYIR8+S**N=MKuU_xPXTv};=phkyIcj-uq-Gl2#kgQ*0K>u4K-vKEt|l1B#$Ra= zyY-?$#Ao6qCRG>j@~6~1!hfY_p!#otu;C){qYUM4aD4{X4+ppLg;?aTvFbSmO>1@g zj7G7pg|D>n|zp&Y)s0?>LEI zS6HshqygIx|osVm7E_0J*Pq^+07vjD0q}A*!wIvj*hwn$M&fU#O3KR9D?3ygFrt7+yXV%l?-~#jy9c4X-D0Ggioq zLc9)93d3Sl%-nO#2r3o@?SYDy!HV%v3^Ds4Z~LI){+~$2zVV^XXkihKU45vSo{2@& zh=^bNB*b3J`m+zj9`59p3|?QuR;WoLdff|NC8vpCP0_zUn0?3QKt6xitds-5?B(K? zSd5-z32cbcAN5N@%l1v z`-@kp=XT?}`$w^#h}TZ^qWgu{7rgjsw#C>dy&fPR2#mAjQ>$Hkc>vTprVm!dSN+gB{KSHec zkmIo2D3Os9=U>g0Fx-{gV*h_nEl1;0ZI$P>#Yz}&2D&=Fn`Zh@F-PAN>Om!#@B7T z*)FhYV8`I&RVX1{JBPk_Jp>iTC(-MH;q~p^@T$1)2ZGl{qWCPm{*t%-#p~|$+QCih zd)+tej@QJ;wTZvl(VTVKY_@~5z<K2 zLV@Qkp(y#3o;OaQxEIicYb4ThHil4BjK6r7tVfU6li{cJV z?0fo2mA6LpM$DCmcn=w?n&YL_oc z{(J~)L;6=y(W_bF;)BGglW6jBjt`esf0{oyc#tWpo;9Se&dVJ$V0O7MhJdjq%#9c#8OLo3pm*-+%H3p@D+QA)#1wA7>h zX-oZ3_s$6()W>kZ0#1?9XXc1Z5O{x@dVcU{!DE;K_56#XGw>lR1SiyJU?C;RahH|C zj)FnLC*o6rRPVt^ynXf|HLa0c)0g$OX2z(9X@|e&d$)f7du1dn!stRW4bAj zBbV*i8RoBbc82+DWoMW`z#Ul=GUt{Anb&fSNEDs>qyjH~=_?MwlX}a~=KyqYUijXS z{`YfpLw~(&$$J?3ci1Gm;hCM6`)hm2-I<#}E;3m9EJ{huwjQ`L6X*yl4Hf5;858I| zuGw>KmFBheijmXqq;R9jLL$l+&&l<}E*;rJKRz)373ID^FLz=ubzhSu_#5+bU$mFp zZ*vdagcRy#IbW5w`-PlkO`wf7cgrQX!OVtO_nF~63k_HN!X?HTzWY);QRXiG@$P5dy3hJ2lktC=qX(u zEiC1hxCB{+VIh>|s~Pco#8pQ%_^q9eGF-@Mbd*bVTvSUea3D0hDCXzay`kIlkT0H>)> zEXNQ~!jqPo!AfB0GZqp6(0aSTyJ-XOyJ_Ccl9ASgScjDqNAn z!yX!S=;KlKxD z#S(v3%*HA$je<|IMMZD{vfl1U5t81dT4^WA^P^e-*YA5|70R$q+^-u=B6+b5L>x5&teg z`;6CQiy|Io+xOyUKt1FT8ZH*m`w|An_M8wMzUbM^dgTw_)4(u-dyMmpJ$#wQL+2yz zKrf+l5jIX3)ha+Ae{~*$%bG`_9!!NSC$wi5X>n zVz$XX8sr#;y>a2mbsc`kjU#DAIHN2NNH2Z`rRrLG=N_s<<%#FgwS0~x{u=0_OWlu| znU*b=vE&7_=%M0?&*n_97vEk?iy=A5!(zsxe1@M~Q8^PjHP(PsDZ^`pV8PBlwJx#N z*-=Ik&GO~BHTB6uF-@;faM$>k8GSyw{;}dN)f9;)2Xz2>bl5ttbu<}jtKYBj&U#ua z6Nd1n_0><$D&xStBA7;#XR{rH0PB+%l>uPWKWUmwRm{;DF5)S@2}$cvfu8AHVh)_D zlMXYMBXXn_|2L9!w4h3chSpLO|FRS{+VvwtR~*R6`d#2`A<*?NkJQ*ww02QrIQNM) zYrYqcXzuTg#&q`P9t>n*baai)uqEnyWEH)Kbpq4wn40~ZveXh12MlcrByumH94A@N z!qdYL=e6h%U+{?fltF{n@+-y|A-O6yaavYfdvb6%Q1|KIUgnS2nl`z}cw44_1O&+S zFVmmQ911LSpyYCGSK|pLZ*Tbz@FItc|3p8j@B)xDIl~8D(KZj|c;F8oq+6izURQ`B29}sUE({9sQ`(!D*(a}>b+|&12v^L<8k>(5 z^~osnaYfT@hSM8unxFKXcXK;W+q|!>#u@&6TWaFJhaSaH4b8^i<3AUPvb! z*VLe;Sqy*G;A9?l2*0u6cXx)XZeRcR--g&P(OkA0E^~+EP9Ik?XaDA*E~MQfUJMzA zn>>s>XF562Ys*s2{49|Wi&x!(P z^Q)L&-(8o9j&N1G0xA&Z;4(hjr|xW+1u|c@M3E5`YvGdBnJ^0q+pvZ(3kt5ac15Nl z!Z3K3?^Nz?m+q}qFokTG1tM*&UFkl1m-8Z!NN`mF;w7|yIW4NxTJD}F%t8gkK?ab@ z_p8_AxMpD%x)f&NaSOBX-^_eG%t{NI-;dO^mKOQhXbXf@__6yKD~QZ#;pRy4grrD=M!%v6uDI3Ybw@;9CsCSkYm8 zcO7_k?m&Oovv?^E(rq|f)3;RHR8zzN1s2GJ07za_79RN5Mbhshou&);%xRnJq=sBb zCu4~f=?^I_7h}!L^jo}0AbyqK-tx&`j}$D}YZL{fRw63w5=bE{H&-3Ei`<-%C;gPu z_7WTne`yOH5eA(QM3M+b^J}}QDs5bfcriEWHC1kx`gahu&T8MUT(}hDh>Yv8Zr-WN z$`gu`;4btT`UMr|c(-KiB8rON#&1Wy;i66AVBm;0SbZiK0|ChGR_FAF!(2#61$xUrnk2r=jTi!clCsat zjv9i58kc;~MkoQ(IjR>3Rw4jKRU$r{pYW=Q)R-5@PP$WeQ`Zz#ID?^BrgG85D!otj zr@^e{%$q7=hav$R&)Zf?j?6p%QJXwL?tm?WXxP>+xsZa>R%Oh}tCM<0hx_yTZv7jADvKr_lNgG1=k;9PjL3@OF1+D zp^bm4v?IzbF^KIS>ZtsL#N8h*mJgh5*+2GLCWu(f6BrV27KG+L?8PIt9>*$Y_Lko= zktH!ejJ5Rum*sZJW6Zo9R}|ww$Rg;#b*~0LB5Te+7I$9l$g=w-MJ|j_0Vl|}inIr{ zy+pgY@9d-SDV}?5a?p`CaWQ=$$^4r$&f(4AF;hU-d7|&w8rTCgY?t8Hfjz*R={W+EzWK&N5)|wYF z4E^wz+39~ArRsP>zOh8NTS?C)UGr6$r6tphBo{7;kL#Fd`eMG})X(-#l<(1%(ubp_zIbKaV5xGd$4zCO@&QKC(rA$O+VfiqpDMM;qVnEx#=W z;t&QgdrYiCzm`0Aum!Lqq)dhMCq!zwqS8-I>IFAd;HC<|MyR2g;xc2UWf(1VRiroH z2VJ&olp%0KZ~2$4-p%QM`mz8B(zo#|TVRr3_}lotdKQgKA3aNEy%@P7{T)gu(Al!| z1>w_U>3W_FAxm-yS<-a4Vo|Vyx^W7QW%e__X)5?3PZoAp7cj8}<8mcG#WhUqn>Yj9 z!1hPKli31IDgV{0+74Z;v%v*~04-zP-5HsC4*6Fhb5*Uh@h5$-4g*k#(4do7QVDqn zGG{xQ{;WOTMOMp{RbfpLg3C(YR0TaR<@g82AsZut7Dj-k3@L@iYBp*UwgTrVAgPYd?KWy?aldH)cy73>)GZlc@1y*^U}cf!gTMOiuMWCr?7v} zXiix*Z)dT0^LT0eQv)ueB2Gd~E4smtboFk^(k*meR=$Xj^q6Pj0JB?~1bk)Xvq%*@ zq-r*3KtY-nFg3&?G6C@>&W) z*=46b=qlp<;_^dO0fm`y%G3b-Dan%~M_@m%cX85gxoLZ-og{ zo+DK}py5qYo)l>JSSt-r@?oHFad%a4h4MjsQ=SeV8lK8LxSSQibe7C;eFPYd>lx2) zQP;~(b-xSNr=53jRl&0*p~U;I4P4{T8TjQ?c)S3GI`K4o7$AoMPN zLb(R(k6#wN!rGmstIdWGMr^j)V~~pf-Wr~~nFgTPvNNs^fpfpY;*_D^aCwB$p%e8i zAi#0i&?s+IDefqOWE2e;jo`(G=uM=)H1?huhdx0wT(?!J&NC;27LTSwrAqcamQj4M;@w*-{A|P!n7u79$Do}k*|`)zsW13 zju$V^W$hcUci!v17^T9^N_>tco+6fIEU|Rnj(*ghb~)O zga1Y2MN#;#7e~W|m_Vq=s&1lU66SLi5l;rKX8qEV$nksA$4p)c`E1qN$5{~cKwCa$ zv+``TdR-$8O$M%kg2~{Nq=sVe@o4Irk0qZ}O-xmOT%S5|yQ4e0@MQ~7uhUZEB+vG) z6C`tIF@Rf-|iKKl+~eOB^>rx4gZuP z1&dxTLXdJc9l827pKHLYnvz-`M!?McT|}K)BiL+(NHN#mYel>kxd`=i`l&B{*^NVt zAN8+gHglLx6uLf=^>(dw>fs-eugjS*Y#-L~}L4K?#VIH<<^+0xqh z1~2{wSdO89E8bB|{xfv?(Yt9qiM3L{%>vm{zh#c!(NF2yN+aIDMF(k@hpOr+Z(!`8 z5+zsidKCZzAC5)QSvU=b5Z{Hcji&4tHR~sCR4rPUY@RV> zWfw8+fdBtv@BibYDy~0%JRyk&A#N0+P(`DL8Wa^;X^DVlNx)s$U=*}y{ehxL)mkdM z;!g-}qTF6r(|5JC)mp3lp;qgUwu<;G2|oh<`M(_>=eV;i|6v1Avhd9p$L6Pw!8ggshz)kV6kC$o<)r#Z?R4&B!=a~KB`kHs?3 zUW(y)0?~>aoXMrwdfQc3gL8)-<`w+)%7f7pOVzSRu{7}%t3%TwXFq>FT_7DfNRq$7 z0yu>$ca}OU8m5+pS9QQ_S6yIG*<1KU2)dWUqrp9!rNq=1nBteloHJ?rU2O&d=hp@u zy@EiDSBnS6t?qb)opMXpEyyj`ZdthA;s~` z{e~2GRkZ;>>bw-0O7QK@U8$kAg|w}354mvJR4grBYBzk0JNe*nYT}ow8&hRj5p~zQ z2mhSm-8*#CF=QJ;95)@0uG!r>RHyuVeLp`^{NQ${%SWz)R^=Pf*i;9)u6`P~&n=rxq z^ur&%_kM_rJ`r;I;-XJPa^b=X-n-;Qp9q}amHxjAj6M+>z!akfBw9fRY4LS?={{jL0eOB!Ucu9$DGo{8BYXc>qVEdEV9Jb+*}&G;}3n zXeiqdetQ@^D;dNqG>GG?BC)CI38}%E1}A}~@9(PwsloY&9_Ce~<&_7Ux0(jI;q>}v zlIg;rM@GS1rXyhUZQ8rN5A9c1`Dti&5C)--VQ3ZN1JhgG5W@ra8~8F`y2V@5nl+3(ge8A8((F=Qx>g|B zDDKI-lzWy$2vF8;=baNiJA6*~+;IMS$SoOa%N-t++eWNyhR6~FcZ{=S=t{;}%pJJ` zdAlm;hiLL+1=?Q~X;4SRoZBqzLXV)&@Y{ANvgVV-;`GIcw1EEVAV)UV&bnHOK0_e= z`B3*gVhQ@Yp#{xe?2~O5vRINi-whp5;tAs%E$fERSSZD$Y|jEivVOj%h2oH$45^*u zB>oyPl71H?m>$~{JHd3;hg}s8v1oxr#7U};^q!6YZ4Vt)BxF@{`ogYur8DTA1S-2+ zZR`@Kt>M#i617^#i<;c6IR3d92TOcJDJ9$4sx6y{i-*%Mc{G0 zn{+|cz2&-|L+~t-;k)X9@9aE76VP=}2j56)z^ALRV@^Hz&S>GfaQ0n;Z$oM_=Eb)7 z)#FkJ8^cT_`6cJr$50@u*55dSU-%7{D@brEK6LBQb>mXkt=$?~@uBWwX`MDYRNnVc zo${i&eGiEyGbkdNgr`{X$@jmGI-f>&tmA0*+vssw>gX3OTotX^8t+N_i=;9ZHKfi2 z1H1-KAV))?CVAsuj94sckh6(Ank_C({L)n(g)iu8^JS1p`trg1L|I+~>R>jl+RGbi z7ADdS&eA9chVuOyv=ClHjS^B0f!C+@;RUN7Et~?^@ zWHNiT{x>>pZAeWqbh^mU=`vz6B>xSa7K1@d=kcF0s4Oycimuoq`ViLEC(tBIpjgcZ ziT4|vMbYGYUpF|Lx)Z3OW@C2(Rb`Is>firDr&BGRvU0yk)emJ(XAe#q7(xszzk*|- zlRlNwk&GB<)g(T~3R8YCrtx;xCVF`|azEcKz_-KrTO4_^HXVl)d-S1oNxFJ+OxJ3zxPx|OVc<4z%1|1QI3OX18d z>2n!+g2?!S6nXdw+=pr1)hWV!1)jlp$=i)dZW$6w4gB*85h+|5bAQTytet-%MMKew zJ~I^WG>VtKH%McOcnwgrLaZzW(h_LZf zi<@JG8`(C^Zk#s>l8H7`E3<7KH&H5nC9!{zY}+xFRxx7A|<^t6w1I z)xSduiWdWcznudkzcFy@w+I}s9Wn~>^#ELX`W+7bPz_RDPCM$6GS+e?{% z;kHn75hbFmy=eTpC?=zgg+_T4p4^r}0euq$x>Hx{#(=JZ-HovCryrm| z=$89TF=0ff^j4=BeCl0OkGdpQxI))x2{ZM{(!{&z%T3YgyVbaRe{vYMTeTmgzhlY{ z-mO~OuisQ}RQo$=U0fWxWh;NXw^aKrmVff=lT+RY=?+uo8B->|nSOntC%ZM2Q_HrY zs&G@f#T1^iTjAFF(DVPPT!SfhvME=WM_V(qx5x$1=W9Zo<=}`tkso;oykiWSpGwHG9 zvv5&pjj)9A$!e5x-GVZx-8HH?yv5SSY-g_I#5n`7Mdz8)=DKCK@kjLLMJWWz7;_1<_)uAXCH?yH$HW6 zZ|wbp@hR<)ItB`9Ne~AWw7a3bUTo?b)|XHbV8MxbzaTYH;tIJVhNZrQ^@4-AM@Qf>`0! zhML8R_syNNepZUlIV9bW^4h;!&L+Leh#q7OHE%&kX+mdg9M^uuTao8Qc>XnEQI{vM zDG?buJhQ9|Ug#FZA!|iq4z|G9__y$Or*HahvYIB`Zp7i$wh71gX8*Y%G`L#G)H~I& z!krC-Yu{ob=bG%=NQ$|+?9yY$>>>Y20r>Cjo_|m9LqYz%cF(^j_#2RK2A|bN(CrbQ zX;9MW zSwxU&-*zMK@;J<_8&Gb|njv7VO!^fSa7*4e%80A#rM|eD#XEZFiKcohpK|tqxm&6k z4LT&ERi%z#&*K?(UPe!kIj_jHB<(qtid9uQuj00#H%84e@7J7)4W~{wUU`*_q^Q%* zx(hohm$5bxZWk@oo^JNtxm!F$W@wOqs*6a< z_wbHS0Q+_J$IVr3_Q!2i%k{(kDd&2AipF>~lIpgq;XTzQ>^)$%M}Qx|>lp5sOK}JS zl!=~KZI_;q>U3&xAne*XNK9tte07*$dzrR+VA!;Q))_PKy?$R zS=a{{ry_t2YsnYP1H=NXG<`~@Pi1!&N(G289&*^Zr8iD$EEz+gTc-0%QzQR>$p7!j z9~29h3SiCIig9yg9icYrbkFMM@8%@-^b2?Wf8w zkyM3kZp1O$PhDnHtGN-M9Gh|yDGJrxh$FR4IffKPYHq}T+NK;tiUKt^ z;x=tldXl0z%^TP$WfVMM2xW%=JLu1fTXXuE;=@L2`nDqz_=DXH2HqU5Su*E+Is1kl zdDZyet?#W-aF@Nk673L`NV`U%=7$9vE}t$gk4{}5YJOK6q0U;i241H4=lI|mLFwIT zK-ipimx!C1R2r5ymtwNE5@dt&5{)|FZ`X`opv&8Pr*~H`3D}(`5z$Ia0bT0F)nCT; zBYyzJyY1ac4BA*I*1@s8&Pe;`Cq;(7!0ro1GZM8gk33t*{=2q3soz}IiMMq%)o3z- zc7Bs$PC*XV5oC)T0*$Zo^l)k{EB}SGrxv5EF<+{2 zl_qck!9BoS?^p5B96_Ct8~9)`MOd&>ug5E~KI*JjPPr`D`$pxLY~m5f&(X*`U%Kha zFm3wJzBo_pJPelMrV|)0_wfr0e=Sb8BXkb7HbV%b+Jb0jahvMX{DHDq8FfdtL%+7z zR4h0@(6y7-zh#!|&dqNLy7a=>2wWf&zs7DamGt@u8(}m+{+jsUOVH{lw1jG=vK7-E zx@aMW+v_H2?#Gc8{rwaJ4&&IJ!1OkBdjAwpp0hKNN(Nl{+wTS(<iaUs5+R7s_k6FC5oE8f_c$y^R(v8 zf##&-BAs;a1WVCCuEEQh7at+fm+#QBUS7ZN#pJ~a4W)Q|K?CGKJ6Xp^*?8>Rzrn?} z?)L5%a}Pcw!j7#W+zM=S&@Nh3KcIjW9qkg!VD4WJ&GCq6LvO~l<&j9?PPWRj8`b}z zd1t|lv6{7^n;me%uFlb-KPx{L^Qm8I4=fudNI5sl4QkK)sP!r=vTLt9UzF0Qkuxt? zA?AD{n&W?w)XD4_RDiYEf|*$oqq7)qX~7MpZ{+E>H#F}ADvPG-kko4nX+Xkz;n3Ki708tKXyKwArN^(ps4jKgL0?CvaxwtN(4|r~=8-D; z*h2!LM|SEfiW8WdPlGs(h+p)CrD@$cl4~zqY2o+x;m;mXmnuFeGIb}hnoL2!i|nCC z{CAN)GU!!7OP!oG5Z{Kwjh-@enYqdeWp^{)&=_5xe^yjy`|&~EvlX`~Rm=DylwP~> zR?V+G5wS#_4bGA!O~X-Deo6w{DcNp%jSSf76q`1FJ0zxWJyQnGprZo$33mgaAibK8 z+y`VB>I|CdGt`bXrg8P5N7h8AE{qhSXmV_NStJyBHNCfKRTHIsMm&Uab*YgDIXfwK z2ll<$M?|J_`*0WiEx4cyI>`h?=LI&I)Ek9MBRf{wUZB_7(|@ArR==}&Jx7JMV*v?Z zpnX%v5){XDPT|t0)V$cBwS?ZVH`UV5S3?EU&$c!BC8z3C_r^@tUfO@Kw9Jbe<7mhxR z6AgIQJ-7c;*KtjIN?%6ap!1LR%L>9g4FlW`R25^&s>z1TR zC*K#Gnl||!*i*jnBzb@#FJ82f3yQ(t9=41Rb$f*#8DAXXf_9xb*es#r6zk|z{ID?G zZBcXUN@LDcuJ&ZtS_cc%yztosk9h~7?LADPjF)F|^6QJa=hH^cG`|-|Zc|hZMu1m& z*HS`f&SvWAP6c=lrdc1cUoDI)qgpsFi=Tu|2*dcg_z^xI6BL9n0|wL(A5=9@vaqj* z3YT0|34Y;o()*LD^CD28vakN z&3ZB$c}MfdEpYbsj^c+ra-6-qCxf4C@VyuB8CE-!q#09T;5=mU|4;R4F`ZxEMwr^u z&FH4S4u1IcowA4e`g~J;mY6Sj_fo#4ZN8W%78_!g+YxFrI7~{pzsx>{8 zVtF}C-@r`NR^Z7SBy6_6J_D|C|A*RXiQPQ@k3>>vD=`>o3i}R5f}k2c1tY=;95_Lh zH6zHKDXXY~=u)LC7$vh*75 z*LMkLdRrNPl7A(Oe?e}un-sVEPFy77mOP?VEgIcgq(#L&dgZ|CyTA?Pp*ijWgo=qq z9QJV9vHHYokPMah(P7F-9o!Kav=rBj4r4FM_R(H{q~_DaXE?dd);w$ka{6!KubImk zl6D-{<00v^k4uj1fC<|YTQgja@I#0C-J?k|43)aSl(f1F4YB?X%Ab=@dG(a z*2mh1d}OV>_gr+?u5^F?psh*7baHr)_+I9E;ezBBJ>q?Ew24p1W!7PrR=iZU9V59u zY_lFU>*E^?UJ+Ld(0C8%X4Jm*i4VIK4Eo#am0$nv=Vvsg^Z!|CJ6!&RjMB+wTQR>3vimO~g` zN0Nh`GSN3Y$@FMrWa@xn>?cq!R;OEF89#(JfiMg-7b(JI(%kAEG`qPI zIG8=Dsxmx(h_a(dxg~#42`ARCU$){MHk%EwIecXft4}qyB{w}EFHJT6JGtr0MBik| zPst4qiyD7;E`n6^7x!3beORf5!0_;V3Ay>T{HYI(X^RvM7-PVXXF6RQaVC~$E8M|DBqyCYB$+PkOBB_f?S-}N z#jCcrBkr&}xie?zx>)L>fBWONBua)z;hK6^7btLS(QU-i5-H^pp6qH?8(>>KVpJuW zu3Kq5`z+i(Eh`h3Kq#lZ*Z9&<%S(a|BIzgiLH{Pds13DTM-w8hkoNKWr5S@KroSMQ zFW30GBG&U0tvsTfHVtxKMot=%UT(nEvQmTY@6)`PJFM~v`ekNuy?Zn@Lc8ttMeNgW z^M;!;$Exug)AAF5|IU6Kj(LRLM}GIy@B8?Tpb1a1j8{#1Q(8wsuh|zqcLz-5MS9(L zxE=5ZC=!sYl`n2D&Sf}@va1;s`x+cRoLeaOMhWLs+4l^HdjQb|-p)Ua zyw4GSnb-Ywg26|V&DdFkfzs%fY~r&-B%Q>_UCtXUpPRBO{c{h@afysu@(+_a{*HG% z{E>NcTB~<0A}yGC$V|K_lO=J6TQZMdxQ8bGM)$_~t?um?tXB|t^q+T~4y(|KAJd8% z%F|gghKK%jmel#bvK3=`vuK+RYk9hNK678!e2^-uAs6SEm1871@@KPF^!sUZYZ}f< zgd$T<9T_QHF}J313}>TD1N!Ux)%|+);6$~N*X%QolvbMRTN-+DbYG-bkA9&iPumMx z4UzdS)%X9{0$W}k^sh^d4;;#B+Gmv(HDb={z?q&oNbV``X>RrBHzeSTUOBvm*ejiN z4f@L}=*^00+T0Vs?gx>nqrq@|Ais8`*I$%bHnX!T(HAtzZ%b z6OloPl*d3MTDUxHG3lbyw6I0#<1nc7jSO1Bvyo#`^#%PP&9U7{!@OSa*7nx^TTS~F zA`EuaEB+o3=3NLA(2r5I>@iUS1cuvwYV4v!oNZ^@FFr-K){7E0u}Mr4b4wh`Qyi34 zK038=Buc^D6T0{Fw7J)aqFZ0+nti-0q2*iC8b&|d$>_fscDAO+R z?Y{?nbM>J-8a}f1#X|LMO37P)xFu^J-MziJ@?Gt<_+t9n73H_`iMwUJY3 z<@6K#)cvmLADNprZ^@nokz>p+^L5q-GAWWc`ONOcyT+?KR5~#61P(Lz?P0WdOAdLm zw?=k)i-}IlB*-?(`UC^&9Xp|f&rUzYhdhnTtPk*2OqCtZHP;JVs_Yzn zn1WQvG+Q|mNsT{jfsr_=Yb(9K5);`X;+JrSyJd$_M%H4yS-pW^n!~6?hZ2H$z@5!< z?^q7umxgY71We@&;9ag5%bJvSD8<3+Kmnf5AkvSgJ2#qNF-=h&a`eL0`c*JMj(1!GXmGjXs(< z!*1E>?}&z*ymN-I@cXUNjRN?wQG0vODatdwFrK+#_}-Bn8={AC$}GGyt%!huzSk2N zk6At(5td$zBs9x9QG3u1$$Lz!C``# zs%Rj^XlMA$agNCQ@sE|ennRR1$d(@kbGU(dm1922vmmG%`g(ssD5xF-AIP8n84bf! zW8e$_N^f7l6Y|PZ=W?7%Eb5exr_1F;MiGyGbRr!=I3WC855f56$ z>%9+Hbmh0o`zKWUA|ALEF4BR|y9e0d>s@}$M3)en0HJLu8NEHPgCB41=yc>QHXA#AvV7ei1}>Z4IXwF@9nYxPamBN4LFUO zp!+ancqdxSz`!!KqPip(L7SXC)Zk|a?&dX^TDFv~y{@V_^kjWiannn^r(yqJJGg4? zzt^_&|7BIUi7YBz+rI9YF--*pYdh8~Tfb@TqBZZXU$&mK!$@26()#wbTi1H)+v)nR z-d@Xp@Vlv;Mr$8O)x*y|y({wD(Pl_siITn*$q1`~5y2Ord#M?3NSM;bZ^qKca59zZ zj7>~`_uEG$I}C@dn9H2RD1FCBx-ayb3rO2FR&Q?`Q`(*=?ztk-S3{x=*GlRF-F~23 zYq-q3x91tO$|SfH)E93fAD*d#7#dr%I}P5J$3L#r%Zpqb`neSpzOe0ZUYTD| zTTsw*b^KfN3*cG=?tb$%rY!4+n&rX6eU*{+k1Cx{oNe7ozZrIxg?p~B_KQ4GeKr!h z;x6QO$Q=uZkJ7p>)a;s{R2FKkH9t%E*`nh+1QD1w047|3oHOSl7kVGDCn^~=-HX#5 z>8)Vl&)b@X5x3Cg*oxt%j?+Nbuj5FdL3sQElmlvh>J9E?f35S`v)q2n37*&PwR1?N z_p^)9GIHxHj6nU{28t9V!au#kOqjKRFCW%M89PcWxy5EPa6?c(gJC>O9^kEef~3r9;Yxw)v&&Jni>5*eZeUG zS%43##j5EdIqm*fwm@$I)){)KGxW1I^+xEp&QJ@698s{oYC3<*9tAS#ORw0MzauI5FY zPrW|?S1lY&Zdn+?mM*!oEi?wnlsPnB%I(K3cTkh_i48NbV`cm1LrtdNAf3i6ZRQM4 zmU7K2LoL7JiT{BkL$tC4)1UHE!C7zaXj z4q2&Z-oJx-?hQ5n3$U5rihfEm#g}z)sCog6+?z*8l(NpBKXy(l>AKdx>0e?DDYl0wbA0+Sam8N`HM%mQL`grpvtfI1a?E&25Pv zN>KeBc+MJgimv(-7TWW4>jJ()@#9qaw(ScG6D9i9uA}eOOGKq@4))ehLT9!S7EWi} z&)m9VbK+wVM0!Y_4O>nzv>Jl0Qj6N(+BHv`x;KdI1=OvuE+|Lk!@j&ze95qA^yV3v zZ`4x-olRA|YQ7z{F0YS$&i&_kUHuZ&WyS+I(n{j(NSfUMtGPvb8q&sVNEXR;W zC&d+UY*^=Skju1pHs6|;*|ewqv`a{%e1#C%57bTj`IbJF56O2q3a{9dN}a3J5v1m? zuvlOH^Ue($pBPj5e$&?_@srlFsQo4#-PeBKO0xztI=D3O?hOBcPB_Gi-(Iu!qwXJq zI)Of%^RRH9u?^soy16p!tO!eG&dv#&Rc*V~qQ&acnM(=gBGbSeNYo}qC3fMlORr7v zx>9?^l_>3up`#R@5^qS}szFeT1D4#{7p=4&oRv{bbVaas-WMWK z0^n<|sZM-b(Kp~+l$c6?9hF=(d||>723q+KH+s9xU|vlVHO7H_(ybkzRiAz9%9GwM z;VQqZsJvn0+P1r|`2LzrYunbo^VWcMByZT*^xl~G{w!ra?@le~x2=21HJw`QbWc-- zqNlNLf~NI$A)@IA>t#IzL-~>1fNr1vJluc(#D5;X-G1NnFZ(>pe~$B?NBPftKegX~ z=08vKpWpJIJ~{7xds;eghv_m~amgogGODlYo1dK1 zN2Ip&10k%Dz)UNNI3Exy)1qECM(>mDj(S{~m9uFiA$d!Em!yxispnS%MKuh;rrHcGZb8Si`i zB97fG?)|w4=i{IoCaN3Gw{Da5P9}WQ!BuR{#eGXW zc9G!WbCCl%>tQ;CC4<+D_T~42_EV@iNsGJn z755RUed;gg6E9ASpx>rFc2=$;{QGQw4Wu&q>)v|DQ->Ygy~Cv5*$%^Nv?niJ^Fw~W z-ShDt`%TWi*@|oVm>#dPhECav4id0vnJx>{ccGSl(P`-i`I9$3WM3Q-adE^LZHLCU z)py6bCHIn|i=BIF-aNXB!7T9OCcKdPks_%G%C=Ss6AI&dX3+;Pwa`?uAB6 z+_U=1rKdVuafom-7;zlruf|#39bL}wsO}tX#&sr@v(t}bAAC0XslNqf=eD-=HMEXx z9unA!PG6?Bn)pIAfiQx3!}~kpt5HMSjHi(3-M1=nj_KhsLqDXp6X*twDZ>nwUK+=Z zXuLkpEDS#@mft;JwnF|{hHvse+M$;?XbcAi7@pr#9uD31vb{>JnVZAUN`kSU(bc)| zov1xR#H!}w{l$sHlN*a7ogH*imaXh~+0c~`pR0{n;P3wxc6l1#Z9k2?WX)#Y^XZoJ zfAz`X5c~mwcc|f8Z8Pqbt!VsE%dL038EfdmPLwe1XBruU#Oj7#Eg$Rw62?rEGDe7| z)4wgb@c`e>A&`C4h<)8cPl{=SI4Xg$86!-tI9!Mw?j&ED(Bzj0mXYVP9H#v1@)|(JugrJTc$H&hjwHjFNtd zUdr)7fM=_)D9OvOuZOm8Dk)s<6l%X6!ZCQjw`^$J+!N;Y`Ef0rx?>HMHwz!_->zVm zixSs`p%9I^6)*4_OVtv{gq|r(^v%@Eu7|IE{AeW;0P~8&$E7$Ax5Cr-A~;>FaAmA! zTxq<|thEsW8j@q?`mX)q9@M3NY9LEubJXpT--YbwX@pnf4#2M3p;*_w6Glbf_K5?25nXPs-w z3UMzpk7E*g)GP@lU!!VT*T8%9X@2WpE#pjA3B;U%!$@yvc`H5)zmI|Z7N*vNUjyP4 zhMj0|I1qXXf-O{F3nh#@`4e(&p}*LvJ(<`c1iI%aT37tQ*oX^Dc7~EIz~zWnxsG7r zKjUP$Ic2`aKie=RIv9&`^Jc_(+xz?J%D4pFHpZNb@It+w`E1zTi?3Db3pXsk9;B(_Ek~+Ht%B)VDLT#Db@$a0B*H_sXRR9KX zm$%>c9K8PQ6@JTnDmg;1v?#IiG2f3vaa|VDAm)t1=pgn|HWsI=5JHA7Fk80bYuuxp zlBLt7G+@KH*fdf;wXMF{Ix>IE6<7S^ipr^%MHXCi{^dWq{Nl=l(cL5SXH?Fd@uSPn zyVOh>e7$;RyXI&`1C6-I{(5-kjJpXMmMRoj6vQax*eqv664c@Cu#6wO7H_@ z?57#QkE`sD=Bg(B;NLX=M9`AvDyd&62|xBIgF*V_@O;dr1-fzktj)NmUsrWTgjSpxVi4WJ*<%tiIUtAIoL8{0dOX~Yp?z5!6xKjRCK=y7S z=7#~Y;7FA?PY{kp8q5-Lps+f5*a8bfXDD$s!@*4k9P20KmFsBlAxB_?IXsI_F zZ!FE#`^hp2zvIx*%P^ARexpC5Um5{MocL+9elQecblwgoDu|o#JKh>IZ*x<#Bm>PI z5p}upS}#t?Wn@&^#Zj&UQ=0xkhJytx3+MYXEzk?$^UOx%#e$9GwQ?=ILTZ5-Z=B+9 z_kKim0$CMxT2y6&vnBIzPTqHxeAsSl$=nPa>7u0o$hdYKp)IRJE3H8O z?2HWhd~Uni(w;8*H1Zc1=QPj*eQsS;7UvF2r~xCCoGL2@BO`gxl+zoy+}Y<3{GNJ} zgHU&&=JV*HXzD8U!&hzS4vfOjGY8xD;k*=TK9LN}R65NXx5ZQo$*9~gIV8?IHTq%0|xn)^@t^P{3EXd zy0hd$()Ev@=eL<(1?i{BV&sw25gmk8VNP717o44Vvgu#y>_t@zh_ zl7!Dq^(Em{>g+6e_jx<>sKB)_v^Y8D4*`34sKi*A8D}!lt?>ujlz&R|aP~1=gu%%bhhGf(j_IPM-i{X=~M;Bc+JfDuB-7>}tvk>7fj|S8FqGCKnBBpt@?_D^012`J1%n3N=@qLSEKk zOf+AS_#7R`aQq0R#x2`;zUa0;U?mm^6u?ZElLx${ zXBlQR@B?>vKgx8qB%!n#j4B#_Er9YOc;$$_+ZcYN{gkwb)9IaxtC!fnc`12gsf(wF zpOrp91oj`0BN(TYo6OqOJ=yf^KTMOh4_%jGuT63rAF>hWMP~k#D~KjL>zhUnDTot4 z=Hy1M2qxt1R`2Gcf#{a}6FNqcBexcsZ=J(O-9?8gNcI`JK8M-j=NvM8w$~NzGfXCKkpl+Znl>D%*r9+WRAr^J}`@ zf5%ym)%0XM_smM`{S5*>1~u@iYQ$6R5a1Prn*YdO;WvlM^gLNTt8AUMW?*$TiH${H zMC`pAfsq<^Db>pPeLQ7Y!k#m9SvdPz=0lo(st`Ipz}v0Gk*+O%ZNyEW=uIfiE@!M` z7fh86Qob!*BX6p5=V_XVIa7pds98s*z4Kt_G)^&DU8wXXGId&_;k zyaO2*aiRUI?AN(v@0_bSAY0KNM2!U^{7e(5XMU#fV*M2~<6$T`+)N*`qs~|3=wN1i z^}806&7{De#Qrs>XXF6B)-7uWc=GdX{FQ9QV-S?WFO+)O2csE^a zB!gZDadhLN^@xD%>q;A%bo%&(eyx)vK9A&0yEPir0QQdn>%(8Wu=<|72K;LS`!Vj%3~m z@Uz%__?9hb>1@b*0Yxo&@3)2HojHo8x4?NuKBw>kdMaG8(VmcHJ| z)B??KlF67@qDGYJ8nUtz&(^rb(yr`RYiOj(jv|fe#@mOX8q2r;bae*(=altezUtyf z!S`kLaJS_BC)Ga+zu~OXO!SKA&&qj*5w^>DGpBf&&k42?;Tz|veh4a8rY$NT(K6D0 zM;ca3Zw`ae6o|O9iE=`rGi{;SDipSbn323EY`Kg5awk*HJvLkM>N-_;S=9_@2{BSk z%j;EgZ&Nbu&9TLXkjB9A$~E@!2doY|>9B*O=042p*bPaQz1u{o-;dS$fo+079y5s{ zATOa3j*A(m;z!AcO))=H`VxwDkr2B?p0>n#kNt>j#lFB`J|_+?p(AwUEn9IkNnyj} zjOU|7#7d3qN(@|*8%_s%df`IiYj}xI@yIqg>v3-$Yz5 zb6yP9uR+mJWwu(a-JalE*jYq9C+BKxfWUB%53ix{!}^+cXZOCpFizCjmkYy~0EEK_ zT2xl5#w^FPH`ADG#a5uz88!fl_Pbneemr@md#8+!r|zgtaKt%vpI2 zp!jg_EGDfy1#?JyR?@>OyeOzG2vQ1yz_eqtv<3U$-Vlja6AngiMJ- zO88lCQC5+ZxLp0n%E7Tw{r$|F5CU%5Ym@!V@zZ7A9ioh#MUp@1VF3rW*hGC3KlW0L*#<*j9m^s%eBz&AMa=>MNELdPk(O={OTQK-$O03&ZkF^X5@%h z6r{_IBHceo&l}I^4?3S^MD-XjWE|`Z_TE$9mT({Ocm58j;cv~0SDwkSm6d-(lV8e8 zro(w5(K{nph;ian`f_fpL46Qp+<(QU_v zzjtJc)s(#e7L42*d7vGPI#*kJhb|d zS&>ybC^ZMKMh=X6oxFtzCdS;IT0oYifSRp%o{#v`*|otJt8meUi|s&Y=}*UIdwhnkwGNz!6>}BJQ;;CeQGvqj`58RQ+IG(!)NLQZ^k=9nd?*A;upyjg5#feHfh{3t+Z3! zy2u!3r&zm5HEnX3Go7Nz1VrCu<;tY5bsh_z|qHTTf3He~*{o@e}Z?=Iq!@#@OhsQzQ+947v zhVQ&yY6n0RiKJTR0fA8It47>9S#|`4z4td-edJsw8`46gNkRCSv7$+4f7t-5#W&gz zGVL-wwo9~*uJv$*kKcOcGPi8`X=-ne9Dbaq@51j==_JB0lTmrMWIZCy?4|hiIAt%9 zl0Uy2dkal4>m^^`HwzaXo|RJjXWG2Iu676)vZh>VVZO=YJWz1U!Umn0tBm@m9{8?Z zj-g4%r*Rq!Gk}iGRO7eD&G0JOr`#I4-Sr!$=UvO*d**D895`DcdwK65k-!tpQ%evY7Z%vx;0_IR|v)H|0YqFXN4}s$Ig?FcgpLofp z8u;F7_`ob_7*U}oYO%k3np|2uuddd+j={7wdCZoFsGkG57^>IB_gA~!@ukGh@Q+w; z!)fI-az16&ojX|^5KyE^^>^dvD7-td5q>^kz2)ayG~cDlP9jbGd?-Rf{Ct?!IkmkL z{ll)c5JB5A?FU1rBDP04WasmGD^U-%R>VF}N0IG)Em?+puQOo0N-)YlEGK&U_W9(f z{naAqxh^9Pc=;4{PZnPE<@XQZ&)$iB+>%fKV&HN|7K#AF%WqdKHPx6bVs9fzo~Wz6 zzbGDZC)UgLZf|#dCAWSZh34lMN{o$x%np3^jKPdZ}BseuA1? z-qqYjE*Xy>?a5FpOa!Z;o-OuK`_o%XNwu6U0{HFtn-Z60EB^K>IsViwhvDPzLRZaO zf3o?_c)W?cnMd;mP;S2j{r5o-3_CA@W5nQig2C}JiuheJNjM(oosfs)slrk5g}th7 z7DEfZ)!y_;{n@cHLMQZvZDcm}zUWjMYhdSyM@U-lZ5kkT3W5<_b#~ z`2JAh29b}|Tw@{Ha<*a|&{*7(hQA5FjYm(YMQ_fFKitt<`jL`|H4YQQwk8GaaL)?nCa zAP~G#FhJ~%Oilbc`9;O7k$HmU92nZvOWx1Nk@qdw(e_q%dBufkESYQVIxVvaX1DW$ zTX@*=d<%e4?02lJZ|O+%JYqkbS9*4I^Z$TXtb<8#W{+pN7$G=-+F3};qz+j4|22Pp z<Utf3h?7-##(zZVgKoWepr5vSs z<^B3la{T%}-o3u^y!-^%VC!fFA>7L&gD}}@#_5_AMt`{(56dPtdB z3_j4qIh7AVeg*8S1WwGx z`sl__ne; zt;uo?TMWD5d!Jcan|ZezzGviF7_ffG!az7bZVdH?nk9?u*P-UoJwO?9?Gv$!frzs= z*6JshN^iNWs#M_*&30VGJ?6nqDV<$ATMf=f#w1HKSpl70Rj%;0a_uxqFH`92W?xPU zL4S5&6c4mn@vWZf%Qy;SvH7wj@rodrtp?eGS-frY`t-LJ-RAv3O-_(Qx;FD<6)xNQ z*aD%^1{D3%Z!D$eU#MB9MlgNJE9MY)uX^|La%~;f-%rFK`Ri~yYOo>4?&WY+&h^e_ z0uSK>1tQe~!n2YogYK-MJGI}AGnAd+RE;#ZHl7PuhvFIc$@NzvOS2W%LmXdW8!b8+ zdv@Z428f8{Cd2WhO076sPw`y0dx?n0#x~09X1CamCqr85k*LmAY+vI47{HIrlgJaJ z3(2YFW@)kuLgY;D+&6UVk0B&bEsFy&Tk$7yn{mW^joNaDBuuDz4KIO)Zz`dsTytynq*>()=o0p0 zexqK{?lDn<#x4Tds$3uS;CDcKu`&@ubtcy#?u-@z_aNi+Yr6M-h3U8Wj9i}~wu632 zR6<0!f3O!?56b*7o3G7ahe^R`KE|#o-M2N6tJpcsyEmR@nx=gRWKHZfBj=5ScV>zA z460nd&hGDpB5CB{H?|IP5G8i66}B5@zabf6MUK46**&T@l$T*elpl;A^g>JdO(X@B z-_GyksFQwYDPOull>cJ1C_fmA8T1Y^;95m_?$8M}>pW4|z0GXEqk2@>g%mo~QIw!( zTRMOl(ESx&{&%`p!#$Snmm|Zp?bOWX!5%l}eoH!ZI1yaE!&doXn<1ZDXYlbbeJti< z&=N%|hO((p7>s2|`AvGR_$ z6P?PpJPFyKt9)GLt0-@FP`%d?5Dd3ke|>4=BbHrEPBVfn6P(aye_nEW8YUDxcnq4{Kd=Qh2-n?n!)cG(zL~Q*K%Gt zEZY1x<*m8fNUD}U@v?nvEo%}gCsxs))FUiMLoGKen>)5kYoCpCm3PL`f+l4n)XbnH z$Al^BiW2Xk2N|1VXAsSe{D8+8DuN8B>eN$!Rsqtst zIDGZuA0N-%H9Ft6gQMoUr-1Nq9Q?}Z)9$IIu^(ZLhmcRLJN}6`ZdiX%-Q13oMu+fK z#gEUFYu~&-4(QgeT=u*n6pH+)|9>td967wVKUa)qE6#YW zcfqHdz8^-}z~&TnUaxnS2(u~mcnb)dvxV9l7PVtSfKdciP~%dNCbgFhR`6owxi&ng z-E7WpmWk{2u(QPCx4z!&0duQ+CD6Mvh>-9ajd4 zumoH{bYDB584dXTD#Y=(=MMi6l|OzgnM2Avn#`6)@Nd_AYQ0W1>{kmPtmp(#doOVy zT9faQnt4|JX5>ZY@$fTdl6){2Z{5x({P_gx`3+Z?WV7h_ zW>hQBtuw!A!RyJ|Vh#(vmwBnH{&rg*VUeUReIGz!=QZz0Rp}PlDiSD$MTCKCX`6ir zzsOcjw&e8ULhqzpoo2T2_p+BgZC5XvC1a_w1?TBe@+l9z1lZoLnF6|1fAlTlW*=C= zh%LUxUe20*#~LS0WJj=yR(6KBiY2@$FCec{+%}oS-kv^!IJjNom6WJ7E`_>>ygCrZfGRM{I~WgR#si;>a~SD`p-AJCm%?Bb|#y)rwB zb;TWA=v&rCiwgoVOvuj;B!zSZP&y(*Psa5d$=T#OCgQH0>06nl~Szyl?hd zAYj(ddhLB(%Bpg(Z}RBF>tm@I{m`TQbD%7m{F9(w2lNO#i)rMw% z-C@3e?zQ^)s+I2%dtxl}=UwDOZvQP+*7kim_356{Tt`-A6IH_a9q&!%AxM269}!00 zI==hEj6o)S#?coue7xtneeBW?nf7X!IbV!7lK=d!{1eD89)?JV@a1G7a7_+I{{Dl{ z`)>wghTCwP=z{`p1WGP=Js^u#{P&r~-I`bH`}djsY<~^%=JzP|da3w`<4PR+^RB}B zM(yovUD_gBDr5vOR^Lbm@> zSF-%t<`oC|LoL6j8SdEfnz6m-?Cp*%Wn5zy1q9iE;(f71y`9F!zLj4fDAoQ_THCVD zDD^CgTjiqz@rM^&MdA3-;&D_=&Oys{IG3aG((imRw;13kUKf>K3ANYY3z_e4#d)evc7mQRC?uju$cq zQDcP)zPwnbn@_a2Xyun%S3anY$g7`s*3n#g{x9SpCuO{Q_=&qOURyYme3G&28Q&1)FkARX%As_QZs4NHZQfOCgF~}&HFBu?V(A%O_QLnX%7*2KKG)) zF!CV&tx-P%<#?USe+t83l*&A7>)owgtN2bn3VKWVIi}@9+U2Q)t8oa8%L_A4beDJP zFGZF4ANy+vO@Mp$&|haz;~pA!+~>RXSMT<2{WZX}>Ob|@mr%p+udV$2Z~f)D4CepZ z9@|+{4A!)0bihp$NU@@L7E!eqh-3JCggdd^ts~y*?B0Wx`+Vf^-Ztm3&bm^ReU>P@ z@#=SXn(?R(9d4Rny5<QXYbv;|-Om?zQLKQ#KBxKpnA z-Z_|n!SHIaAtB;nL-yI@Cu~h#T8eYsHt$)6ho)$;#bf;LVhf9~M64W~)6D=9pQzCE z=L0IdVb}&BnZcEzUd_j4#GS0K@8gsqxj`#ms0vFOKZ0G~-CmG5A}rs)$;! z4j%FQ%dYCW`&(OiVf$(vArW>H}NQJP~4mZrFN-|_NCjq_RvwdeSoI&Hj*U~d5+EYu7(q-vVyLv&C|{U`E`7if@G(zH1g|Z=;?Go z$3cyB z(d_WvHv4{2oOu_Fs-3Z-_|<^36h96lZ$8Bj)q5Vr_nJmLv_wo^o9gCm-idvncPEo8 z_Y(fo+lpPwclsiE;fr#ryc8nZ!&c#la$`POw&v}uu7@%1o+^}oKX%8FyJKqk_)FG z`fF4*Zv~08f283r;NlDzpd3!gzPXHnJn%;rUYTFaQx-W$(~e{O^$U(Tn;%ko9QOt- z#wva|kyqkTlRM1Ox0il}F^{?>ZfIw#JH1rvn1A?%hS)+wDWokS3c9wS9N)cLyA?M2 zhOBD;jlcfe_y5L!_B%}6143zQ8$G8Re-iOxWunB4V?RA-|Ln4-nJ$x&xZEHwIk@3(kwVP}wsNe6@7 zOUauHb{q62XU1o}025(63;8=wk+I<60>DXJ48R?JrIwfPI8ePM&8q5R^-Ts@N~VCFxBw*`+TX$@tL_0ZetN5;?#xn4piagp#c!*ME%b2c*>o6)C{G z&JsLBD#Olu>o)AxW?Roc&TD85h`Yp*3WSqcq7BuN#rur?ip+fE8(ulyWL(nx^4gQO4mHgW^3yJ3nf{o&?RxYnk_p|StMgZObA%6u$ayRf_&I6%LO%%K~PBi*~i)Q}kOTd>Zz_<0lkibs%V zK{cg-?429HjL))GyEP(lKUmT`!q4A}{1((6+YLRmlDxew{VXu)&q4nRwQ$dhQGwZ! zehdB-%tc?rCnN()gi7DaAI(4B)AX(gavup&o6|tdR{YTvBkJ&?bc&K){Af`z9r-99 z(m&yk;5;v=rhM4>H}_TAYFp$on2wk{w*RcXEq$&@g5DOM!AwA#59NbmXCBDYdled_ z%lOq*zsa;kA0OwVEuG%{6+dg0zC@i@!p<8QX&aoE2!)@0J;I1=rO8|6-|CK9Odk0&_^B?++dJ7e zh%I=aAN8k8(PQ-u-y3zDW$qW=H7xkZ&59uVI?I7XnJJp-w0sjllxJ<`pY*T49yU_Y zm?dQ(JAEa`>>sS(||=-`MhS4FYt|G~bGg{jkB=YJ5z*lUdBD z$US6bGqB)~*ss||xA6B_F)E zT@?JBC7iR^m|(Qh&Q=TsqH)g`e_~IXTLq#fsFF905|QMHEH38x=`s7W1%^jhMz|3vt z{CC89_EI1IQHFOaivECRuSIQq5(`Off#G0WKzJAe95@q8S?`KZDq>`dxb8iCi>1a- zkEQBr4b6>;Lr8{~P}bFcQ%c|BaoEH*L*r(sZdjtBNUGH96%E+?& zul0o1j|XnC}cd{mRsjIeJc1`$W$yRNIA~-{%|j{HN%dx8Jm=2?ye+ ze}e57^ctkK64bD$VOK-ollf)|oVXGJcopCxsi(y!k<`o?G8bmPpR3-6fh&^&8H|$3KP?WUC%^%)8)aWP)WyhhU91f=Ffg?>W_mK22)Q_$HjP`F{BB?sY^Z43;Mge1jV5K(+ zGYvmRrsEoPNb_ypJMbyMe*;X(LVp(5nv=wU$yTf*m6N84N}uAflxqb@ofRP7S=0+daLi~zsrT?h zdWrAFz5Dn*>0#R-Gk&iy`S&<}_wT}&0Tn%% zzBpcMWQ||#n0;R<7m$)aen->t-1yb?lp4Q~_8tgkjvET=N)2f5S4_%g@Xn$lJ9w)k zA5vv+A7lq_3BbD#-q}FR{EGA9%hK~8K`kYo%*GDOb@RyO&0k6F4$Qpfzz zE3y@%;hN3@8EDK1F`vwN`)ZSQeuyt7FiYJI9!|Jl&ad2Gr?=*P z5APN?(YL4B_>L?y`?u{_K5#DecI`*)y58@Cw`coD;Lm70lcEmhR=H2B)MT&xIeeY` zvklq?#FsH}?u>{taAsWm8?$_?kpn@!Jb+F@0C{gbYgBT#X+F3)dwHF_TMt+V8y-Zm z9)3ozDzap=DP8`V!F$eLH$1@5_h~{dFs&ANmkM@(lkSup%8e98q30e_l( zyNKDxPhbawcII#({P>+;)3`e#HEZJDQw7Chdrq6P4p6ewE^A6Daf=c5nWfo^fus&y zr>L~IgYGOOW$NsM3Y~ts%k(eZfLX9|T=z#Wl@Is=$_K(AM0j=$kE`Gz`fhsH> zZ$72y<31i=D%s+JQL#aIEFgXqgt8~wIt!{HPv$S#igaF@hF9iS*@^`D1AN2DmvAFq zNG^-BnX&`=XuQhbT$l40@^A(>|6g|C;WS|YaR0f#|LoyEKlzn~yUBmP;6EStpZEID|MQfeC6EF>*`Lf z3^hMTMWeu{Ep!vzTQJJy=auy(Gf_>FJA2ML3j1@fQD8Q;_y%rI&2HpAU*`LQr%L(b zt>CBkR!Xv*^%tWfs?Olkv(CqsZSDe{0kL9*N`ezht-+ct58+j!T$5 z-{n=U?{7Y2mm6T2#|#|W(G>qZB-->-n`r<7z*ZE=ZfxB?x)?j%a4Jt<%^$_54UlL8 zDkdF^Y*ntZ6ND(0J!C%km8HX^s=grqzl0LVC0@&G@dgqNZfQHiGB1%|)=O`ZpFchn z*rDba;LL{r{yT^j3(2${-z7Ybv*{Od$p*@7KUs%E?I<#K661`kgDYmT6hlncb@4M| zFv(RigberoHJet+B*Fx1_NzKLQoLb~=@a$}a)UBE@GPGXJN)M+|9QC2x50BCKRtNv z@4sIF?i!z?&AaZ0NRPky>)=v_2v!koVMkmn(xFF|#Zr?N)3+;U4d>g?jOWCqLx=g11iBYwj0oC8bvoO?g_^nMsV zKYqXUU+>3WYwtC)R}@?Jo+P(cKd|4ea27k0{F{^9u_U(@&*EcA{&@`p^IM(dw&GbV z$DyUaif>Cw#~Qy;&%pe?DveZrEh^ofd6SLnBe}mGRQ}Ngsr|Po|IV4I{dZdBo}JqN z=gQx4d20W+t^5m9`+s1ie|2jAW6D2xZEF9ajb{4=FHG$}PWd;@N$o$y@}H5~f3EV^ zJgNOJQ~t4{)c#i~|E}e!{VSAzFgLY-Q295_Pwjt`^6$Agwf{ZJ-(8T}f2;Cuv8VQb zMfvBHrS|`=^6y%j+CSBpO|;p6HN_aWLB+9Om~Nrmj$fMYE@kiVn*F^^ai?NA?wf)_ z>{0HRV&|fA;apiR>@hRmJjLBA-A=_;nYz1F{>l*jPu3l7j|P0SFFtzN6@2u_hlPpe zt-IpNt$jK$eQO@z`FqeurZC8;41K9z`QMvA`qDXpSTV`BViJB%PsmfNNA!?(o+lJK zPphp9N3;rE^Y}HNKccU}1G}eDlmzN(y#Dhdny02FQ0a;2TD316Nn!ST8=R3)YLB8& zDi5!(GNS4JNGMe<>pV3jB=^mKJsuYw$K#!_1CDMv9+x%=H+me{`{?m_1NhDM=J|BSnlD++?}ARWKunZ-uDz`2B&1RvGZG z(?b!hWJSewdS%2YyHzTquKgC7lu!7s5I%9mRi&jOT-3ru44#S_-5T~*{mfX&p|r4Xjo%Zg3+dX~lf!2hXp0+y6i4@J0l%&Vs^)8x z%Y?JB#1jnH)#$EE^@uYdFN=^?9UJfShZQP!YGQ~5D9r) zp3s^)*~a1i>r9K(1u3rSzgBOo4}`pl-tyv*P0qzZl4=Z)sLH~~hNi~iud9^}QyB>9 z1+Ln5$d8uW& z!SMVUGmHur1VU?Oc=dJOKxKGFU04szhzv|6-)E$v%fE0@P#vkQIj1t;6ZGXLmqGqn z3!k5XLa_q=Fk@G%4%BOrfEEtatkccr4Tb^~uvSe!Vo6bXQR#ebP&b9OI{#XKpx)1f z?Dcv4)_6E^c$y(XPn*G~8_n!xK{2i(udk{~56MZz^!DrFuxv8=Ai`uq;$};jgSLOn zs>@4O!E6Jo7=6rDsO5Q$M%SiImupop5^_bRYyGx$0p_)7Q_Uzz;r+ozmyGlGhOY_G zsq()QMMz3NReAbt2_;L4m#SR-wiCxoS-u2gUrZxEt0c1J`r8Yu(U8-%zR-dRj&`<6 z@b`xA%lJQw;PQK2zFN;3T`)0)^crp}W_tUzsPp?6+_kPMUk#HkUbXy1mq5r>>uLB3 zn+SRQYn8uPqx}U9q25uo0aJx58uLJ7Ej6aX*IpTKI?X3i#Kg^)0kyKm14d>+se1Nsi;L zgQw!w;R*0V*ruUN(DUK#xX*zt{2X@??!Uk@;rC%5_?+;Pv#`0)A1B~G>?5(i1Rux# zGd*d&R>y01bhiT)$veSCw4P&WCE^RfYH=YfC%3lEAm(v@cK7lxA_Qvm; z*c;ygeh7NNbJ$;1oQ3}u^d$HlxDj49g?dj$gE8RzJi?#X8?OXIz~{KX2iiDnt_VCy z_~p}k;}4(T8{Y%Af(G1APNSa`zkzKh_!3-)?NeBeg}&L}__Inrza}pLjm3jO9F{9v zRh{2h4`pCJgTkAa>VROulHT|naI~0ugX_T@@JSJF5CU_-2M+oQbPzUgF?|Ux1!KTx zivaeQ74N|IIA{Rf*nF^ABJ+RsICXQPjomBbR~6D``CDv;v-~?RiHm{%Y)Kz8e9vx^ z`~Gk0Q-rTk%HeCHr4}Y3+uRk!$sA+h2C%F1T;Yum!svx19cy9TmA-9Q!BDzWK)2(;Uw{Ja&0} z&P9&VI z^e!;yI<55t`SWOluII`C&mXKRJl~s3#)$^5>i8ALbCTvJIrnr)td0$CjXP3ze^Oz0 z-}4SL$vRduulR~|U3I56!>kzmZ>5Y(hj8n_>HOgMG)_B|d_342 zKLj$+KlJzWR%|bU8H8I5uDzi*J|6tGk@*uW2P44V2GRv3zy>ze_r|{oHWT(=$n&&+ z<~jsl-pCpOR{axmG_d#_{B8$L;5EWeY-a8U-tRCUgKN->ZtacVcrSeg=7I^}&<}d! z%^Q2;mwmsVOR)Xu9aT>~mX8u{~!T|OVHdGEyY-)XDffA~k~`(H4J zNsk)8-722FB=!8#ZHDU(IApx;_{VU!%&$ngnXlA*s^-<0%VC&>J0>|6|ARv^abnUH zkN-i%>wd{Fi|(JAEKWH5%A>5+kI+Bhg@*iISJOreC6e!8I}NZ@_PM z(?_85#oqX>;7o9AXW~3>zDXkMZnGLdG^sw3hMvL`U5;lQ=#5*LkCr(6n}L{yO(Oa> zYZN&82K504Uhj=Nz_x>217OEnz40kv!|%98U*jGToKC!3-y{#Tg-K|MEAdOjbZini z;2D@1Gg#A8<{7PPx>b zw`ShQ555^z?US_J8?W*)4sW)a@6E5p<8Msh99YnFCf^m|woi=5M@@>yZ#%1>rJkp3 zR$STMrdH!!oalNuZ1s`D44(oc1n0sDanh+Cr*vW-Db?pomLn(LZ44OkU{%#b6ZJ zZ;!|C1>Xc5)gAv|Gve`A3;3#=u(@;M@u3&uo*R$f4}9PvFciFgK|H<{1i)F~eZnpy zY(=2X@8x++?y4j|W_3B@aVLls#p7wS@G zty1=@xhJV=ZeJA$u zMPKw57u@Esf&>HgmV|p$K32Ts{H$`E_&zhEmkKOEYQ6isZ zvhq8o+QF*#iOM-ReU(y^l_KLvUU6*y_`QXb3MUN{Y@_nk2X-zxc|DXPnOY`?`{b$x zlkKaur3<77)&ZY_f*I^pnM1f=<@2pY$ise9ct$i?cSA;#xY3Ql>3(c=;7A(+8mn~WBD*JlrijvExYE!0YDMMG(g&Vbnn%&p|Eef;2 zEVqZ%fS#}AO%6|;uJO1|CBxIr=X_aDlI^c)zssy_@dBD4v|w_LSF1PvFHKo{Axiqw zP|{4mj5VmaL?>ryBx9Vib;DAZ0IQKTec<<_O-bM92Jao{pX_!t5A+wp{GQuNKXy3D z-#yTso0Pv(&2Lux)k$uVH1B06xpR`-T9P|2DZOBl`_hsUy0o~CjZ&sJ?J~9mb^4m; zF!}XFSw3@;{Gx5DHq%}(yTC3^hCkUpC&$Cd>*eJ9aB@C8xn7)HAOCOP4_Nm_C;5L! z3viOn2p~GsL=GJ1k5y%$#i^WsGDe7TXeV3&^3Xx}W-uMy1aAO#bPN1FFb5rlyTLrP zx;)t}v4=fPkC^`y1z*Fp(Qo}!HhdJZPG!cUjvpYQkEqAG7ON7XkcKF|x z(r)N3c<$x2FWLeBd^zv+N;{lZCPX&-z;45J3mwT#pbB zqBZy^Kcwl9VXAmNzgmbL=oVPx5jrNrz+Jooa}X`ryPp1iige(v+vq#AhGZy#-fw!@Es9q3MY>@RHM1+)fV1NNfb@blmRItKp~bfdfA`5fhR2i8_$M}TD_Z;1CKiGX=uUX@XI$fGJACI+n~0)Y;KiTYL?_w_ zkNPXuDLMy!8SF)O!Q+oH4$&Iy0SD1RxDgyeH^Fy+!{`?H32+463BLw<(A{v>-)J{< z4m=keLp$Khz?Wzz><5CQ%!2R@AOqb5-wm?SEpP`If$oIQ{erQLw!?=&F1iPP@Jrem z9fe;6c61DW_c&uhhJknXGM=R!{uq=>JN$f{HkEexN*n!vcEfd`2HgbP(6=oa_^ za3eYje+Zh;J@AZE(?m1c4&MS=WO#TV*o5wa-vm)~H~ax;NB6+{$52*jhcC%Z6Fblj zI0{}sOa2?!gBD{+AM8W7z*n9|TcO?XnA1rEt-(JAN6<0&&*Rg?F?0`n-x;*ek4Y1L z6y%~i;a9*obQgRKOhk(bY2s|4q3!T8a4y;je*@&9-S8b?I=ThEAK1}R_&G2K9fMy5 z^Uz)J``{9E58MkJXfZKO3OVDO!W4fl{;`z7ROk4)}dgj_!f)<1{}nItu@@ zmL?+TCOGqK`URZ>A32BdCd0!^CleO!guf29q1~_#bfSas_9^rQx)c86d9**e2fi?m za=t(r;2Kbh4#J-TCt6HR6YIfhbPGIrTAHXv+u^<7MsyeKIG?hiCI1_^N7~_D5JijW zX<`WIKmvR1?`5{fgLgo zd@tCAj>0d37tk^I_aKJuhCc^;&|*I07VMSb;a9*xbQk=!OVY$!XbnEQFijjr+u>h= zV=@f9wum--k$Sm<#96~$bFPyXqT3pFB1$xj?_%YD+Gc63$4LZzyYo)$c zae}_g)Uy3%srDN`OpLe9PCLb( z;~pIxB*B|@7t@`jro9p2BY^(OR*p~0Q+qS6VyS9rr-DR8AyumiL zfxoU?eTQwlZEE_U_>)G6N!4TV%O9M!k!K3~qFk}4<1W(QK>Bx*{vD)$J87IbIDI2* z3t{gj>~{%!7hyLL_ME|Cjr`6ZT#i-a#8=lVMOtzkyUq}eC{Kkdr9X9q%(VPeXA#m z>cgkgZ>Lelv6L~FGLE5)rxN!R;^q){G;wF9E`xCmjvjms8fBX?IKPGC#KOJV;(}d6 z#EgzCF?Ca>IHx&7oY{~r##M8V%k`E#n$7Ec!r(lNemy1a;!QbevzkYzO>G#JHmQ1K z+IZXKj6q|}2zwe~#}YP|uww{&Dq&{~4r`SC^ucBSujFU6%gVuZ5gMC-**r7zt10R) zsK228;^-M{0*)8rz&Kt!Kb?)RbT+Hf*q}R&4a%`>pyje@#s;Ttg6NwUWj{*{&lJN6 zn^lo!x4Ci4`4sn%GUhdXSy?j=}zX`zWlgnNHxc$S|dhfi&169oEseC%re)B6U}R*v&CrJzlg+D#TT(D__nBIJ+IH%zbF`@eQ)ayr9y2vV4ZE3AFa!n~#Yf7R{oF8SqlIxo6&Z3`Y zsWy=7*(};g=CPi*R$hsmXiqGc%*zUwY?tM$P-T_t+(xy|jU9Hu*z~>@j}7U{>`w2o zIc-BT#n58rcz1fxSTBZTh#|Ao*s;oJvDK$C-B~JK%a)20!&&7`Zj;1#!!pFM>I{*& zk#;e3mdMY5d5p>ylWi$~1$=<@Y!B<%9M&`0zk)U40Bgjagf-%2X=nYg?B%Q- z5yE*{6X%eI;ZJzWKZ3s(|2g$oT95-bN(n<#mV(cydIM0C##JT$B&hcUs zkk84F5Ls70;FIkztIJ$ZthqT4_jF(f@;haxWYPDoenDk$_RQJ&{D9fzsrAmCQxI(Q za!ATDzc1qI3v{x5|7W*APq*w-^V4#az07}S5B;5f+b(R!-ou_?JA%#rKKqvmwuygX zZx!3&1Y0S#W^6g{_NR9%woYu01lu-j-PoK7wu9JuuvI76Nm}8srY%tR{ndE+`m-r-zV8WQtmGm5Bpg4tKw;j7b(6* zaY%8K;ugjCD}GAx0mVIvb9&75Cn}z&*r9l-Vyhly%I#L{SA0WKxLcKblj3cP_b5K7 zxJR-0#4Jay;&T2Fn4~e@(NlhTEn@;gFQNnST z5q&X7Ax4UX_)NK1>YNf%O#;{^*cNf#WJE6s`63)#SF@6&C3{4 z^oqJQoYd;%jc6J}9853OJ?jPq75Nz}g1X;otGO8~j5A7&*ef}<#lMDrxh12_;|uG3 zJuJkwj52!46W05>Pl%n^Y6I)^6AlRRA|b+h#25lX{7kwy`O<3rGcs59`OTF&p>2z# zJ7wFhmOe=>SkZ6mYr*xID{FK;DDKEySr?|pUX^WIW_eAxNFHA+#G_KvA*&lbEW{ry zpOv(>z%kMHEQe111?yw$y%vqFPngiXGo zt=Z&z(&yUDx5LK?8O7z->s|5$0x_P`R?XU;A*w<;zY?DyFGEKKUf0ept^}E)|6BCTMu6jJz ziLt^}p>z6e#F!^!smBYN!C&QD!{Gxij@t_b>Sa2_jpn3O$%|cKpMT9&aP2WXpM_AsKa`> zaSSeXkmt;rhv~YELs)sA#IW@p!P_@`&L3#MLMDIlK$|+QSBQlP_AB&yQIg;;=Tt;_ zxA6qFMI5*5k^%Vau-q&4$TB8$X?qFV;!wy{!j#A*DfTFL--Nl`6RE7`z(+o>C_iQc zu3>)uuH07ymNR>Dpf8_aE8B|7O1YG=2Jtg?Wn)5<-71bKH^o?K%+uIL*eD0*0l1i0 z<(jOfIKJCZ_LZyv%2*(64VA8hLupxOO`BN~Y7_{G`IgN%yZ4F!(-@~An0}WkzcTaW zR?|p1u2yzq=2X@Iwk0(I#(zM6B(5c)K;P^@q#`D6>6Y=M7(7I5+|3&m`1 zfdGF@#&4)LO*6dcTHLumt zy0q2ZTHV^z+T0p#?P!g)?rrUEJ=`kVvfH$_yf#PM(l&Qnbz4(gb6d2nqb=69x2?PF zaGPk)Zr9rL+THEd?ZNhj_NMmc_LlZd?a}tm_Fe6J+q>Eiws*Jpw2Mcbk47IAO}y7c z*&H42j_QtJM?*(!Ti3SkZ9Ut>_MGk7cKde6cIS5Y_TcuW?Je7*+dH?%whO^;Cy6sI QYLCu~I- 0: - mask_frame = scipy.median_filter(mask_frame.astype(np.float32), - mode="nearest", - size=smooth) - # mask_frame = scipy.median_filter( - # mask_frame.astype(np.float32), size=2) + mask_frame = ndi.median_filter(mask_frame.astype(np.float32), + mode="nearest", + size=smooth) mask_frames += (mask_frame,) elif mask.ndim == 3: for f in range(self.frame_count): mask_frame = mask[:, :, :] if smooth > 0: - mask_frame = scipy.median_filter(mask_frame.astype(np.float32), - mode="nearest", - size=smooth) - # mask_frame = scipy.median_filter( - # mask_frame.astype(np.float32), size=2) + mask_frame = ndi.median_filter(mask_frame.astype(np.float32), + mode="nearest", + size=smooth) mask_frames += (mask_frame,) else: raise Exception("Mask shape order should be TXYZ or XYZ") @@ -127,9 +122,9 @@ class Layer(): frame = data[f, :, :, :, :] if smooth > 0: - frame = scipy.median_filter(frame.astype(np.float32), - mode="nearest", - size=smooth) + frame = ndi.median_filter(frame.astype(np.float32), + mode="nearest", + size=smooth) factors = np.divide(self.shape, shape) zoom_factors = [1 / f for f in factors] diff --git a/src/bioxelnodes/bioxel/scipy/__init__.py b/src/bioxelnodes/bioxel/scipy/__init__.py deleted file mode 100644 index c8b0ded..0000000 --- a/src/bioxelnodes/bioxel/scipy/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from ._interpolation import zoom -from ._filters import (gaussian_filter, - median_filter, - maximum_filter, - minimum_filter) diff --git a/src/bioxelnodes/bioxel/scipy/_filters.py b/src/bioxelnodes/bioxel/scipy/_filters.py deleted file mode 100644 index 1e54ff4..0000000 --- a/src/bioxelnodes/bioxel/scipy/_filters.py +++ /dev/null @@ -1,1823 +0,0 @@ -# Copyright (C) 2003-2005 Peter J. Verveer -# -# 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. The name of the author may not be used to endorse or promote -# products derived from this software without specific prior -# written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - -from collections.abc import Iterable -import numbers -import warnings -import numpy as np -import operator - -from ._utils import normalize_axis_index -from . import _ni_support -from . import _nd_image - - -def _invalid_origin(origin, lenw): - return (origin < -(lenw // 2)) or (origin > (lenw - 1) // 2) - - -def _complex_via_real_components(func, input, weights, output, cval, **kwargs): - """Complex convolution via a linear combination of real convolutions.""" - complex_input = input.dtype.kind == 'c' - complex_weights = weights.dtype.kind == 'c' - if complex_input and complex_weights: - # real component of the output - func(input.real, weights.real, output=output.real, - cval=np.real(cval), **kwargs) - output.real -= func(input.imag, weights.imag, output=None, - cval=np.imag(cval), **kwargs) - # imaginary component of the output - func(input.real, weights.imag, output=output.imag, - cval=np.real(cval), **kwargs) - output.imag += func(input.imag, weights.real, output=None, - cval=np.imag(cval), **kwargs) - elif complex_input: - func(input.real, weights, output=output.real, cval=np.real(cval), - **kwargs) - func(input.imag, weights, output=output.imag, cval=np.imag(cval), - **kwargs) - else: - if np.iscomplexobj(cval): - raise ValueError("Cannot provide a complex-valued cval when the " - "input is real.") - func(input, weights.real, output=output.real, cval=cval, **kwargs) - func(input, weights.imag, output=output.imag, cval=cval, **kwargs) - return output - - -def correlate1d(input, weights, axis=-1, output=None, mode="reflect", - cval=0.0, origin=0): - """Calculate a 1-D correlation along the given axis. - - The lines of the array along the given axis are correlated with the - given weights. - - Parameters - ---------- - %(input)s - weights : array - 1-D sequence of numbers. - %(axis)s - %(output)s - %(mode_reflect)s - %(cval)s - %(origin)s - - Returns - ------- - result : ndarray - Correlation result. Has the same shape as `input`. - - Examples - -------- - >>> from scipy.ndimage import correlate1d - >>> correlate1d([2, 8, 0, 4, 1, 9, 9, 0], weights=[1, 3]) - array([ 8, 26, 8, 12, 7, 28, 36, 9]) - """ - input = np.asarray(input) - weights = np.asarray(weights) - complex_input = input.dtype.kind == 'c' - complex_weights = weights.dtype.kind == 'c' - if complex_input or complex_weights: - if complex_weights: - weights = weights.conj() - weights = weights.astype(np.complex128, copy=False) - kwargs = dict(axis=axis, mode=mode, origin=origin) - output = _ni_support._get_output(output, input, complex_output=True) - return _complex_via_real_components(correlate1d, input, weights, - output, cval, **kwargs) - - output = _ni_support._get_output(output, input) - weights = np.asarray(weights, dtype=np.float64) - if weights.ndim != 1 or weights.shape[0] < 1: - raise RuntimeError('no filter weights given') - if not weights.flags.contiguous: - weights = weights.copy() - axis = normalize_axis_index(axis, input.ndim) - if _invalid_origin(origin, len(weights)): - raise ValueError('Invalid origin; origin must satisfy ' - '-(len(weights) // 2) <= origin <= ' - '(len(weights)-1) // 2') - mode = _ni_support._extend_mode_to_code(mode) - _nd_image.correlate1d(input, weights, axis, output, mode, cval, - origin) - return output - - -def convolve1d(input, weights, axis=-1, output=None, mode="reflect", - cval=0.0, origin=0): - """Calculate a 1-D convolution along the given axis. - - The lines of the array along the given axis are convolved with the - given weights. - - Parameters - ---------- - %(input)s - weights : ndarray - 1-D sequence of numbers. - %(axis)s - %(output)s - %(mode_reflect)s - %(cval)s - %(origin)s - - Returns - ------- - convolve1d : ndarray - Convolved array with same shape as input - - Examples - -------- - >>> from scipy.ndimage import convolve1d - >>> convolve1d([2, 8, 0, 4, 1, 9, 9, 0], weights=[1, 3]) - array([14, 24, 4, 13, 12, 36, 27, 0]) - """ - weights = weights[::-1] - origin = -origin - if not len(weights) & 1: - origin -= 1 - weights = np.asarray(weights) - if weights.dtype.kind == 'c': - # pre-conjugate here to counteract the conjugation in correlate1d - weights = weights.conj() - return correlate1d(input, weights, axis, output, mode, cval, origin) - - -def _gaussian_kernel1d(sigma, order, radius): - """ - Computes a 1-D Gaussian convolution kernel. - """ - if order < 0: - raise ValueError('order must be non-negative') - exponent_range = np.arange(order + 1) - sigma2 = sigma * sigma - x = np.arange(-radius, radius+1) - phi_x = np.exp(-0.5 / sigma2 * x ** 2) - phi_x = phi_x / phi_x.sum() - - if order == 0: - return phi_x - else: - # f(x) = q(x) * phi(x) = q(x) * exp(p(x)) - # f'(x) = (q'(x) + q(x) * p'(x)) * phi(x) - # p'(x) = -1 / sigma ** 2 - # Implement q'(x) + q(x) * p'(x) as a matrix operator and apply to the - # coefficients of q(x) - q = np.zeros(order + 1) - q[0] = 1 - D = np.diag(exponent_range[1:], 1) # D @ q(x) = q'(x) - P = np.diag(np.ones(order)/-sigma2, -1) # P @ q(x) = q(x) * p'(x) - Q_deriv = D + P - for _ in range(order): - q = Q_deriv.dot(q) - q = (x[:, None] ** exponent_range).dot(q) - return q * phi_x - - -def gaussian_filter1d(input, sigma, axis=-1, order=0, output=None, - mode="reflect", cval=0.0, truncate=4.0, *, radius=None): - """1-D Gaussian filter. - - Parameters - ---------- - %(input)s - sigma : scalar - standard deviation for Gaussian kernel - %(axis)s - order : int, optional - An order of 0 corresponds to convolution with a Gaussian - kernel. A positive order corresponds to convolution with - that derivative of a Gaussian. - %(output)s - %(mode_reflect)s - %(cval)s - truncate : float, optional - Truncate the filter at this many standard deviations. - Default is 4.0. - radius : None or int, optional - Radius of the Gaussian kernel. If specified, the size of - the kernel will be ``2*radius + 1``, and `truncate` is ignored. - Default is None. - - Returns - ------- - gaussian_filter1d : ndarray - - Notes - ----- - The Gaussian kernel will have size ``2*radius + 1`` along each axis. If - `radius` is None, a default ``radius = round(truncate * sigma)`` will be - used. - - Examples - -------- - >>> from scipy.ndimage import gaussian_filter1d - >>> import numpy as np - >>> gaussian_filter1d([1.0, 2.0, 3.0, 4.0, 5.0], 1) - array([ 1.42704095, 2.06782203, 3. , 3.93217797, 4.57295905]) - >>> gaussian_filter1d([1.0, 2.0, 3.0, 4.0, 5.0], 4) - array([ 2.91948343, 2.95023502, 3. , 3.04976498, 3.08051657]) - >>> import matplotlib.pyplot as plt - >>> rng = np.random.default_rng() - >>> x = rng.standard_normal(101).cumsum() - >>> y3 = gaussian_filter1d(x, 3) - >>> y6 = gaussian_filter1d(x, 6) - >>> plt.plot(x, 'k', label='original data') - >>> plt.plot(y3, '--', label='filtered, sigma=3') - >>> plt.plot(y6, ':', label='filtered, sigma=6') - >>> plt.legend() - >>> plt.grid() - >>> plt.show() - - """ - sd = float(sigma) - # make the radius of the filter equal to truncate standard deviations - lw = int(truncate * sd + 0.5) - if radius is not None: - lw = radius - if not isinstance(lw, numbers.Integral) or lw < 0: - raise ValueError('Radius must be a nonnegative integer.') - # Since we are calling correlate, not convolve, revert the kernel - weights = _gaussian_kernel1d(sigma, order, lw)[::-1] - return correlate1d(input, weights, axis, output, mode, cval, 0) - - -def gaussian_filter(input, sigma, order=0, output=None, - mode="reflect", cval=0.0, truncate=4.0, *, radius=None, - axes=None): - """Multidimensional Gaussian filter. - - Parameters - ---------- - %(input)s - sigma : scalar or sequence of scalars - Standard deviation for Gaussian kernel. The standard - deviations of the Gaussian filter are given for each axis as a - sequence, or as a single number, in which case it is equal for - all axes. - order : int or sequence of ints, optional - The order of the filter along each axis is given as a sequence - of integers, or as a single number. An order of 0 corresponds - to convolution with a Gaussian kernel. A positive order - corresponds to convolution with that derivative of a Gaussian. - %(output)s - %(mode_multiple)s - %(cval)s - truncate : float, optional - Truncate the filter at this many standard deviations. - Default is 4.0. - radius : None or int or sequence of ints, optional - Radius of the Gaussian kernel. The radius are given for each axis - as a sequence, or as a single number, in which case it is equal - for all axes. If specified, the size of the kernel along each axis - will be ``2*radius + 1``, and `truncate` is ignored. - Default is None. - axes : tuple of int or None, optional - If None, `input` is filtered along all axes. Otherwise, - `input` is filtered along the specified axes. When `axes` is - specified, any tuples used for `sigma`, `order`, `mode` and/or `radius` - must match the length of `axes`. The ith entry in any of these tuples - corresponds to the ith entry in `axes`. - - Returns - ------- - gaussian_filter : ndarray - Returned array of same shape as `input`. - - Notes - ----- - The multidimensional filter is implemented as a sequence of - 1-D convolution filters. The intermediate arrays are - stored in the same data type as the output. Therefore, for output - types with a limited precision, the results may be imprecise - because intermediate results may be stored with insufficient - precision. - - The Gaussian kernel will have size ``2*radius + 1`` along each axis. If - `radius` is None, the default ``radius = round(truncate * sigma)`` will be - used. - - Examples - -------- - >>> from scipy.ndimage import gaussian_filter - >>> import numpy as np - >>> a = np.arange(50, step=2).reshape((5,5)) - >>> a - array([[ 0, 2, 4, 6, 8], - [10, 12, 14, 16, 18], - [20, 22, 24, 26, 28], - [30, 32, 34, 36, 38], - [40, 42, 44, 46, 48]]) - >>> gaussian_filter(a, sigma=1) - array([[ 4, 6, 8, 9, 11], - [10, 12, 14, 15, 17], - [20, 22, 24, 25, 27], - [29, 31, 33, 34, 36], - [35, 37, 39, 40, 42]]) - - >>> from scipy import datasets - >>> import matplotlib.pyplot as plt - >>> fig = plt.figure() - >>> plt.gray() # show the filtered result in grayscale - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - >>> ascent = datasets.ascent() - >>> result = gaussian_filter(ascent, sigma=5) - >>> ax1.imshow(ascent) - >>> ax2.imshow(result) - >>> plt.show() - """ - input = np.asarray(input) - output = _ni_support._get_output(output, input) - - axes = _ni_support._check_axes(axes, input.ndim) - num_axes = len(axes) - orders = _ni_support._normalize_sequence(order, num_axes) - sigmas = _ni_support._normalize_sequence(sigma, num_axes) - modes = _ni_support._normalize_sequence(mode, num_axes) - radiuses = _ni_support._normalize_sequence(radius, num_axes) - axes = [(axes[ii], sigmas[ii], orders[ii], modes[ii], radiuses[ii]) - for ii in range(num_axes) if sigmas[ii] > 1e-15] - if len(axes) > 0: - for axis, sigma, order, mode, radius in axes: - gaussian_filter1d(input, sigma, axis, order, output, - mode, cval, truncate, radius=radius) - input = output - else: - output[...] = input[...] - return output - - -def prewitt(input, axis=-1, output=None, mode="reflect", cval=0.0): - """Calculate a Prewitt filter. - - Parameters - ---------- - %(input)s - %(axis)s - %(output)s - %(mode_multiple)s - %(cval)s - - Returns - ------- - prewitt : ndarray - Filtered array. Has the same shape as `input`. - - See Also - -------- - sobel: Sobel filter - - Notes - ----- - This function computes the one-dimensional Prewitt filter. - Horizontal edges are emphasised with the horizontal transform (axis=0), - vertical edges with the vertical transform (axis=1), and so on for higher - dimensions. These can be combined to give the magnitude. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> import numpy as np - >>> ascent = datasets.ascent() - >>> prewitt_h = ndimage.prewitt(ascent, axis=0) - >>> prewitt_v = ndimage.prewitt(ascent, axis=1) - >>> magnitude = np.sqrt(prewitt_h ** 2 + prewitt_v ** 2) - >>> magnitude *= 255 / np.max(magnitude) # Normalization - >>> fig, axes = plt.subplots(2, 2, figsize = (8, 8)) - >>> plt.gray() - >>> axes[0, 0].imshow(ascent) - >>> axes[0, 1].imshow(prewitt_h) - >>> axes[1, 0].imshow(prewitt_v) - >>> axes[1, 1].imshow(magnitude) - >>> titles = ["original", "horizontal", "vertical", "magnitude"] - >>> for i, ax in enumerate(axes.ravel()): - ... ax.set_title(titles[i]) - ... ax.axis("off") - >>> plt.show() - - """ - input = np.asarray(input) - axis = normalize_axis_index(axis, input.ndim) - output = _ni_support._get_output(output, input) - modes = _ni_support._normalize_sequence(mode, input.ndim) - correlate1d(input, [-1, 0, 1], axis, output, modes[axis], cval, 0) - axes = [ii for ii in range(input.ndim) if ii != axis] - for ii in axes: - correlate1d(output, [1, 1, 1], ii, output, modes[ii], cval, 0,) - return output - - -def sobel(input, axis=-1, output=None, mode="reflect", cval=0.0): - """Calculate a Sobel filter. - - Parameters - ---------- - %(input)s - %(axis)s - %(output)s - %(mode_multiple)s - %(cval)s - - Returns - ------- - sobel : ndarray - Filtered array. Has the same shape as `input`. - - Notes - ----- - This function computes the axis-specific Sobel gradient. - The horizontal edges can be emphasised with the horizontal transform (axis=0), - the vertical edges with the vertical transform (axis=1) and so on for higher - dimensions. These can be combined to give the magnitude. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> import numpy as np - >>> ascent = datasets.ascent().astype('int32') - >>> sobel_h = ndimage.sobel(ascent, 0) # horizontal gradient - >>> sobel_v = ndimage.sobel(ascent, 1) # vertical gradient - >>> magnitude = np.sqrt(sobel_h**2 + sobel_v**2) - >>> magnitude *= 255.0 / np.max(magnitude) # normalization - >>> fig, axs = plt.subplots(2, 2, figsize=(8, 8)) - >>> plt.gray() # show the filtered result in grayscale - >>> axs[0, 0].imshow(ascent) - >>> axs[0, 1].imshow(sobel_h) - >>> axs[1, 0].imshow(sobel_v) - >>> axs[1, 1].imshow(magnitude) - >>> titles = ["original", "horizontal", "vertical", "magnitude"] - >>> for i, ax in enumerate(axs.ravel()): - ... ax.set_title(titles[i]) - ... ax.axis("off") - >>> plt.show() - - """ - input = np.asarray(input) - axis = normalize_axis_index(axis, input.ndim) - output = _ni_support._get_output(output, input) - modes = _ni_support._normalize_sequence(mode, input.ndim) - correlate1d(input, [-1, 0, 1], axis, output, modes[axis], cval, 0) - axes = [ii for ii in range(input.ndim) if ii != axis] - for ii in axes: - correlate1d(output, [1, 2, 1], ii, output, modes[ii], cval, 0) - return output - - -def generic_laplace(input, derivative2, output=None, mode="reflect", - cval=0.0, - extra_arguments=(), - extra_keywords=None): - """ - N-D Laplace filter using a provided second derivative function. - - Parameters - ---------- - %(input)s - derivative2 : callable - Callable with the following signature:: - - derivative2(input, axis, output, mode, cval, - *extra_arguments, **extra_keywords) - - See `extra_arguments`, `extra_keywords` below. - %(output)s - %(mode_multiple)s - %(cval)s - %(extra_keywords)s - %(extra_arguments)s - - Returns - ------- - generic_laplace : ndarray - Filtered array. Has the same shape as `input`. - - """ - if extra_keywords is None: - extra_keywords = {} - input = np.asarray(input) - output = _ni_support._get_output(output, input) - axes = list(range(input.ndim)) - if len(axes) > 0: - modes = _ni_support._normalize_sequence(mode, len(axes)) - derivative2(input, axes[0], output, modes[0], cval, - *extra_arguments, **extra_keywords) - for ii in range(1, len(axes)): - tmp = derivative2(input, axes[ii], output.dtype, modes[ii], cval, - *extra_arguments, **extra_keywords) - output += tmp - else: - output[...] = input[...] - return output - - -def laplace(input, output=None, mode="reflect", cval=0.0): - """N-D Laplace filter based on approximate second derivatives. - - Parameters - ---------- - %(input)s - %(output)s - %(mode_multiple)s - %(cval)s - - Returns - ------- - laplace : ndarray - Filtered array. Has the same shape as `input`. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> fig = plt.figure() - >>> plt.gray() # show the filtered result in grayscale - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - >>> ascent = datasets.ascent() - >>> result = ndimage.laplace(ascent) - >>> ax1.imshow(ascent) - >>> ax2.imshow(result) - >>> plt.show() - """ - def derivative2(input, axis, output, mode, cval): - return correlate1d(input, [1, -2, 1], axis, output, mode, cval, 0) - return generic_laplace(input, derivative2, output, mode, cval) - - -def gaussian_laplace(input, sigma, output=None, mode="reflect", - cval=0.0, **kwargs): - """Multidimensional Laplace filter using Gaussian second derivatives. - - Parameters - ---------- - %(input)s - sigma : scalar or sequence of scalars - The standard deviations of the Gaussian filter are given for - each axis as a sequence, or as a single number, in which case - it is equal for all axes. - %(output)s - %(mode_multiple)s - %(cval)s - Extra keyword arguments will be passed to gaussian_filter(). - - Returns - ------- - gaussian_laplace : ndarray - Filtered array. Has the same shape as `input`. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> ascent = datasets.ascent() - - >>> fig = plt.figure() - >>> plt.gray() # show the filtered result in grayscale - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - - >>> result = ndimage.gaussian_laplace(ascent, sigma=1) - >>> ax1.imshow(result) - - >>> result = ndimage.gaussian_laplace(ascent, sigma=3) - >>> ax2.imshow(result) - >>> plt.show() - """ - input = np.asarray(input) - - def derivative2(input, axis, output, mode, cval, sigma, **kwargs): - order = [0] * input.ndim - order[axis] = 2 - return gaussian_filter(input, sigma, order, output, mode, cval, - **kwargs) - - return generic_laplace(input, derivative2, output, mode, cval, - extra_arguments=(sigma,), - extra_keywords=kwargs) - - -def generic_gradient_magnitude(input, derivative, output=None, - mode="reflect", cval=0.0, - extra_arguments=(), extra_keywords=None): - """Gradient magnitude using a provided gradient function. - - Parameters - ---------- - %(input)s - derivative : callable - Callable with the following signature:: - - derivative(input, axis, output, mode, cval, - *extra_arguments, **extra_keywords) - - See `extra_arguments`, `extra_keywords` below. - `derivative` can assume that `input` and `output` are ndarrays. - Note that the output from `derivative` is modified inplace; - be careful to copy important inputs before returning them. - %(output)s - %(mode_multiple)s - %(cval)s - %(extra_keywords)s - %(extra_arguments)s - - Returns - ------- - generic_gradient_matnitude : ndarray - Filtered array. Has the same shape as `input`. - - """ - if extra_keywords is None: - extra_keywords = {} - input = np.asarray(input) - output = _ni_support._get_output(output, input) - axes = list(range(input.ndim)) - if len(axes) > 0: - modes = _ni_support._normalize_sequence(mode, len(axes)) - derivative(input, axes[0], output, modes[0], cval, - *extra_arguments, **extra_keywords) - np.multiply(output, output, output) - for ii in range(1, len(axes)): - tmp = derivative(input, axes[ii], output.dtype, modes[ii], cval, - *extra_arguments, **extra_keywords) - np.multiply(tmp, tmp, tmp) - output += tmp - # This allows the sqrt to work with a different default casting - np.sqrt(output, output, casting='unsafe') - else: - output[...] = input[...] - return output - - -def gaussian_gradient_magnitude(input, sigma, output=None, - mode="reflect", cval=0.0, **kwargs): - """Multidimensional gradient magnitude using Gaussian derivatives. - - Parameters - ---------- - %(input)s - sigma : scalar or sequence of scalars - The standard deviations of the Gaussian filter are given for - each axis as a sequence, or as a single number, in which case - it is equal for all axes. - %(output)s - %(mode_multiple)s - %(cval)s - Extra keyword arguments will be passed to gaussian_filter(). - - Returns - ------- - gaussian_gradient_magnitude : ndarray - Filtered array. Has the same shape as `input`. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> fig = plt.figure() - >>> plt.gray() # show the filtered result in grayscale - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - >>> ascent = datasets.ascent() - >>> result = ndimage.gaussian_gradient_magnitude(ascent, sigma=5) - >>> ax1.imshow(ascent) - >>> ax2.imshow(result) - >>> plt.show() - """ - input = np.asarray(input) - - def derivative(input, axis, output, mode, cval, sigma, **kwargs): - order = [0] * input.ndim - order[axis] = 1 - return gaussian_filter(input, sigma, order, output, mode, - cval, **kwargs) - - return generic_gradient_magnitude(input, derivative, output, mode, - cval, extra_arguments=(sigma,), - extra_keywords=kwargs) - - -def _correlate_or_convolve(input, weights, output, mode, cval, origin, - convolution): - input = np.asarray(input) - weights = np.asarray(weights) - complex_input = input.dtype.kind == 'c' - complex_weights = weights.dtype.kind == 'c' - if complex_input or complex_weights: - if complex_weights and not convolution: - # As for np.correlate, conjugate weights rather than input. - weights = weights.conj() - kwargs = dict( - mode=mode, origin=origin, convolution=convolution - ) - output = _ni_support._get_output(output, input, complex_output=True) - - return _complex_via_real_components(_correlate_or_convolve, input, - weights, output, cval, **kwargs) - - origins = _ni_support._normalize_sequence(origin, input.ndim) - weights = np.asarray(weights, dtype=np.float64) - wshape = [ii for ii in weights.shape if ii > 0] - if len(wshape) != input.ndim: - raise RuntimeError('filter weights array has incorrect shape.') - if convolution: - weights = weights[tuple([slice(None, None, -1)] * weights.ndim)] - for ii in range(len(origins)): - origins[ii] = -origins[ii] - if not weights.shape[ii] & 1: - origins[ii] -= 1 - for origin, lenw in zip(origins, wshape): - if _invalid_origin(origin, lenw): - raise ValueError('Invalid origin; origin must satisfy ' - '-(weights.shape[k] // 2) <= origin[k] <= ' - '(weights.shape[k]-1) // 2') - - if not weights.flags.contiguous: - weights = weights.copy() - output = _ni_support._get_output(output, input) - temp_needed = np.may_share_memory(input, output) - if temp_needed: - # input and output arrays cannot share memory - temp = output - output = _ni_support._get_output(output.dtype, input) - if not isinstance(mode, str) and isinstance(mode, Iterable): - raise RuntimeError("A sequence of modes is not supported") - mode = _ni_support._extend_mode_to_code(mode) - _nd_image.correlate(input, weights, output, mode, cval, origins) - if temp_needed: - temp[...] = output - output = temp - return output - - -def correlate(input, weights, output=None, mode='reflect', cval=0.0, - origin=0): - """ - Multidimensional correlation. - - The array is correlated with the given kernel. - - Parameters - ---------- - %(input)s - weights : ndarray - array of weights, same number of dimensions as input - %(output)s - %(mode_reflect)s - %(cval)s - %(origin_multiple)s - - Returns - ------- - result : ndarray - The result of correlation of `input` with `weights`. - - See Also - -------- - convolve : Convolve an image with a kernel. - - Examples - -------- - Correlation is the process of moving a filter mask often referred to - as kernel over the image and computing the sum of products at each location. - - >>> from scipy.ndimage import correlate - >>> import numpy as np - >>> input_img = np.arange(25).reshape(5,5) - >>> print(input_img) - [[ 0 1 2 3 4] - [ 5 6 7 8 9] - [10 11 12 13 14] - [15 16 17 18 19] - [20 21 22 23 24]] - - Define a kernel (weights) for correlation. In this example, it is for sum of - center and up, down, left and right next elements. - - >>> weights = [[0, 1, 0], - ... [1, 1, 1], - ... [0, 1, 0]] - - We can calculate a correlation result: - For example, element ``[2,2]`` is ``7 + 11 + 12 + 13 + 17 = 60``. - - >>> correlate(input_img, weights) - array([[ 6, 10, 15, 20, 24], - [ 26, 30, 35, 40, 44], - [ 51, 55, 60, 65, 69], - [ 76, 80, 85, 90, 94], - [ 96, 100, 105, 110, 114]]) - - """ - return _correlate_or_convolve(input, weights, output, mode, cval, - origin, False) - - -def convolve(input, weights, output=None, mode='reflect', cval=0.0, - origin=0): - """ - Multidimensional convolution. - - The array is convolved with the given kernel. - - Parameters - ---------- - %(input)s - weights : array_like - Array of weights, same number of dimensions as input - %(output)s - %(mode_reflect)s - cval : scalar, optional - Value to fill past edges of input if `mode` is 'constant'. Default - is 0.0 - origin : int, optional - Controls the origin of the input signal, which is where the - filter is centered to produce the first element of the output. - Positive values shift the filter to the right, and negative values - shift the filter to the left. Default is 0. - - Returns - ------- - result : ndarray - The result of convolution of `input` with `weights`. - - See Also - -------- - correlate : Correlate an image with a kernel. - - Notes - ----- - Each value in result is :math:`C_i = \\sum_j{I_{i+k-j} W_j}`, where - W is the `weights` kernel, - j is the N-D spatial index over :math:`W`, - I is the `input` and k is the coordinate of the center of - W, specified by `origin` in the input parameters. - - Examples - -------- - Perhaps the simplest case to understand is ``mode='constant', cval=0.0``, - because in this case borders (i.e., where the `weights` kernel, centered - on any one value, extends beyond an edge of `input`) are treated as zeros. - - >>> import numpy as np - >>> a = np.array([[1, 2, 0, 0], - ... [5, 3, 0, 4], - ... [0, 0, 0, 7], - ... [9, 3, 0, 0]]) - >>> k = np.array([[1,1,1],[1,1,0],[1,0,0]]) - >>> from scipy import ndimage - >>> ndimage.convolve(a, k, mode='constant', cval=0.0) - array([[11, 10, 7, 4], - [10, 3, 11, 11], - [15, 12, 14, 7], - [12, 3, 7, 0]]) - - Setting ``cval=1.0`` is equivalent to padding the outer edge of `input` - with 1.0's (and then extracting only the original region of the result). - - >>> ndimage.convolve(a, k, mode='constant', cval=1.0) - array([[13, 11, 8, 7], - [11, 3, 11, 14], - [16, 12, 14, 10], - [15, 6, 10, 5]]) - - With ``mode='reflect'`` (the default), outer values are reflected at the - edge of `input` to fill in missing values. - - >>> b = np.array([[2, 0, 0], - ... [1, 0, 0], - ... [0, 0, 0]]) - >>> k = np.array([[0,1,0], [0,1,0], [0,1,0]]) - >>> ndimage.convolve(b, k, mode='reflect') - array([[5, 0, 0], - [3, 0, 0], - [1, 0, 0]]) - - This includes diagonally at the corners. - - >>> k = np.array([[1,0,0],[0,1,0],[0,0,1]]) - >>> ndimage.convolve(b, k) - array([[4, 2, 0], - [3, 2, 0], - [1, 1, 0]]) - - With ``mode='nearest'``, the single nearest value in to an edge in - `input` is repeated as many times as needed to match the overlapping - `weights`. - - >>> c = np.array([[2, 0, 1], - ... [1, 0, 0], - ... [0, 0, 0]]) - >>> k = np.array([[0, 1, 0], - ... [0, 1, 0], - ... [0, 1, 0], - ... [0, 1, 0], - ... [0, 1, 0]]) - >>> ndimage.convolve(c, k, mode='nearest') - array([[7, 0, 3], - [5, 0, 2], - [3, 0, 1]]) - - """ - return _correlate_or_convolve(input, weights, output, mode, cval, - origin, True) - - -def uniform_filter1d(input, size, axis=-1, output=None, - mode="reflect", cval=0.0, origin=0): - """Calculate a 1-D uniform filter along the given axis. - - The lines of the array along the given axis are filtered with a - uniform filter of given size. - - Parameters - ---------- - %(input)s - size : int - length of uniform filter - %(axis)s - %(output)s - %(mode_reflect)s - %(cval)s - %(origin)s - - Returns - ------- - result : ndarray - Filtered array. Has same shape as `input`. - - Examples - -------- - >>> from scipy.ndimage import uniform_filter1d - >>> uniform_filter1d([2, 8, 0, 4, 1, 9, 9, 0], size=3) - array([4, 3, 4, 1, 4, 6, 6, 3]) - """ - input = np.asarray(input) - axis = normalize_axis_index(axis, input.ndim) - if size < 1: - raise RuntimeError('incorrect filter size') - complex_output = input.dtype.kind == 'c' - output = _ni_support._get_output(output, input, - complex_output=complex_output) - if (size // 2 + origin < 0) or (size // 2 + origin >= size): - raise ValueError('invalid origin') - mode = _ni_support._extend_mode_to_code(mode) - if not complex_output: - _nd_image.uniform_filter1d(input, size, axis, output, mode, cval, - origin) - else: - _nd_image.uniform_filter1d(input.real, size, axis, output.real, mode, - np.real(cval), origin) - _nd_image.uniform_filter1d(input.imag, size, axis, output.imag, mode, - np.imag(cval), origin) - return output - - -def uniform_filter(input, size=3, output=None, mode="reflect", - cval=0.0, origin=0, *, axes=None): - """Multidimensional uniform filter. - - Parameters - ---------- - %(input)s - size : int or sequence of ints, optional - The sizes of the uniform filter are given for each axis as a - sequence, or as a single number, in which case the size is - equal for all axes. - %(output)s - %(mode_multiple)s - %(cval)s - %(origin_multiple)s - axes : tuple of int or None, optional - If None, `input` is filtered along all axes. Otherwise, - `input` is filtered along the specified axes. When `axes` is - specified, any tuples used for `size`, `origin`, and/or `mode` - must match the length of `axes`. The ith entry in any of these tuples - corresponds to the ith entry in `axes`. - - Returns - ------- - uniform_filter : ndarray - Filtered array. Has the same shape as `input`. - - Notes - ----- - The multidimensional filter is implemented as a sequence of - 1-D uniform filters. The intermediate arrays are stored - in the same data type as the output. Therefore, for output types - with a limited precision, the results may be imprecise because - intermediate results may be stored with insufficient precision. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> fig = plt.figure() - >>> plt.gray() # show the filtered result in grayscale - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - >>> ascent = datasets.ascent() - >>> result = ndimage.uniform_filter(ascent, size=20) - >>> ax1.imshow(ascent) - >>> ax2.imshow(result) - >>> plt.show() - """ - input = np.asarray(input) - output = _ni_support._get_output(output, input, - complex_output=input.dtype.kind == 'c') - axes = _ni_support._check_axes(axes, input.ndim) - num_axes = len(axes) - sizes = _ni_support._normalize_sequence(size, num_axes) - origins = _ni_support._normalize_sequence(origin, num_axes) - modes = _ni_support._normalize_sequence(mode, num_axes) - axes = [(axes[ii], sizes[ii], origins[ii], modes[ii]) - for ii in range(num_axes) if sizes[ii] > 1] - if len(axes) > 0: - for axis, size, origin, mode in axes: - uniform_filter1d(input, int(size), axis, output, mode, - cval, origin) - input = output - else: - output[...] = input[...] - return output - - -def minimum_filter1d(input, size, axis=-1, output=None, - mode="reflect", cval=0.0, origin=0): - """Calculate a 1-D minimum filter along the given axis. - - The lines of the array along the given axis are filtered with a - minimum filter of given size. - - Parameters - ---------- - %(input)s - size : int - length along which to calculate 1D minimum - %(axis)s - %(output)s - %(mode_reflect)s - %(cval)s - %(origin)s - - Returns - ------- - result : ndarray. - Filtered image. Has the same shape as `input`. - - Notes - ----- - This function implements the MINLIST algorithm [1]_, as described by - Richard Harter [2]_, and has a guaranteed O(n) performance, `n` being - the `input` length, regardless of filter size. - - References - ---------- - .. [1] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.42.2777 - .. [2] http://www.richardhartersworld.com/cri/2001/slidingmin.html - - - Examples - -------- - >>> from scipy.ndimage import minimum_filter1d - >>> minimum_filter1d([2, 8, 0, 4, 1, 9, 9, 0], size=3) - array([2, 0, 0, 0, 1, 1, 0, 0]) - """ - input = np.asarray(input) - if np.iscomplexobj(input): - raise TypeError('Complex type not supported') - axis = normalize_axis_index(axis, input.ndim) - if size < 1: - raise RuntimeError('incorrect filter size') - output = _ni_support._get_output(output, input) - if (size // 2 + origin < 0) or (size // 2 + origin >= size): - raise ValueError('invalid origin') - mode = _ni_support._extend_mode_to_code(mode) - _nd_image.min_or_max_filter1d(input, size, axis, output, mode, cval, - origin, 1) - return output - - -def maximum_filter1d(input, size, axis=-1, output=None, - mode="reflect", cval=0.0, origin=0): - """Calculate a 1-D maximum filter along the given axis. - - The lines of the array along the given axis are filtered with a - maximum filter of given size. - - Parameters - ---------- - %(input)s - size : int - Length along which to calculate the 1-D maximum. - %(axis)s - %(output)s - %(mode_reflect)s - %(cval)s - %(origin)s - - Returns - ------- - maximum1d : ndarray, None - Maximum-filtered array with same shape as input. - None if `output` is not None - - Notes - ----- - This function implements the MAXLIST algorithm [1]_, as described by - Richard Harter [2]_, and has a guaranteed O(n) performance, `n` being - the `input` length, regardless of filter size. - - References - ---------- - .. [1] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.42.2777 - .. [2] http://www.richardhartersworld.com/cri/2001/slidingmin.html - - Examples - -------- - >>> from scipy.ndimage import maximum_filter1d - >>> maximum_filter1d([2, 8, 0, 4, 1, 9, 9, 0], size=3) - array([8, 8, 8, 4, 9, 9, 9, 9]) - """ - input = np.asarray(input) - if np.iscomplexobj(input): - raise TypeError('Complex type not supported') - axis = normalize_axis_index(axis, input.ndim) - if size < 1: - raise RuntimeError('incorrect filter size') - output = _ni_support._get_output(output, input) - if (size // 2 + origin < 0) or (size // 2 + origin >= size): - raise ValueError('invalid origin') - mode = _ni_support._extend_mode_to_code(mode) - _nd_image.min_or_max_filter1d(input, size, axis, output, mode, cval, - origin, 0) - return output - - -def _min_or_max_filter(input, size, footprint, structure, output, mode, - cval, origin, minimum, axes=None): - if (size is not None) and (footprint is not None): - warnings.warn("ignoring size because footprint is set", - UserWarning, stacklevel=3) - if structure is None: - if footprint is None: - if size is None: - raise RuntimeError("no footprint provided") - separable = True - else: - footprint = np.asarray(footprint, dtype=bool) - if not footprint.any(): - raise ValueError("All-zero footprint is not supported.") - if footprint.all(): - size = footprint.shape - footprint = None - separable = True - else: - separable = False - else: - structure = np.asarray(structure, dtype=np.float64) - separable = False - if footprint is None: - footprint = np.ones(structure.shape, bool) - else: - footprint = np.asarray(footprint, dtype=bool) - input = np.asarray(input) - if np.iscomplexobj(input): - raise TypeError("Complex type not supported") - output = _ni_support._get_output(output, input) - temp_needed = np.may_share_memory(input, output) - if temp_needed: - # input and output arrays cannot share memory - temp = output - output = _ni_support._get_output(output.dtype, input) - axes = _ni_support._check_axes(axes, input.ndim) - num_axes = len(axes) - if separable: - origins = _ni_support._normalize_sequence(origin, num_axes) - sizes = _ni_support._normalize_sequence(size, num_axes) - modes = _ni_support._normalize_sequence(mode, num_axes) - axes = [(axes[ii], sizes[ii], origins[ii], modes[ii]) - for ii in range(len(axes)) if sizes[ii] > 1] - if minimum: - filter_ = minimum_filter1d - else: - filter_ = maximum_filter1d - if len(axes) > 0: - for axis, size, origin, mode in axes: - filter_(input, int(size), axis, output, mode, cval, origin) - input = output - else: - output[...] = input[...] - else: - origins = _ni_support._normalize_sequence(origin, num_axes) - if num_axes < input.ndim: - if footprint.ndim != num_axes: - raise RuntimeError("footprint array has incorrect shape") - footprint = np.expand_dims( - footprint, - tuple(ax for ax in range(input.ndim) if ax not in axes) - ) - # set origin = 0 for any axes not being filtered - origins_temp = [0,] * input.ndim - for o, ax in zip(origins, axes): - origins_temp[ax] = o - origins = origins_temp - - fshape = [ii for ii in footprint.shape if ii > 0] - if len(fshape) != input.ndim: - raise RuntimeError('footprint array has incorrect shape.') - for origin, lenf in zip(origins, fshape): - if (lenf // 2 + origin < 0) or (lenf // 2 + origin >= lenf): - raise ValueError("invalid origin") - if not footprint.flags.contiguous: - footprint = footprint.copy() - if structure is not None: - if len(structure.shape) != input.ndim: - raise RuntimeError("structure array has incorrect shape") - if num_axes != structure.ndim: - structure = np.expand_dims( - structure, - tuple(ax for ax in range(structure.ndim) if ax not in axes) - ) - if not structure.flags.contiguous: - structure = structure.copy() - if not isinstance(mode, str) and isinstance(mode, Iterable): - raise RuntimeError( - "A sequence of modes is not supported for non-separable " - "footprints") - mode = _ni_support._extend_mode_to_code(mode) - _nd_image.min_or_max_filter(input, footprint, structure, output, - mode, cval, origins, minimum) - if temp_needed: - temp[...] = output - output = temp - return output - - -def minimum_filter(input, size=None, footprint=None, output=None, - mode="reflect", cval=0.0, origin=0, *, axes=None): - """Calculate a multidimensional minimum filter. - - Parameters - ---------- - %(input)s - %(size_foot)s - %(output)s - %(mode_multiple)s - %(cval)s - %(origin_multiple)s - axes : tuple of int or None, optional - If None, `input` is filtered along all axes. Otherwise, - `input` is filtered along the specified axes. When `axes` is - specified, any tuples used for `size`, `origin`, and/or `mode` - must match the length of `axes`. The ith entry in any of these tuples - corresponds to the ith entry in `axes`. - - Returns - ------- - minimum_filter : ndarray - Filtered array. Has the same shape as `input`. - - Notes - ----- - A sequence of modes (one per axis) is only supported when the footprint is - separable. Otherwise, a single mode string must be provided. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> fig = plt.figure() - >>> plt.gray() # show the filtered result in grayscale - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - >>> ascent = datasets.ascent() - >>> result = ndimage.minimum_filter(ascent, size=20) - >>> ax1.imshow(ascent) - >>> ax2.imshow(result) - >>> plt.show() - """ - return _min_or_max_filter(input, size, footprint, None, output, mode, - cval, origin, 1, axes) - - -def maximum_filter(input, size=None, footprint=None, output=None, - mode="reflect", cval=0.0, origin=0, *, axes=None): - """Calculate a multidimensional maximum filter. - - Parameters - ---------- - %(input)s - %(size_foot)s - %(output)s - %(mode_multiple)s - %(cval)s - %(origin_multiple)s - axes : tuple of int or None, optional - If None, `input` is filtered along all axes. Otherwise, - `input` is filtered along the specified axes. When `axes` is - specified, any tuples used for `size`, `origin`, and/or `mode` - must match the length of `axes`. The ith entry in any of these tuples - corresponds to the ith entry in `axes`. - - Returns - ------- - maximum_filter : ndarray - Filtered array. Has the same shape as `input`. - - Notes - ----- - A sequence of modes (one per axis) is only supported when the footprint is - separable. Otherwise, a single mode string must be provided. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> fig = plt.figure() - >>> plt.gray() # show the filtered result in grayscale - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - >>> ascent = datasets.ascent() - >>> result = ndimage.maximum_filter(ascent, size=20) - >>> ax1.imshow(ascent) - >>> ax2.imshow(result) - >>> plt.show() - """ - return _min_or_max_filter(input, size, footprint, None, output, mode, - cval, origin, 0, axes) - - -def _rank_filter(input, rank, size=None, footprint=None, output=None, - mode="reflect", cval=0.0, origin=0, operation='rank', - axes=None): - if (size is not None) and (footprint is not None): - warnings.warn("ignoring size because footprint is set", - UserWarning, stacklevel=3) - input = np.asarray(input) - if np.iscomplexobj(input): - raise TypeError('Complex type not supported') - axes = _ni_support._check_axes(axes, input.ndim) - num_axes = len(axes) - origins = _ni_support._normalize_sequence(origin, num_axes) - if footprint is None: - if size is None: - raise RuntimeError("no footprint or filter size provided") - sizes = _ni_support._normalize_sequence(size, num_axes) - footprint = np.ones(sizes, dtype=bool) - else: - footprint = np.asarray(footprint, dtype=bool) - if num_axes < input.ndim: - # set origin = 0 for any axes not being filtered - origins_temp = [0,] * input.ndim - for o, ax in zip(origins, axes): - origins_temp[ax] = o - origins = origins_temp - - if not isinstance(mode, str) and isinstance(mode, Iterable): - # set mode = 'constant' for any axes not being filtered - modes = _ni_support._normalize_sequence(mode, num_axes) - modes_temp = ['constant'] * input.ndim - for m, ax in zip(modes, axes): - modes_temp[ax] = m - mode = modes_temp - - # insert singleton dimension along any non-filtered axes - if footprint.ndim != num_axes: - raise RuntimeError("footprint array has incorrect shape") - footprint = np.expand_dims( - footprint, - tuple(ax for ax in range(input.ndim) if ax not in axes) - ) - fshape = [ii for ii in footprint.shape if ii > 0] - if len(fshape) != input.ndim: - raise RuntimeError('footprint array has incorrect shape.') - for origin, lenf in zip(origins, fshape): - if (lenf // 2 + origin < 0) or (lenf // 2 + origin >= lenf): - raise ValueError('invalid origin') - if not footprint.flags.contiguous: - footprint = footprint.copy() - filter_size = np.where(footprint, 1, 0).sum() - if operation == 'median': - rank = filter_size // 2 - elif operation == 'percentile': - percentile = rank - if percentile < 0.0: - percentile += 100.0 - if percentile < 0 or percentile > 100: - raise RuntimeError('invalid percentile') - if percentile == 100.0: - rank = filter_size - 1 - else: - rank = int(float(filter_size) * percentile / 100.0) - if rank < 0: - rank += filter_size - if rank < 0 or rank >= filter_size: - raise RuntimeError('rank not within filter footprint size') - if rank == 0: - return minimum_filter(input, None, footprint, output, mode, cval, - origins, axes=None) - elif rank == filter_size - 1: - return maximum_filter(input, None, footprint, output, mode, cval, - origins, axes=None) - else: - output = _ni_support._get_output(output, input) - temp_needed = np.may_share_memory(input, output) - if temp_needed: - # input and output arrays cannot share memory - temp = output - output = _ni_support._get_output(output.dtype, input) - if not isinstance(mode, str) and isinstance(mode, Iterable): - raise RuntimeError( - "A sequence of modes is not supported by non-separable rank " - "filters") - mode = _ni_support._extend_mode_to_code(mode) - _nd_image.rank_filter(input, rank, footprint, output, mode, cval, - origins) - if temp_needed: - temp[...] = output - output = temp - return output - - -def rank_filter(input, rank, size=None, footprint=None, output=None, - mode="reflect", cval=0.0, origin=0, *, axes=None): - """Calculate a multidimensional rank filter. - - Parameters - ---------- - %(input)s - rank : int - The rank parameter may be less than zero, i.e., rank = -1 - indicates the largest element. - %(size_foot)s - %(output)s - %(mode_reflect)s - %(cval)s - %(origin_multiple)s - axes : tuple of int or None, optional - If None, `input` is filtered along all axes. Otherwise, - `input` is filtered along the specified axes. - - Returns - ------- - rank_filter : ndarray - Filtered array. Has the same shape as `input`. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> fig = plt.figure() - >>> plt.gray() # show the filtered result in grayscale - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - >>> ascent = datasets.ascent() - >>> result = ndimage.rank_filter(ascent, rank=42, size=20) - >>> ax1.imshow(ascent) - >>> ax2.imshow(result) - >>> plt.show() - """ - rank = operator.index(rank) - return _rank_filter(input, rank, size, footprint, output, mode, cval, - origin, 'rank', axes=axes) - - -def median_filter(input, size=None, footprint=None, output=None, - mode="reflect", cval=0.0, origin=0, *, axes=None): - """ - Calculate a multidimensional median filter. - - Parameters - ---------- - %(input)s - %(size_foot)s - %(output)s - %(mode_reflect)s - %(cval)s - %(origin_multiple)s - axes : tuple of int or None, optional - If None, `input` is filtered along all axes. Otherwise, - `input` is filtered along the specified axes. - - Returns - ------- - median_filter : ndarray - Filtered array. Has the same shape as `input`. - - See Also - -------- - scipy.signal.medfilt2d - - Notes - ----- - For 2-dimensional images with ``uint8``, ``float32`` or ``float64`` dtypes - the specialised function `scipy.signal.medfilt2d` may be faster. It is - however limited to constant mode with ``cval=0``. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> fig = plt.figure() - >>> plt.gray() # show the filtered result in grayscale - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - >>> ascent = datasets.ascent() - >>> result = ndimage.median_filter(ascent, size=20) - >>> ax1.imshow(ascent) - >>> ax2.imshow(result) - >>> plt.show() - """ - return _rank_filter(input, 0, size, footprint, output, mode, cval, - origin, 'median', axes=axes) - - -def percentile_filter(input, percentile, size=None, footprint=None, - output=None, mode="reflect", cval=0.0, origin=0, *, - axes=None): - """Calculate a multidimensional percentile filter. - - Parameters - ---------- - %(input)s - percentile : scalar - The percentile parameter may be less than zero, i.e., - percentile = -20 equals percentile = 80 - %(size_foot)s - %(output)s - %(mode_reflect)s - %(cval)s - %(origin_multiple)s - axes : tuple of int or None, optional - If None, `input` is filtered along all axes. Otherwise, - `input` is filtered along the specified axes. - - Returns - ------- - percentile_filter : ndarray - Filtered array. Has the same shape as `input`. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - >>> fig = plt.figure() - >>> plt.gray() # show the filtered result in grayscale - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - >>> ascent = datasets.ascent() - >>> result = ndimage.percentile_filter(ascent, percentile=20, size=20) - >>> ax1.imshow(ascent) - >>> ax2.imshow(result) - >>> plt.show() - """ - return _rank_filter(input, percentile, size, footprint, output, mode, - cval, origin, 'percentile', axes=axes) - - -def generic_filter1d(input, function, filter_size, axis=-1, - output=None, mode="reflect", cval=0.0, origin=0, - extra_arguments=(), extra_keywords=None): - """Calculate a 1-D filter along the given axis. - - `generic_filter1d` iterates over the lines of the array, calling the - given function at each line. The arguments of the line are the - input line, and the output line. The input and output lines are 1-D - double arrays. The input line is extended appropriately according - to the filter size and origin. The output line must be modified - in-place with the result. - - Parameters - ---------- - %(input)s - function : {callable, scipy.LowLevelCallable} - Function to apply along given axis. - filter_size : scalar - Length of the filter. - %(axis)s - %(output)s - %(mode_reflect)s - %(cval)s - %(origin)s - %(extra_arguments)s - %(extra_keywords)s - - Returns - ------- - generic_filter1d : ndarray - Filtered array. Has the same shape as `input`. - - Notes - ----- - This function also accepts low-level callback functions with one of - the following signatures and wrapped in `scipy.LowLevelCallable`: - - .. code:: c - - int function(double *input_line, npy_intp input_length, - double *output_line, npy_intp output_length, - void *user_data) - int function(double *input_line, intptr_t input_length, - double *output_line, intptr_t output_length, - void *user_data) - - The calling function iterates over the lines of the input and output - arrays, calling the callback function at each line. The current line - is extended according to the border conditions set by the calling - function, and the result is copied into the array that is passed - through ``input_line``. The length of the input line (after extension) - is passed through ``input_length``. The callback function should apply - the filter and store the result in the array passed through - ``output_line``. The length of the output line is passed through - ``output_length``. ``user_data`` is the data pointer provided - to `scipy.LowLevelCallable` as-is. - - The callback function must return an integer error status that is zero - if something went wrong and one otherwise. If an error occurs, you should - normally set the python error status with an informative message - before returning, otherwise a default error message is set by the - calling function. - - In addition, some other low-level function pointer specifications - are accepted, but these are for backward compatibility only and should - not be used in new code. - - """ - if extra_keywords is None: - extra_keywords = {} - input = np.asarray(input) - if np.iscomplexobj(input): - raise TypeError('Complex type not supported') - output = _ni_support._get_output(output, input) - if filter_size < 1: - raise RuntimeError('invalid filter size') - axis = normalize_axis_index(axis, input.ndim) - if (filter_size // 2 + origin < 0) or (filter_size // 2 + origin >= - filter_size): - raise ValueError('invalid origin') - mode = _ni_support._extend_mode_to_code(mode) - _nd_image.generic_filter1d(input, function, filter_size, axis, output, - mode, cval, origin, extra_arguments, - extra_keywords) - return output - - -def generic_filter(input, function, size=None, footprint=None, - output=None, mode="reflect", cval=0.0, origin=0, - extra_arguments=(), extra_keywords=None): - """Calculate a multidimensional filter using the given function. - - At each element the provided function is called. The input values - within the filter footprint at that element are passed to the function - as a 1-D array of double values. - - Parameters - ---------- - %(input)s - function : {callable, scipy.LowLevelCallable} - Function to apply at each element. - %(size_foot)s - %(output)s - %(mode_reflect)s - %(cval)s - %(origin_multiple)s - %(extra_arguments)s - %(extra_keywords)s - - Returns - ------- - generic_filter : ndarray - Filtered array. Has the same shape as `input`. - - Notes - ----- - This function also accepts low-level callback functions with one of - the following signatures and wrapped in `scipy.LowLevelCallable`: - - .. code:: c - - int callback(double *buffer, npy_intp filter_size, - double *return_value, void *user_data) - int callback(double *buffer, intptr_t filter_size, - double *return_value, void *user_data) - - The calling function iterates over the elements of the input and - output arrays, calling the callback function at each element. The - elements within the footprint of the filter at the current element are - passed through the ``buffer`` parameter, and the number of elements - within the footprint through ``filter_size``. The calculated value is - returned in ``return_value``. ``user_data`` is the data pointer provided - to `scipy.LowLevelCallable` as-is. - - The callback function must return an integer error status that is zero - if something went wrong and one otherwise. If an error occurs, you should - normally set the python error status with an informative message - before returning, otherwise a default error message is set by the - calling function. - - In addition, some other low-level function pointer specifications - are accepted, but these are for backward compatibility only and should - not be used in new code. - - Examples - -------- - Import the necessary modules and load the example image used for - filtering. - - >>> import numpy as np - >>> from scipy import datasets - >>> from scipy.ndimage import zoom, generic_filter - >>> import matplotlib.pyplot as plt - >>> ascent = zoom(datasets.ascent(), 0.5) - - Compute a maximum filter with kernel size 5 by passing a simple NumPy - aggregation function as argument to `function`. - - >>> maximum_filter_result = generic_filter(ascent, np.amax, [5, 5]) - - While a maximmum filter could also directly be obtained using - `maximum_filter`, `generic_filter` allows generic Python function or - `scipy.LowLevelCallable` to be used as a filter. Here, we compute the - range between maximum and minimum value as an example for a kernel size - of 5. - - >>> def custom_filter(image): - ... return np.amax(image) - np.amin(image) - >>> custom_filter_result = generic_filter(ascent, custom_filter, [5, 5]) - - Plot the original and filtered images. - - >>> fig, axes = plt.subplots(3, 1, figsize=(3, 9)) - >>> plt.gray() # show the filtered result in grayscale - >>> top, middle, bottom = axes - >>> for ax in axes: - ... ax.set_axis_off() # remove coordinate system - >>> top.imshow(ascent) - >>> top.set_title("Original image") - >>> middle.imshow(maximum_filter_result) - >>> middle.set_title("Maximum filter, Kernel: 5x5") - >>> bottom.imshow(custom_filter_result) - >>> bottom.set_title("Custom filter, Kernel: 5x5") - >>> fig.tight_layout() - - """ - if (size is not None) and (footprint is not None): - warnings.warn("ignoring size because footprint is set", - UserWarning, stacklevel=2) - if extra_keywords is None: - extra_keywords = {} - input = np.asarray(input) - if np.iscomplexobj(input): - raise TypeError('Complex type not supported') - origins = _ni_support._normalize_sequence(origin, input.ndim) - if footprint is None: - if size is None: - raise RuntimeError("no footprint or filter size provided") - sizes = _ni_support._normalize_sequence(size, input.ndim) - footprint = np.ones(sizes, dtype=bool) - else: - footprint = np.asarray(footprint, dtype=bool) - fshape = [ii for ii in footprint.shape if ii > 0] - if len(fshape) != input.ndim: - raise RuntimeError('filter footprint array has incorrect shape.') - for origin, lenf in zip(origins, fshape): - if (lenf // 2 + origin < 0) or (lenf // 2 + origin >= lenf): - raise ValueError('invalid origin') - if not footprint.flags.contiguous: - footprint = footprint.copy() - output = _ni_support._get_output(output, input) - mode = _ni_support._extend_mode_to_code(mode) - _nd_image.generic_filter(input, function, footprint, output, mode, - cval, origins, extra_arguments, extra_keywords) - return output diff --git a/src/bioxelnodes/bioxel/scipy/_interpolation.py b/src/bioxelnodes/bioxel/scipy/_interpolation.py deleted file mode 100644 index 0479344..0000000 --- a/src/bioxelnodes/bioxel/scipy/_interpolation.py +++ /dev/null @@ -1,314 +0,0 @@ -import numpy as np -import warnings - -from . import _ni_support -from . import _nd_image -from ._utils import normalize_axis_index - - -def _prepad_for_spline_filter(input, mode, cval): - if mode in ['nearest', 'grid-constant']: - npad = 12 - if mode == 'grid-constant': - padded = np.pad(input, npad, mode='constant', - constant_values=cval) - elif mode == 'nearest': - padded = np.pad(input, npad, mode='edge') - else: - # other modes have exact boundary conditions implemented so - # no prepadding is needed - npad = 0 - padded = input - return padded, npad - - -def spline_filter1d(input, order=3, axis=-1, output=np.float64, - mode='mirror'): - """ - Calculate a 1-D spline filter along the given axis. - - The lines of the array along the given axis are filtered by a - spline filter. The order of the spline must be >= 2 and <= 5. - - Parameters - ---------- - %(input)s - order : int, optional - The order of the spline, default is 3. - axis : int, optional - The axis along which the spline filter is applied. Default is the last - axis. - output : ndarray or dtype, optional - The array in which to place the output, or the dtype of the returned - array. Default is ``numpy.float64``. - %(mode_interp_mirror)s - - Returns - ------- - spline_filter1d : ndarray - The filtered input. - - See Also - -------- - spline_filter : Multidimensional spline filter. - - Notes - ----- - All of the interpolation functions in `ndimage` do spline interpolation of - the input image. If using B-splines of `order > 1`, the input image - values have to be converted to B-spline coefficients first, which is - done by applying this 1-D filter sequentially along all - axes of the input. All functions that require B-spline coefficients - will automatically filter their inputs, a behavior controllable with - the `prefilter` keyword argument. For functions that accept a `mode` - parameter, the result will only be correct if it matches the `mode` - used when filtering. - - For complex-valued `input`, this function processes the real and imaginary - components independently. - - .. versionadded:: 1.6.0 - Complex-valued support added. - - Examples - -------- - We can filter an image using 1-D spline along the given axis: - - >>> from scipy.ndimage import spline_filter1d - >>> import numpy as np - >>> import matplotlib.pyplot as plt - >>> orig_img = np.eye(20) # create an image - >>> orig_img[10, :] = 1.0 - >>> sp_filter_axis_0 = spline_filter1d(orig_img, axis=0) - >>> sp_filter_axis_1 = spline_filter1d(orig_img, axis=1) - >>> f, ax = plt.subplots(1, 3, sharex=True) - >>> for ind, data in enumerate([[orig_img, "original image"], - ... [sp_filter_axis_0, "spline filter (axis=0)"], - ... [sp_filter_axis_1, "spline filter (axis=1)"]]): - ... ax[ind].imshow(data[0], cmap='gray_r') - ... ax[ind].set_title(data[1]) - >>> plt.tight_layout() - >>> plt.show() - - """ - if order < 0 or order > 5: - raise RuntimeError('spline order not supported') - input = np.asarray(input) - complex_output = np.iscomplexobj(input) - output = _ni_support._get_output(output, input, - complex_output=complex_output) - if complex_output: - spline_filter1d(input.real, order, axis, output.real, mode) - spline_filter1d(input.imag, order, axis, output.imag, mode) - return output - if order in [0, 1]: - output[...] = np.array(input) - else: - mode = _ni_support._extend_mode_to_code(mode) - axis = normalize_axis_index(axis, input.ndim) - _nd_image.spline_filter1d(input, order, axis, output, mode) - return output - - -def spline_filter(input, order=3, output=np.float64, mode='mirror'): - """ - Multidimensional spline filter. - - Parameters - ---------- - %(input)s - order : int, optional - The order of the spline, default is 3. - output : ndarray or dtype, optional - The array in which to place the output, or the dtype of the returned - array. Default is ``numpy.float64``. - %(mode_interp_mirror)s - - Returns - ------- - spline_filter : ndarray - Filtered array. Has the same shape as `input`. - - See Also - -------- - spline_filter1d : Calculate a 1-D spline filter along the given axis. - - Notes - ----- - The multidimensional filter is implemented as a sequence of - 1-D spline filters. The intermediate arrays are stored - in the same data type as the output. Therefore, for output types - with a limited precision, the results may be imprecise because - intermediate results may be stored with insufficient precision. - - For complex-valued `input`, this function processes the real and imaginary - components independently. - - .. versionadded:: 1.6.0 - Complex-valued support added. - - Examples - -------- - We can filter an image using multidimentional splines: - - >>> from scipy.ndimage import spline_filter - >>> import numpy as np - >>> import matplotlib.pyplot as plt - >>> orig_img = np.eye(20) # create an image - >>> orig_img[10, :] = 1.0 - >>> sp_filter = spline_filter(orig_img, order=3) - >>> f, ax = plt.subplots(1, 2, sharex=True) - >>> for ind, data in enumerate([[orig_img, "original image"], - ... [sp_filter, "spline filter"]]): - ... ax[ind].imshow(data[0], cmap='gray_r') - ... ax[ind].set_title(data[1]) - >>> plt.tight_layout() - >>> plt.show() - - """ - if order < 2 or order > 5: - raise RuntimeError('spline order not supported') - input = np.asarray(input) - complex_output = np.iscomplexobj(input) - output = _ni_support._get_output(output, input, - complex_output=complex_output) - if complex_output: - spline_filter(input.real, order, output.real, mode) - spline_filter(input.imag, order, output.imag, mode) - return output - if order not in [0, 1] and input.ndim > 0: - for axis in range(input.ndim): - spline_filter1d(input, order, axis, output=output, mode=mode) - input = output - else: - output[...] = input[...] - return output - - -def zoom(input, zoom, output=None, order=3, mode='constant', cval=0.0, - prefilter=True, *, grid_mode=False): - """ - Zoom an array. - - The array is zoomed using spline interpolation of the requested order. - - Parameters - ---------- - %(input)s - zoom : float or sequence - The zoom factor along the axes. If a float, `zoom` is the same for each - axis. If a sequence, `zoom` should contain one value for each axis. - %(output)s - order : int, optional - The order of the spline interpolation, default is 3. - The order has to be in the range 0-5. - %(mode_interp_constant)s - %(cval)s - %(prefilter)s - grid_mode : bool, optional - If False, the distance from the pixel centers is zoomed. Otherwise, the - distance including the full pixel extent is used. For example, a 1d - signal of length 5 is considered to have length 4 when `grid_mode` is - False, but length 5 when `grid_mode` is True. See the following - visual illustration: - - .. code-block:: text - - | pixel 1 | pixel 2 | pixel 3 | pixel 4 | pixel 5 | - |<-------------------------------------->| - vs. - |<----------------------------------------------->| - - The starting point of the arrow in the diagram above corresponds to - coordinate location 0 in each mode. - - Returns - ------- - zoom : ndarray - The zoomed input. - - Notes - ----- - For complex-valued `input`, this function zooms the real and imaginary - components independently. - - .. versionadded:: 1.6.0 - Complex-valued support added. - - Examples - -------- - >>> from scipy import ndimage, datasets - >>> import matplotlib.pyplot as plt - - >>> fig = plt.figure() - >>> ax1 = fig.add_subplot(121) # left side - >>> ax2 = fig.add_subplot(122) # right side - >>> ascent = datasets.ascent() - >>> result = ndimage.zoom(ascent, 3.0) - >>> ax1.imshow(ascent, vmin=0, vmax=255) - >>> ax2.imshow(result, vmin=0, vmax=255) - >>> plt.show() - - >>> print(ascent.shape) - (512, 512) - - >>> print(result.shape) - (1536, 1536) - """ - if order < 0 or order > 5: - raise RuntimeError('spline order not supported') - input = np.asarray(input) - if input.ndim < 1: - raise RuntimeError('input and output rank must be > 0') - zoom = _ni_support._normalize_sequence(zoom, input.ndim) - output_shape = tuple( - [int(round(ii * jj)) for ii, jj in zip(input.shape, zoom)]) - complex_output = np.iscomplexobj(input) - output = _ni_support._get_output(output, input, shape=output_shape, - complex_output=complex_output) - if complex_output: - # import under different name to avoid confusion with zoom parameter - from scipy.ndimage._interpolation import zoom as _zoom - - kwargs = dict(order=order, mode=mode, prefilter=prefilter) - _zoom(input.real, zoom, output=output.real, - cval=np.real(cval), **kwargs) - _zoom(input.imag, zoom, output=output.imag, - cval=np.imag(cval), **kwargs) - return output - if prefilter and order > 1: - padded, npad = _prepad_for_spline_filter(input, mode, cval) - filtered = spline_filter(padded, order, output=np.float64, mode=mode) - else: - npad = 0 - filtered = input - if grid_mode: - # warn about modes that may have surprising behavior - suggest_mode = None - if mode == 'constant': - suggest_mode = 'grid-constant' - elif mode == 'wrap': - suggest_mode = 'grid-wrap' - if suggest_mode is not None: - warnings.warn( - (f"It is recommended to use mode = {suggest_mode} instead of {mode} " - f"when grid_mode is True."), - stacklevel=2 - ) - mode = _ni_support._extend_mode_to_code(mode) - - zoom_div = np.array(output_shape) - zoom_nominator = np.array(input.shape) - if not grid_mode: - zoom_div -= 1 - zoom_nominator -= 1 - - # Zooming to infinite values is unpredictable, so just choose - # zoom factor 1 instead - zoom = np.divide(zoom_nominator, zoom_div, - out=np.ones_like(input.shape, dtype=np.float64), - where=zoom_div != 0) - zoom = np.ascontiguousarray(zoom) - _nd_image.zoom_shift(filtered, zoom, None, output, order, mode, cval, npad, - grid_mode) - return output diff --git a/src/bioxelnodes/bioxel/scipy/_ni_support.py b/src/bioxelnodes/bioxel/scipy/_ni_support.py deleted file mode 100644 index c312772..0000000 --- a/src/bioxelnodes/bioxel/scipy/_ni_support.py +++ /dev/null @@ -1,120 +0,0 @@ -# Copyright (C) 2003-2005 Peter J. Verveer -# -# 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. The name of the author may not be used to endorse or promote -# products derived from this software without specific prior -# written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - -from collections.abc import Iterable -import operator -import warnings -import numpy as np - - -def _extend_mode_to_code(mode): - """Convert an extension mode to the corresponding integer code. - """ - if mode == 'nearest': - return 0 - elif mode == 'wrap': - return 1 - elif mode in ['reflect', 'grid-mirror']: - return 2 - elif mode == 'mirror': - return 3 - elif mode == 'constant': - return 4 - elif mode == 'grid-wrap': - return 5 - elif mode == 'grid-constant': - return 6 - else: - raise RuntimeError('boundary mode not supported') - - -def _normalize_sequence(input, rank): - """If input is a scalar, create a sequence of length equal to the - rank by duplicating the input. If input is a sequence, - check if its length is equal to the length of array. - """ - is_str = isinstance(input, str) - if not is_str and isinstance(input, Iterable): - normalized = list(input) - if len(normalized) != rank: - err = "sequence argument must have length equal to input rank" - raise RuntimeError(err) - else: - normalized = [input] * rank - return normalized - - -def _get_output(output, input, shape=None, complex_output=False): - if shape is None: - shape = input.shape - if output is None: - if not complex_output: - output = np.zeros(shape, dtype=input.dtype.name) - else: - complex_type = np.promote_types(input.dtype, np.complex64) - output = np.zeros(shape, dtype=complex_type) - elif isinstance(output, (type, np.dtype)): - # Classes (like `np.float32`) and dtypes are interpreted as dtype - if complex_output and np.dtype(output).kind != 'c': - warnings.warn( - "promoting specified output dtype to complex", stacklevel=3) - output = np.promote_types(output, np.complex64) - output = np.zeros(shape, dtype=output) - elif isinstance(output, str): - output = np.dtype(output) - if complex_output and output.kind != 'c': - raise RuntimeError("output must have complex dtype") - elif not issubclass(output.type, np.number): - raise RuntimeError("output must have numeric dtype") - output = np.zeros(shape, dtype=output) - elif output.shape != shape: - raise RuntimeError("output shape not correct") - elif complex_output and output.dtype.kind != 'c': - raise RuntimeError("output must have complex dtype") - return output - - -def _check_axes(axes, ndim): - if axes is None: - return tuple(range(ndim)) - elif np.isscalar(axes): - axes = (operator.index(axes),) - elif isinstance(axes, Iterable): - for ax in axes: - axes = tuple(operator.index(ax) for ax in axes) - if ax < -ndim or ax > ndim - 1: - raise ValueError(f"specified axis: {ax} is out of range") - axes = tuple(ax % ndim if ax < 0 else ax for ax in axes) - else: - message = "axes must be an integer, iterable of integers, or None" - raise ValueError(message) - if len(tuple(set(axes))) != len(axes): - raise ValueError("axes must be unique") - return axes diff --git a/src/bioxelnodes/bioxel/scipy/_utils.py b/src/bioxelnodes/bioxel/scipy/_utils.py deleted file mode 100644 index 5a4b9be..0000000 --- a/src/bioxelnodes/bioxel/scipy/_utils.py +++ /dev/null @@ -1,10 +0,0 @@ - -def normalize_axis_index(axis, ndim): - # Check if `axis` is in the correct range and normalize it - if axis < -ndim or axis >= ndim: - msg = f"axis {axis} is out of bounds for array of dimension {ndim}" - raise Exception(msg) - - if axis < 0: - axis = axis + ndim - return axis diff --git a/src/bioxelnodes/bioxel/skimage/__init__.py b/src/bioxelnodes/bioxel/skimage/__init__.py deleted file mode 100644 index 79b5d74..0000000 --- a/src/bioxelnodes/bioxel/skimage/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._warps import resize diff --git a/src/bioxelnodes/bioxel/skimage/_utils.py b/src/bioxelnodes/bioxel/skimage/_utils.py deleted file mode 100644 index f07a428..0000000 --- a/src/bioxelnodes/bioxel/skimage/_utils.py +++ /dev/null @@ -1,37 +0,0 @@ -import numpy as np - - -def convert_to_float(image, preserve_range): - """Convert input image to float image with the appropriate range. - - Parameters - ---------- - image : ndarray - Input image. - preserve_range : bool - Determines if the range of the image should be kept or transformed - using img_as_float. Also see - https://scikit-image.org/docs/dev/user_guide/data_types.html - - Notes - ----- - * Input images with `float32` data type are not upcast. - - Returns - ------- - image : ndarray - Transformed version of the input. - - """ - if image.dtype == np.float16: - return image.astype(np.float32) - if preserve_range: - # Convert image to double only if it is not single or double - # precision float - if image.dtype.char not in 'df': - image = image.astype(float) - else: - from .dtype import img_as_float - - image = img_as_float(image) - return image diff --git a/src/bioxelnodes/bioxel/skimage/_warps.py b/src/bioxelnodes/bioxel/skimage/_warps.py deleted file mode 100644 index f8f4a4f..0000000 --- a/src/bioxelnodes/bioxel/skimage/_warps.py +++ /dev/null @@ -1,319 +0,0 @@ -import warnings -import numpy as np -from .. import scipy as ndi -from ._utils import convert_to_float - - -def _clip_warp_output(input_image, output_image, mode, cval, clip): - """Clip output image to range of values of input image. - - Note that this function modifies the values of `output_image` in-place - and it is only modified if ``clip=True``. - - Parameters - ---------- - input_image : ndarray - Input image. - output_image : ndarray - Output image, which is modified in-place. - - Other parameters - ---------------- - mode : {'constant', 'edge', 'symmetric', 'reflect', 'wrap'} - Points outside the boundaries of the input are filled according - to the given mode. Modes match the behaviour of `numpy.pad`. - cval : float - Used in conjunction with mode 'constant', the value outside - the image boundaries. - clip : bool - Whether to clip the output to the range of values of the input image. - This is enabled by default, since higher order interpolation may - produce values outside the given input range. - - """ - if clip: - min_val = np.min(input_image) - if np.isnan(min_val): - # NaNs detected, use NaN-safe min/max - min_func = np.nanmin - max_func = np.nanmax - min_val = min_func(input_image) - else: - min_func = np.min - max_func = np.max - max_val = max_func(input_image) - - # Check if cval has been used such that it expands the effective input - # range - preserve_cval = ( - mode == 'constant' - and not min_val <= cval <= max_val - and min_func(output_image) <= cval <= max_func(output_image) - ) - - # expand min/max range to account for cval - if preserve_cval: - # cast cval to the same dtype as the input image - cval = input_image.dtype.type(cval) - min_val = min(min_val, cval) - max_val = max(max_val, cval) - - # Convert array-like types to ndarrays (gh-7159) - min_val, max_val = np.asarray(min_val), np.asarray(max_val) - np.clip(output_image, min_val, max_val, out=output_image) - - -def _validate_interpolation_order(image_dtype, order): - """Validate and return spline interpolation's order. - - Parameters - ---------- - image_dtype : dtype - Image dtype. - order : int, optional - The order of the spline interpolation. The order has to be in - the range 0-5. See `skimage.transform.warp` for detail. - - Returns - ------- - order : int - if input order is None, returns 0 if image_dtype is bool and 1 - otherwise. Otherwise, image_dtype is checked and input order - is validated accordingly (order > 0 is not supported for bool - image dtype) - - """ - - if order is None: - return 0 if image_dtype == bool else 1 - - if order < 0 or order > 5: - raise ValueError( - "Spline interpolation order has to be in the " "range 0-5.") - - if image_dtype == bool and order != 0: - raise ValueError( - "Input image dtype is bool. Interpolation is not defined " - "with bool data type. Please set order to 0 or explicitly " - "cast input image to another data type." - ) - - return order - - -def _preprocess_resize_output_shape(image, output_shape): - """Validate resize output shape according to input image. - - Parameters - ---------- - image: ndarray - Image to be resized. - output_shape: iterable - Size of the generated output image `(rows, cols[, ...][, dim])`. If - `dim` is not provided, the number of channels is preserved. - - Returns - ------- - image: ndarray - The input image, but with additional singleton dimensions appended in - the case where ``len(output_shape) > input.ndim``. - output_shape: tuple - The output image converted to tuple. - - Raises - ------ - ValueError: - If output_shape length is smaller than the image number of - dimensions - - Notes - ----- - The input image is reshaped if its number of dimensions is not - equal to output_shape_length. - - """ - output_shape = tuple(output_shape) - output_ndim = len(output_shape) - input_shape = image.shape - if output_ndim > image.ndim: - # append dimensions to input_shape - input_shape += (1,) * (output_ndim - image.ndim) - image = np.reshape(image, input_shape) - elif output_ndim == image.ndim - 1: - # multichannel case: append shape of last axis - output_shape = output_shape + (image.shape[-1],) - elif output_ndim < image.ndim: - raise ValueError( - "output_shape length cannot be smaller than the " - "image number of dimensions" - ) - - return image, output_shape - - -def _to_ndimage_mode(mode): - """Convert from `numpy.pad` mode name to the corresponding ndimage mode.""" - mode_translation_dict = dict( - constant='constant', - edge='nearest', - symmetric='reflect', - reflect='mirror', - wrap='wrap', - ) - if mode not in mode_translation_dict: - raise ValueError( - f"Unknown mode: '{mode}', or cannot translate mode. The " - f"mode should be one of 'constant', 'edge', 'symmetric', " - f"'reflect', or 'wrap'. See the documentation of numpy.pad for " - f"more info." - ) - return _fix_ndimage_mode(mode_translation_dict[mode]) - - -def _fix_ndimage_mode(mode): - # SciPy 1.6.0 introduced grid variants of constant and wrap which - # have less surprising behavior for images. Use these when available - grid_modes = {'constant': 'grid-constant', 'wrap': 'grid-wrap'} - return grid_modes.get(mode, mode) - - -def resize( - image, - output_shape, - order=None, - mode='reflect', - cval=0, - clip=True, - preserve_range=False, - anti_aliasing=None, - anti_aliasing_sigma=None, -): - """Resize image to match a certain size. - - Performs interpolation to up-size or down-size N-dimensional images. Note - that anti-aliasing should be enabled when down-sizing images to avoid - aliasing artifacts. For downsampling with an integer factor also see - `skimage.transform.downscale_local_mean`. - - Parameters - ---------- - image : ndarray - Input image. - output_shape : iterable - Size of the generated output image `(rows, cols[, ...][, dim])`. If - `dim` is not provided, the number of channels is preserved. In case the - number of input channels does not equal the number of output channels a - n-dimensional interpolation is applied. - - Returns - ------- - resized : ndarray - Resized version of the input. - - Other parameters - ---------------- - order : int, optional - The order of the spline interpolation, default is 0 if - image.dtype is bool and 1 otherwise. The order has to be in - the range 0-5. See `skimage.transform.warp` for detail. - mode : {'constant', 'edge', 'symmetric', 'reflect', 'wrap'}, optional - Points outside the boundaries of the input are filled according - to the given mode. Modes match the behaviour of `numpy.pad`. - cval : float, optional - Used in conjunction with mode 'constant', the value outside - the image boundaries. - clip : bool, optional - Whether to clip the output to the range of values of the input image. - This is enabled by default, since higher order interpolation may - produce values outside the given input range. - preserve_range : bool, optional - Whether to keep the original range of values. Otherwise, the input - image is converted according to the conventions of `img_as_float`. - Also see https://scikit-image.org/docs/dev/user_guide/data_types.html - anti_aliasing : bool, optional - Whether to apply a Gaussian filter to smooth the image prior - to downsampling. It is crucial to filter when downsampling - the image to avoid aliasing artifacts. If not specified, it is set to - True when downsampling an image whose data type is not bool. - It is also set to False when using nearest neighbor interpolation - (``order`` == 0) with integer input data type. - anti_aliasing_sigma : {float, tuple of floats}, optional - Standard deviation for Gaussian filtering used when anti-aliasing. - By default, this value is chosen as (s - 1) / 2 where s is the - downsampling factor, where s > 1. For the up-size case, s < 1, no - anti-aliasing is performed prior to rescaling. - - Notes - ----- - Modes 'reflect' and 'symmetric' are similar, but differ in whether the edge - pixels are duplicated during the reflection. As an example, if an array - has values [0, 1, 2] and was padded to the right by four values using - symmetric, the result would be [0, 1, 2, 2, 1, 0, 0], while for reflect it - would be [0, 1, 2, 1, 0, 1, 2]. - - Examples - -------- - >>> from skimage import data - >>> from skimage.transform import resize - >>> image = data.camera() - >>> resize(image, (100, 100)).shape - (100, 100) - - """ - - image, output_shape = _preprocess_resize_output_shape(image, output_shape) - input_shape = image.shape - input_type = image.dtype - - if input_type == np.float16: - image = image.astype(np.float32) - - if anti_aliasing is None: - anti_aliasing = ( - not input_type == bool - and not (np.issubdtype(input_type, np.integer) and order == 0) - and any(x < y for x, y in zip(output_shape, input_shape)) - ) - - if input_type == bool and anti_aliasing: - raise ValueError("anti_aliasing must be False for boolean images") - - factors = np.divide(input_shape, output_shape) - order = _validate_interpolation_order(input_type, order) - if order > 0: - image = convert_to_float(image, preserve_range) - - # Translate modes used by np.pad to those used by scipy.ndimage - ndi_mode = _to_ndimage_mode(mode) - if anti_aliasing: - if anti_aliasing_sigma is None: - anti_aliasing_sigma = np.maximum(0, (factors - 1) / 2) - else: - anti_aliasing_sigma = np.atleast_1d(anti_aliasing_sigma) * np.ones_like( - factors - ) - if np.any(anti_aliasing_sigma < 0): - raise ValueError( - "Anti-aliasing standard deviation must be " - "greater than or equal to zero" - ) - elif np.any((anti_aliasing_sigma > 0) & (factors <= 1)): - warnings.warn( - "Anti-aliasing standard deviation greater than zero but " - "not down-sampling along all axes", - stacklevel=2 - ) - filtered = ndi.gaussian_filter( - image, anti_aliasing_sigma, cval=cval, mode=ndi_mode - ) - else: - filtered = image - - zoom_factors = [1 / f for f in factors] - out = ndi.zoom( - filtered, zoom_factors, order=order, mode=ndi_mode, cval=cval, grid_mode=True - ) - - _clip_warp_output(image, out, mode, cval, clip) - - return out diff --git a/src/bioxelnodes/bioxel/skimage/dtype.py b/src/bioxelnodes/bioxel/skimage/dtype.py deleted file mode 100644 index 07bc3b4..0000000 --- a/src/bioxelnodes/bioxel/skimage/dtype.py +++ /dev/null @@ -1,605 +0,0 @@ -import warnings -from warnings import warn - -import numpy as np - - -__all__ = [ - 'img_as_float32', - 'img_as_float64', - 'img_as_float', - 'img_as_int', - 'img_as_uint', - 'img_as_ubyte', - 'img_as_bool', - 'dtype_limits', -] - -# Some of these may or may not be aliases depending on architecture & platform -_integer_types = ( - np.int8, - np.byte, - np.int16, - np.short, - np.int32, - np.int64, - np.longlong, - np.int_, - np.intp, - np.intc, - int, - np.uint8, - np.ubyte, - np.uint16, - np.ushort, - np.uint32, - np.uint64, - np.ulonglong, - np.uint, - np.uintp, - np.uintc, -) -_integer_ranges = {t: (np.iinfo(t).min, np.iinfo(t).max) - for t in _integer_types} -dtype_range = { - bool: (False, True), - np.bool_: (False, True), - float: (-1, 1), - np.float16: (-1, 1), - np.float32: (-1, 1), - np.float64: (-1, 1), -} - -with warnings.catch_warnings(): - warnings.filterwarnings('ignore', category=DeprecationWarning) - - # np.bool8 is a deprecated alias of np.bool_ - if hasattr(np, 'bool8'): - dtype_range[np.bool8] = (False, True) - -dtype_range.update(_integer_ranges) - -_supported_types = list(dtype_range.keys()) - - -def dtype_limits(image, clip_negative=False): - """Return intensity limits, i.e. (min, max) tuple, of the image's dtype. - - Parameters - ---------- - image : ndarray - Input image. - clip_negative : bool, optional - If True, clip the negative range (i.e. return 0 for min intensity) - even if the image dtype allows negative values. - - Returns - ------- - imin, imax : tuple - Lower and upper intensity limits. - """ - imin, imax = dtype_range[image.dtype.type] - if clip_negative: - imin = 0 - return imin, imax - - -def _dtype_itemsize(itemsize, *dtypes): - """Return first of `dtypes` with itemsize greater than `itemsize` - - Parameters - ---------- - itemsize: int - The data type object element size. - - Other Parameters - ---------------- - *dtypes: - Any Object accepted by `np.dtype` to be converted to a data - type object - - Returns - ------- - dtype: data type object - First of `dtypes` with itemsize greater than `itemsize`. - - """ - return next(dt for dt in dtypes if np.dtype(dt).itemsize >= itemsize) - - -def _dtype_bits(kind, bits, itemsize=1): - """Return dtype of `kind` that can store a `bits` wide unsigned int - - Parameters: - kind: str - Data type kind. - bits: int - Desired number of bits. - itemsize: int - The data type object element size. - - Returns - ------- - dtype: data type object - Data type of `kind` that can store a `bits` wide unsigned int - - """ - - s = next( - i - for i in (itemsize,) + (2, 4, 8) - if bits < (i * 8) or (bits == (i * 8) and kind == 'u') - ) - - return np.dtype(kind + str(s)) - - -def _scale(a, n, m, copy=True): - """Scale an array of unsigned/positive integers from `n` to `m` bits. - - Numbers can be represented exactly only if `m` is a multiple of `n`. - - Parameters - ---------- - a : ndarray - Input image array. - n : int - Number of bits currently used to encode the values in `a`. - m : int - Desired number of bits to encode the values in `out`. - copy : bool, optional - If True, allocates and returns new array. Otherwise, modifies - `a` in place. - - Returns - ------- - out : array - Output image array. Has the same kind as `a`. - """ - kind = a.dtype.kind - if n > m and a.max() < 2**m: - mnew = int(np.ceil(m / 2) * 2) - if mnew > m: - dtype = f'int{mnew}' - else: - dtype = f'uint{mnew}' - n = int(np.ceil(n / 2) * 2) - warn( - f'Downcasting {a.dtype} to {dtype} without scaling because max ' - f'value {a.max()} fits in {dtype}', - stacklevel=3, - ) - return a.astype(_dtype_bits(kind, m)) - elif n == m: - return a.copy() if copy else a - elif n > m: - # downscale with precision loss - if copy: - b = np.empty(a.shape, _dtype_bits(kind, m)) - np.floor_divide(a, 2 ** (n - m), out=b, - dtype=a.dtype, casting='unsafe') - return b - else: - a //= 2 ** (n - m) - return a - elif m % n == 0: - # exact upscale to a multiple of `n` bits - if copy: - b = np.empty(a.shape, _dtype_bits(kind, m)) - np.multiply(a, (2**m - 1) // (2**n - 1), out=b, dtype=b.dtype) - return b - else: - a = a.astype(_dtype_bits(kind, m, a.dtype.itemsize), copy=False) - a *= (2**m - 1) // (2**n - 1) - return a - else: - # upscale to a multiple of `n` bits, - # then downscale with precision loss - o = (m // n + 1) * n - if copy: - b = np.empty(a.shape, _dtype_bits(kind, o)) - np.multiply(a, (2**o - 1) // (2**n - 1), out=b, dtype=b.dtype) - b //= 2 ** (o - m) - return b - else: - a = a.astype(_dtype_bits(kind, o, a.dtype.itemsize), copy=False) - a *= (2**o - 1) // (2**n - 1) - a //= 2 ** (o - m) - return a - - -def _convert(image, dtype, force_copy=False, uniform=False): - """ - Convert an image to the requested data-type. - - Warnings are issued in case of precision loss, or when negative values - are clipped during conversion to unsigned integer types (sign loss). - - Floating point values are expected to be normalized and will be clipped - to the range [0.0, 1.0] or [-1.0, 1.0] when converting to unsigned or - signed integers respectively. - - Numbers are not shifted to the negative side when converting from - unsigned to signed integer types. Negative values will be clipped when - converting to unsigned integers. - - Parameters - ---------- - image : ndarray - Input image. - dtype : dtype - Target data-type. - force_copy : bool, optional - Force a copy of the data, irrespective of its current dtype. - uniform : bool, optional - Uniformly quantize the floating point range to the integer range. - By default (uniform=False) floating point values are scaled and - rounded to the nearest integers, which minimizes back and forth - conversion errors. - - .. versionchanged:: 0.15 - ``_convert`` no longer warns about possible precision or sign - information loss. See discussions on these warnings at: - https://github.com/scikit-image/scikit-image/issues/2602 - https://github.com/scikit-image/scikit-image/issues/543#issuecomment-208202228 - https://github.com/scikit-image/scikit-image/pull/3575 - - References - ---------- - .. [1] DirectX data conversion rules. - https://msdn.microsoft.com/en-us/library/windows/desktop/dd607323%28v=vs.85%29.aspx - .. [2] Data Conversions. In "OpenGL ES 2.0 Specification v2.0.25", - pp 7-8. Khronos Group, 2010. - .. [3] Proper treatment of pixels as integers. A.W. Paeth. - In "Graphics Gems I", pp 249-256. Morgan Kaufmann, 1990. - .. [4] Dirty Pixels. J. Blinn. In "Jim Blinn's corner: Dirty Pixels", - pp 47-57. Morgan Kaufmann, 1998. - - """ - image = np.asarray(image) - dtypeobj_in = image.dtype - if dtype is np.floating: - dtypeobj_out = np.dtype('float64') - else: - dtypeobj_out = np.dtype(dtype) - dtype_in = dtypeobj_in.type - dtype_out = dtypeobj_out.type - kind_in = dtypeobj_in.kind - kind_out = dtypeobj_out.kind - itemsize_in = dtypeobj_in.itemsize - itemsize_out = dtypeobj_out.itemsize - - # Below, we do an `issubdtype` check. Its purpose is to find out - # whether we can get away without doing any image conversion. This happens - # when: - # - # - the output and input dtypes are the same or - # - when the output is specified as a type, and the input dtype - # is a subclass of that type (e.g. `np.floating` will allow - # `float32` and `float64` arrays through) - - if np.issubdtype(dtype_in, dtype): - if force_copy: - image = image.copy() - return image - - if not (dtype_in in _supported_types and dtype_out in _supported_types): - raise ValueError( - f'Cannot convert from {dtypeobj_in} to ' f'{dtypeobj_out}.') - - if kind_in in 'ui': - imin_in = np.iinfo(dtype_in).min - imax_in = np.iinfo(dtype_in).max - if kind_out in 'ui': - imin_out = np.iinfo(dtype_out).min - imax_out = np.iinfo(dtype_out).max - - # any -> binary - if kind_out == 'b': - return image > dtype_in(dtype_range[dtype_in][1] / 2) - - # binary -> any - if kind_in == 'b': - result = image.astype(dtype_out) - if kind_out != 'f': - result *= dtype_out(dtype_range[dtype_out][1]) - return result - - # float -> any - if kind_in == 'f': - if kind_out == 'f': - # float -> float - return image.astype(dtype_out) - - if np.min(image) < -1.0 or np.max(image) > 1.0: - raise ValueError("Images of type float must be between -1 and 1.") - # floating point -> integer - # use float type that can represent output integer type - computation_type = _dtype_itemsize( - itemsize_out, dtype_in, np.float32, np.float64 - ) - - if not uniform: - if kind_out == 'u': - image_out = np.multiply( - image, imax_out, dtype=computation_type) - else: - image_out = np.multiply( - image, (imax_out - imin_out) / 2, dtype=computation_type - ) - image_out -= 1.0 / 2.0 - np.rint(image_out, out=image_out) - np.clip(image_out, imin_out, imax_out, out=image_out) - elif kind_out == 'u': - image_out = np.multiply( - image, imax_out + 1, dtype=computation_type) - np.clip(image_out, 0, imax_out, out=image_out) - else: - image_out = np.multiply( - image, (imax_out - imin_out + 1.0) / 2.0, dtype=computation_type - ) - np.floor(image_out, out=image_out) - np.clip(image_out, imin_out, imax_out, out=image_out) - return image_out.astype(dtype_out) - - # signed/unsigned int -> float - if kind_out == 'f': - # use float type that can exactly represent input integers - computation_type = _dtype_itemsize( - itemsize_in, dtype_out, np.float32, np.float64 - ) - - if kind_in == 'u': - # using np.divide or np.multiply doesn't copy the data - # until the computation time - image = np.multiply(image, 1.0 / imax_in, dtype=computation_type) - # DirectX uses this conversion also for signed ints - # if imin_in: - # np.maximum(image, -1.0, out=image) - elif kind_in == 'i': - # From DirectX conversions: - # The most negative value maps to -1.0f - # Every other value is converted to a float (call it c) - # and then result = c * (1.0f / (2⁽ⁿ⁻¹⁾-1)). - - image = np.multiply(image, 1.0 / imax_in, dtype=computation_type) - np.maximum(image, -1.0, out=image) - - else: - image = np.add(image, 0.5, dtype=computation_type) - image *= 2 / (imax_in - imin_in) - - return np.asarray(image, dtype_out) - - # unsigned int -> signed/unsigned int - if kind_in == 'u': - if kind_out == 'i': - # unsigned int -> signed int - image = _scale(image, 8 * itemsize_in, 8 * itemsize_out - 1) - return image.view(dtype_out) - else: - # unsigned int -> unsigned int - return _scale(image, 8 * itemsize_in, 8 * itemsize_out) - - # signed int -> unsigned int - if kind_out == 'u': - image = _scale(image, 8 * itemsize_in - 1, 8 * itemsize_out) - result = np.empty(image.shape, dtype_out) - np.maximum(image, 0, out=result, dtype=image.dtype, casting='unsafe') - return result - - # signed int -> signed int - if itemsize_in > itemsize_out: - return _scale(image, 8 * itemsize_in - 1, 8 * itemsize_out - 1) - - image = image.astype(_dtype_bits('i', itemsize_out * 8)) - image -= imin_in - image = _scale(image, 8 * itemsize_in, 8 * itemsize_out, copy=False) - image += imin_out - return image.astype(dtype_out) - - -def convert(image, dtype, force_copy=False, uniform=False): - warn( - "The use of this function is discouraged as its behavior may change " - "dramatically in scikit-image 1.0. This function will be removed " - "in scikit-image 1.0.", - FutureWarning, - stacklevel=2, - ) - return _convert(image=image, dtype=dtype, force_copy=force_copy, uniform=uniform) - - -if _convert.__doc__ is not None: - convert.__doc__ = ( - _convert.__doc__ - + """ - - Warns - ----- - FutureWarning: - .. versionadded:: 0.17 - - The use of this function is discouraged as its behavior may change - dramatically in scikit-image 1.0. This function will be removed - in scikit-image 1.0. - """ - ) - - -def img_as_float32(image, force_copy=False): - """Convert an image to single-precision (32-bit) floating point format. - - Parameters - ---------- - image : ndarray - Input image. - force_copy : bool, optional - Force a copy of the data, irrespective of its current dtype. - - Returns - ------- - out : ndarray of float32 - Output image. - - Notes - ----- - The range of a floating point image is [0.0, 1.0] or [-1.0, 1.0] when - converting from unsigned or signed datatypes, respectively. - If the input image has a float type, intensity values are not modified - and can be outside the ranges [0.0, 1.0] or [-1.0, 1.0]. - - """ - return _convert(image, np.float32, force_copy) - - -def img_as_float64(image, force_copy=False): - """Convert an image to double-precision (64-bit) floating point format. - - Parameters - ---------- - image : ndarray - Input image. - force_copy : bool, optional - Force a copy of the data, irrespective of its current dtype. - - Returns - ------- - out : ndarray of float64 - Output image. - - Notes - ----- - The range of a floating point image is [0.0, 1.0] or [-1.0, 1.0] when - converting from unsigned or signed datatypes, respectively. - If the input image has a float type, intensity values are not modified - and can be outside the ranges [0.0, 1.0] or [-1.0, 1.0]. - - """ - return _convert(image, np.float64, force_copy) - - -def img_as_float(image, force_copy=False): - """Convert an image to floating point format. - - This function is similar to `img_as_float64`, but will not convert - lower-precision floating point arrays to `float64`. - - Parameters - ---------- - image : ndarray - Input image. - force_copy : bool, optional - Force a copy of the data, irrespective of its current dtype. - - Returns - ------- - out : ndarray of float - Output image. - - Notes - ----- - The range of a floating point image is [0.0, 1.0] or [-1.0, 1.0] when - converting from unsigned or signed datatypes, respectively. - If the input image has a float type, intensity values are not modified - and can be outside the ranges [0.0, 1.0] or [-1.0, 1.0]. - - """ - return _convert(image, np.floating, force_copy) - - -def img_as_uint(image, force_copy=False): - """Convert an image to 16-bit unsigned integer format. - - Parameters - ---------- - image : ndarray - Input image. - force_copy : bool, optional - Force a copy of the data, irrespective of its current dtype. - - Returns - ------- - out : ndarray of uint16 - Output image. - - Notes - ----- - Negative input values will be clipped. - Positive values are scaled between 0 and 65535. - - """ - return _convert(image, np.uint16, force_copy) - - -def img_as_int(image, force_copy=False): - """Convert an image to 16-bit signed integer format. - - Parameters - ---------- - image : ndarray - Input image. - force_copy : bool, optional - Force a copy of the data, irrespective of its current dtype. - - Returns - ------- - out : ndarray of int16 - Output image. - - Notes - ----- - The values are scaled between -32768 and 32767. - If the input data-type is positive-only (e.g., uint8), then - the output image will still only have positive values. - - """ - return _convert(image, np.int16, force_copy) - - -def img_as_ubyte(image, force_copy=False): - """Convert an image to 8-bit unsigned integer format. - - Parameters - ---------- - image : ndarray - Input image. - force_copy : bool, optional - Force a copy of the data, irrespective of its current dtype. - - Returns - ------- - out : ndarray of ubyte (uint8) - Output image. - - Notes - ----- - Negative input values will be clipped. - Positive values are scaled between 0 and 255. - - """ - return _convert(image, np.uint8, force_copy) - - -def img_as_bool(image, force_copy=False): - """Convert an image to boolean format. - - Parameters - ---------- - image : ndarray - Input image. - force_copy : bool, optional - Force a copy of the data, irrespective of its current dtype. - - Returns - ------- - out : ndarray of bool (`bool_`) - Output image. - - Notes - ----- - The upper half of the input dtype's positive range is True, and the lower - half is False. All negative values (if present) are False. - - """ - return _convert(image, bool, force_copy) diff --git a/src/bioxelnodes/blender_manifest.toml b/src/bioxelnodes/blender_manifest.toml index f74dc58..db7e630 100644 --- a/src/bioxelnodes/blender_manifest.toml +++ b/src/bioxelnodes/blender_manifest.toml @@ -1,12 +1,12 @@ schema_version = "1.0.0" id = "bioxelnodes" -version = "2.0.0" +version = "2.0.1" name = "Bioxel Nodes" tagline = "For scientific volumetric data visualization in Blender" maintainer = "Nan " type = "add-on" -website = "https://omoolab.github.io/BioxelNodes/latest" +website = "https://docs.omoolab.xyz/bioxelnodes/" tags = ["Geometry Nodes", "Render", "Import-Export"] blender_version_min = "5.0.0" @@ -29,12 +29,13 @@ wheels = [ "./wheels/matplotlib-3.10.7-cp311-cp311-win_amd64.whl", "./wheels/matplotlib-3.10.7-cp313-cp313-win_amd64.whl", "./wheels/mrcfile-1.5.1-py2.py3-none-any.whl", - "./wheels/packaging-26.2-py3-none-any.whl", "./wheels/pillow-11.2.1-cp311-cp311-win_amd64.whl", "./wheels/pillow-11.2.1-cp313-cp313-win_amd64.whl", "./wheels/pyometiff-1.0.0-py3-none-any.whl", "./wheels/pyparsing-3.3.2-py3-none-any.whl", "./wheels/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", + "./wheels/scipy-1.17.1-cp311-cp311-win_amd64.whl", + "./wheels/scipy-1.17.1-cp313-cp313-win_amd64.whl", "./wheels/simpleitk-2.5.5-cp311-abi3-win_amd64.whl", "./wheels/six-1.17.0-py2.py3-none-any.whl", "./wheels/tifffile-2024.7.24-py3-none-any.whl", diff --git a/src/bioxelnodes/layer.py b/src/bioxelnodes/layer.py index a3926a0..049018b 100644 --- a/src/bioxelnodes/layer.py +++ b/src/bioxelnodes/layer.py @@ -227,20 +227,18 @@ def set_layer_caches(layers_data: List[Dict[str, Any]]): layers_text.write(json.dumps(layers_data, indent=4)) -def save_layers_to_json(layers: List[Layer], cache_dir: str) -> List[int]: +def save_layers_to_cache(layers: List[Layer], cache_dir: str) -> List[Dict[str, Any]]: """ - Save multiple Layer objects into the internal layers text datablock. + Save multiple Layer objects into cache folders. For each layer: - Generates a unique cache id. - Writes VDB files and a low-resolution snapshot (.npy) plus PNG slices under cache_dir//. - - Appends an entry describing the layer into the b i o x e l _ l a y e r s text datablock. Returns: - - List of generated cache ids for the saved layers. + - List of layer cache metadata dictionaries. """ - existing_data = get_layer_caches() - added_ids = [] + cache_infos = [] cache_dir_path = Path(cache_dir) cache_dir_path.mkdir(parents=True, exist_ok=True) @@ -270,8 +268,22 @@ def save_layers_to_json(layers: List[Layer], cache_dir: str) -> List[int]: "snapshot_z": 0.5, } + cache_infos.append(cache_info) + + return cache_infos + + +def save_layers_to_json(layers: List[Layer], cache_dir: str) -> List[int]: + """ + Save multiple Layer objects into cache folders and the internal layers text datablock. + """ + existing_data = get_layer_caches() + cache_infos = save_layers_to_cache(layers, cache_dir) + + added_ids = [] + for cache_info in cache_infos: existing_data.append(cache_info) - added_ids.append(cache_id) + added_ids.append(cache_info["id"]) set_layer_caches(existing_data) print(f"Successfully added {len(added_ids)} layers to the internal text datablock") diff --git a/src/bioxelnodes/operators/io.py b/src/bioxelnodes/operators/io.py index 96e1b5f..b930507 100644 --- a/src/bioxelnodes/operators/io.py +++ b/src/bioxelnodes/operators/io.py @@ -1,22 +1,22 @@ +import json import math import shutil -import threading +import subprocess +import tempfile from pathlib import Path import bpy import numpy as np import SimpleITK as sitk -import transforms3d # KeyboardInterrupt replaced with built-in KeyboardInterrupt from ..props import BIOXEL_Series from ..utils import get_layer_obj, wrapped_label -from ..bioxel.layer import Layer -from ..bioxel.parse import DICOM_EXTS, SUPPORT_EXTS, get_ext, parse_volumetric_data +from ..bioxel.parse import DICOM_EXTS, SUPPORT_EXTS, get_ext from ..utils import get_cache_dir, progress_update, progress_bar -from ..layer import get_layer_caches, save_layers_to_json +from ..layer import get_layer_caches, set_layer_caches def get_layer_shape(bioxel_size: float, orig_shape: tuple, orig_spacing: tuple): @@ -43,6 +43,90 @@ def get_layer_size(shape: tuple, bioxel_size: float, scale: float = 1.0): return size +def write_worker_json(path: Path, data): + path.write_text(json.dumps(data), encoding="utf-8") + + +def read_worker_json(path: Path): + try: + return json.loads(path.read_text(encoding="utf-8")) + except Exception: + return None + + +def remove_progress_bar_safe(): + try: + bpy.types.STATUSBAR_HT_header.remove(progress_bar) + except Exception: + pass + + +def start_worker_process(owner, command: str, payload: dict): + job_dir = Path(tempfile.mkdtemp(prefix="bioxel_import_", dir=str(get_cache_dir()))) + config_path = job_dir / "config.json" + progress_path = job_dir / "progress.json" + result_path = job_dir / "result.json" + cancel_path = job_dir / "cancel" + log_path = job_dir / "worker.log" + + config = { + **payload, + "command": command, + "progress_path": str(progress_path), + "result_path": str(result_path), + "cancel_path": str(cancel_path), + } + write_worker_json(config_path, config) + write_worker_json(progress_path, {"factor": 0.0, "text": "Starting..."}) + + worker_path = Path(__file__).with_name("io_worker.py") + cmd = [ + bpy.app.binary_path, + "--background", + "--factory-startup", + "--python", + str(worker_path), + "--", + str(config_path), + ] + + creationflags = getattr(subprocess, "CREATE_NO_WINDOW", 0) + log_file = log_path.open("w", encoding="utf-8") + try: + owner.process = subprocess.Popen( + cmd, + stdout=log_file, + stderr=subprocess.STDOUT, + creationflags=creationflags, + ) + finally: + log_file.close() + + owner.job_dir = job_dir + owner.progress_path = progress_path + owner.result_path = result_path + owner.cancel_path = cancel_path + owner.log_path = log_path + + +def cancel_worker_process(owner, context): + owner.is_cancelled = True + try: + owner.cancel_path.write_text("cancel", encoding="utf-8") + except Exception: + pass + progress_update(context, 0.0, "Canceling...") + + +def update_worker_progress(owner, context): + progress = read_worker_json(owner.progress_path) + if progress: + progress_update( + context, + float(progress.get("factor", 0.0)), + progress.get("text", ""), + ) + """ ImportData -> ParseVolumetricData -> ImportDataDialog start import parse data execute import @@ -167,7 +251,12 @@ class ParseVolumetricData(bpy.types.Operator): meta = None label_count = 0 dtype = None - thread = None + process = None + job_dir = None + progress_path = None + result_path = None + cancel_path = None + log_path = None _timer = None progress: bpy.props.FloatProperty( @@ -202,97 +291,64 @@ class ParseVolumetricData(bpy.types.Operator): def execute(self, context): print("Collecting Meta Data...") - - def parse_volumetric_data_func(self, context, cancel): - def progress_callback(factor, text): - if cancel(): - raise KeyboardInterrupt("Cancelled by user") - progress_update(context, factor, text) - - try: - series_id = self.series_id if self.series_id != "empty" else "" - data, meta = parse_volumetric_data( - data_file=self.filepath, - series_id=series_id, - progress_callback=progress_callback, - ) - except KeyboardInterrupt: - return - except Exception as e: - self.has_error = e - return - - if cancel(): - return - - self.meta = meta - self.label_count = int(np.max(data)) - self.dtype = data.dtype - - # Init cancel flag self.is_cancelled = False self.has_error = None + self.meta = None + self.label_count = 0 + self.dtype = None - # Create the thread - self.thread = threading.Thread( - target=parse_volumetric_data_func, - args=(self, context, lambda: self.is_cancelled), + start_worker_process( + self, + "read_meta", + { + "filepath": self.filepath, + "series_id": self.series_id, + }, ) - # Start the thread - self.thread.start() - # Add a timmer for modal self._timer = context.window_manager.event_timer_add( time_step=0.1, window=context.window ) - # Append progress bar to status bar bpy.types.STATUSBAR_HT_header.append(progress_bar) - - # Start modal handler context.window_manager.modal_handler_add(self) return {"RUNNING_MODAL"} def modal(self, context, event): - # Check if user press 'ESC' if event.type == "ESC": - self.is_cancelled = True - progress_update(context, 0.0, "Canceling...") + cancel_worker_process(self, context) return {"PASS_THROUGH"} - # Check if is the timer time if event.type != "TIMER": return {"PASS_THROUGH"} - # Force update status bar bpy.context.workspace.status_text_set_internal(None) + update_worker_progress(self, context) - # Check if thread is still running - if self.thread.is_alive(): + if self.process.poll() is None: return {"PASS_THROUGH"} - # Release the thread - self.thread.join() - # Remove the timer context.window_manager.event_timer_remove(self._timer) - # Remove the progress bar from status bar - bpy.types.STATUSBAR_HT_header.remove(progress_bar) + remove_progress_bar_safe() progress_update(context, 1.0) - # Check if thread is cancelled by user - if self.is_cancelled: + result = read_worker_json(self.result_path) + if self.is_cancelled or (result and result.get("cancelled")): self.report({"WARNING"}, "Canncelled by user.") return {"CANCELLED"} - # Check if thread is cancelled by user - if self.has_error: - raise self.has_error - - # Check if has return - if self.meta is None: - self.report({"ERROR"}, "Some thing went wrong.") + if not result: + self.report({"ERROR"}, f"Import worker failed. See log: {self.log_path}") return {"CANCELLED"} - # If not canncelled... + if not result.get("ok"): + print(result.get("traceback", "")) + self.report({"ERROR"}, result.get("error", "Import worker failed.")) + return {"CANCELLED"} + + self.meta = result["meta"] + self.label_count = int(result["label_count"]) + self.dtype = np.dtype(result["dtype"]) + for key, value in self.meta.items(): print(f"{key}: {value}") @@ -310,8 +366,6 @@ class ParseVolumetricData(bpy.types.Operator): min_log10 = math.floor(math.log10(min(*orig_spacing))) max_log10 = math.floor(math.log10(max(*orig_spacing))) - # min_space = min(*orig_spacing) - # max_space = max(*orig_spacing) if orig_spacing[2] == 1 and min_log10 < -1: orig_spacing = ( @@ -493,8 +547,14 @@ class ImportDataDialog(bpy.types.Operator): bl_description = "Import Volumetric Data as Layer" bl_options = {"UNDO"} - layers = None - thread = None + cache_infos = None + added_ids = None + process = None + job_dir = None + progress_path = None + result_path = None + cancel_path = None + log_path = None _timer = None filepath: bpy.props.StringProperty(subtype="FILE_PATH") # type: ignore @@ -546,253 +606,31 @@ class ImportDataDialog(bpy.types.Operator): ) # type: ignore def execute(self, context): - def import_volumetric_data_func(self, context, cancel): - progress_update(context, 0.0, "Parsing Volumetirc Data...") - - def progress_callback(factor, text): - if cancel(): - raise KeyboardInterrupt("Cancelled by user") - progress_update(context, factor * 0.2, text) - - def progress_callback_factory(layer_name, progress, progress_step): - def progress_callback(frame, total): - if cancel(): - raise KeyboardInterrupt("Cancelled by user") - sub_progress_step = progress_step / total - sub_progress = progress + frame * sub_progress_step - progress_update( - context, - sub_progress, - f"Processing {layer_name} Frame {frame+1}...", - ) - print(f"Processing {layer_name} Frame {frame+1}...") - - return progress_callback - - try: - data, meta = parse_volumetric_data( - data_file=self.filepath, - series_id=self.series_id, - progress_callback=progress_callback, - ) - - except KeyboardInterrupt: - return - except Exception as e: - self.has_error = e - return - - if cancel(): - return - - shape = get_layer_shape( - self.bioxel_size, self.orig_shape, self.orig_spacing - ) - - mat_scale = transforms3d.zooms.zfdir2aff(self.bioxel_size) - affine = np.dot(meta["affine"], mat_scale) - kind = self.read_as.lower() - - if cancel(): - return - - # change shape as sequence or not - if self.frame_source == "-1": - data = data[0:1, :, :, :, :] - elif self.frame_source == "0": - # frame as frame - pass - elif self.frame_source == "1": - # X as frame - data = data.transpose(1, 0, 2, 3, 4) - shape = (1, shape[1], shape[2]) - elif self.frame_source == "2": - # Y as frame - data = data.transpose(2, 1, 0, 3, 4) - shape = (shape[0], 1, shape[2]) - elif self.frame_source == "3": - # Z as frame - data = data.transpose(3, 1, 2, 0, 4) - shape = (shape[0], shape[1], 1) - else: - # channel as frame - data = data.transpose(4, 1, 2, 3, 0) - - layers = [] - if kind == "label": - name = self.layer_name or "Label" - data = data.astype(int) - label_count = int(np.max(data)) - progress_step = 0.7 / label_count - - for i in range(label_count): - if cancel(): - return - - name_i = f"{name}_{i+1}" - progress = 0.2 + i * progress_step - progress_update(context, progress, f"Processing {name_i}...") - - progress_callback = progress_callback_factory( - name_i, progress, progress_step - ) - label_data = data == np.full_like(data, i + 1) - # label_data = label_data.astype(np.float32) - try: - layer = Layer(data=label_data, name=name_i, kind=kind) - - layer.resize( - shape=shape, - smooth=self.smooth, - progress_callback=progress_callback, - ) - - layer.affine = affine - - layers.append(layer) - except KeyboardInterrupt: - return - except Exception as e: - self.has_error = e - return - - if kind == "color": - if np.issubdtype(np.uint8, data.dtype): - data = np.multiply(data, 1.0 / 256, dtype=np.float32) - elif data.dtype.kind in ["u", "i"]: - # Convert the normalized array to float dtype - data = data.astype(np.float32) - - min_val = data.min() - max_val = data.max() - # Avoid division by zero if all values are the same - if max_val != min_val: - # Normalize the array to the range (0,1) - data = (data - min_val) / (max_val - min_val) - else: - # If all values are the same, the normalized array will be all zeros - data = np.zeros_like(data, dtype=np.float32) - - else: - data = data.astype(np.float32) - - # Gamma Correct - # data = data ** 2.2 - - name = self.layer_name or "Color" - if data.shape[4] == 1: - data = np.repeat(data, repeats=3, axis=4) - elif data.shape[4] == 2: - d_shape = list(data.shape) - d_shape = d_shape[:4] + [1] - zore = np.zeros(tuple(d_shape), dtype=np.float32) - data = np.concatenate((data, zore), axis=-1) - elif data.shape[4] > 3: - data = data[:, :, :, :, :3] - - if cancel(): - return - - progress_update(context, 0.2, f"Processing {name}...") - progress_callback = progress_callback_factory(name, 0.2, 0.7) - - try: - layer = Layer(data=data, name=name, kind=kind) - - layer.resize(shape=shape, progress_callback=progress_callback) - - layer.affine = affine - - layers.append(layer) - except KeyboardInterrupt: - return - except Exception as e: - self.has_error = e - return - - elif kind == "scalar": - name = self.layer_name or "Scalar" - - if self.remap: - # Convert the normalized array to float dtype - data = data.astype(np.float32) - - min_val = data.min() - max_val = data.max() - # Avoid division by zero if all values are the same - if max_val != min_val: - # Normalize the array to the range (0,1) - data = (data - min_val) / (max_val - min_val) - else: - # If all values are the same, the normalized array will be all zeros - data = np.zeros_like(data, dtype=np.float32) - - if self.split_channel: - progress_step = 0.7 / self.channel_count - - for i in range(self.channel_count): - if cancel(): - return - - name_i = f"{name}_{i+1}" - progress = 0.2 + i * progress_step - progress_update(context, progress, f"Processing {name_i}...") - progress_callback = progress_callback_factory( - name_i, progress, progress_step - ) - try: - layer = Layer( - data=data[:, :, :, :, i : i + 1], name=name_i, kind=kind - ) - - layer.resize( - shape=shape, progress_callback=progress_callback - ) - - layer.affine = affine - - layers.append(layer) - except KeyboardInterrupt: - return - except Exception as e: - self.has_error = e - return - else: - if cancel(): - return - - progress_update(context, 0.2, f"Processing {name}...") - progress_callback = progress_callback_factory(name, 0.2, 0.7) - - try: - layer = Layer(data=data, name=name, kind=kind) - - layer.resize(shape=shape, progress_callback=progress_callback) - - layer.affine = affine - - layers.append(layer) - except KeyboardInterrupt: - return - except Exception as e: - self.has_error = e - return - - if cancel(): - return - - self.layers = layers - progress_update(context, 0.9, "Creating Layers...") - self.is_cancelled = False self.has_error = None + self.cache_infos = None + self.added_ids = None - self.thread = threading.Thread( - target=import_volumetric_data_func, - args=(self, context, lambda: self.is_cancelled), + start_worker_process( + self, + "import_layers", + { + "filepath": self.filepath, + "series_id": self.series_id, + "cache_dir": str(get_cache_dir() / "layers"), + "layer_name": self.layer_name, + "orig_shape": list(self.orig_shape), + "orig_spacing": list(self.orig_spacing), + "bioxel_size": self.bioxel_size, + "read_as": self.read_as, + "frame_source": self.frame_source, + "smooth": self.smooth, + "remap": self.remap, + "split_channel": self.split_channel, + "channel_count": self.channel_count, + }, ) - self.thread.start() self._timer = context.window_manager.event_timer_add( time_step=0.1, window=context.window ) @@ -803,41 +641,49 @@ class ImportDataDialog(bpy.types.Operator): def modal(self, context, event): if event.type == "ESC": - self.is_cancelled = True - progress_update(context, 0.0, "Canceling...") + cancel_worker_process(self, context) return {"PASS_THROUGH"} if event.type != "TIMER": return {"PASS_THROUGH"} bpy.context.workspace.status_text_set_internal(None) - if self.thread.is_alive(): + update_worker_progress(self, context) + + if self.process.poll() is None: return {"PASS_THROUGH"} - self.thread.join() context.window_manager.event_timer_remove(self._timer) - bpy.types.STATUSBAR_HT_header.remove(progress_bar) + remove_progress_bar_safe() progress_update(context, 1.0) - if self.is_cancelled: + result = read_worker_json(self.result_path) + if self.is_cancelled or (result and result.get("cancelled")): self.report({"WARNING"}, "Canncelled by user.") return {"CANCELLED"} - # Check if thread is cancelled by user - if self.has_error: - raise self.has_error + if not result: + self.report({"ERROR"}, f"Import worker failed. See log: {self.log_path}") + return {"CANCELLED"} - # Check if has return - if self.layers is None: + if not result.get("ok"): + print(result.get("traceback", "")) + self.report({"ERROR"}, result.get("error", "Import worker failed.")) + return {"CANCELLED"} + + self.cache_infos = result.get("cache_infos") + self.added_ids = result.get("added_ids") + if not self.cache_infos or not self.added_ids: self.report({"ERROR"}, "Some thing went wrong.") return {"CANCELLED"} is_first_import = len(get_layer_caches()) == 0 - ids = save_layers_to_json(self.layers, cache_dir=get_cache_dir() / "layers") + existing_data = get_layer_caches() + existing_data.extend(self.cache_infos) + set_layer_caches(existing_data) - setattr(context.window_manager, "bioxel_layer_library", ids[-1]) + setattr(context.window_manager, "bioxel_layer_library", self.added_ids[-1]) - # Change render setting for better result if is_first_import: bpy.ops.bioxel.render_setting_preset("EXEC_DEFAULT", preset="balance") diff --git a/src/bioxelnodes/operators/io_worker.py b/src/bioxelnodes/operators/io_worker.py new file mode 100644 index 0000000..31e090d --- /dev/null +++ b/src/bioxelnodes/operators/io_worker.py @@ -0,0 +1,263 @@ +import json +import sys +import traceback +from pathlib import Path + +import numpy as np +import transforms3d + +if __package__: + from ..bioxel.layer import Layer + from ..bioxel.parse import parse_volumetric_data + from ..layer import save_layers_to_cache +else: + PACKAGE_PARENT = Path(__file__).resolve().parents[2] + if str(PACKAGE_PARENT) not in sys.path: + sys.path.insert(0, str(PACKAGE_PARENT)) + + from bioxelnodes.bioxel.layer import Layer + from bioxelnodes.bioxel.parse import parse_volumetric_data + from bioxelnodes.layer import save_layers_to_cache + + +def get_layer_shape(bioxel_size: float, orig_shape: tuple, orig_spacing: tuple): + shape = ( + int(orig_shape[0] / bioxel_size * orig_spacing[0]), + int(orig_shape[1] / bioxel_size * orig_spacing[1]), + int(orig_shape[2] / bioxel_size * orig_spacing[2]), + ) + + return ( + shape[0] if shape[0] > 0 else 1, + shape[1] if shape[1] > 0 else 1, + shape[2] if shape[2] > 0 else 1, + ) + + +def write_json(path: Path, data): + temp_path = path.with_suffix(path.suffix + ".tmp") + temp_path.write_text(json.dumps(data), encoding="utf-8") + temp_path.replace(path) + + +def check_cancel(cancel_path: Path): + if cancel_path.exists(): + raise KeyboardInterrupt("Cancelled by user") + + +def make_progress_writer(progress_path: Path, cancel_path: Path, scale=1.0, offset=0.0): + def progress_callback(factor, text): + check_cancel(cancel_path) + write_json( + progress_path, + { + "factor": offset + factor * scale, + "text": text, + }, + ) + + return progress_callback + + +def progress_callback_factory(progress_path: Path, cancel_path: Path, layer_name, progress, progress_step): + def progress_callback(frame, total): + check_cancel(cancel_path) + sub_progress_step = progress_step / total + sub_progress = progress + frame * sub_progress_step + text = f"Processing {layer_name} Frame {frame+1}..." + write_json(progress_path, {"factor": sub_progress, "text": text}) + print(text) + + return progress_callback + + +def read_meta(config, progress_path: Path, cancel_path: Path): + progress_callback = make_progress_writer(progress_path, cancel_path) + series_id = config["series_id"] if config["series_id"] != "empty" else "" + data, meta = parse_volumetric_data( + data_file=config["filepath"], + series_id=series_id, + progress_callback=progress_callback, + ) + check_cancel(cancel_path) + return { + "meta": { + **meta, + "spacing": list(meta["spacing"]), + "affine": meta["affine"].tolist(), + "xyz_shape": list(meta["xyz_shape"]), + }, + "label_count": int(np.max(data)), + "dtype": data.dtype.str, + "dtype_kind": data.dtype.kind, + } + + +def build_layers(config, progress_path: Path, cancel_path: Path): + write_json(progress_path, {"factor": 0.0, "text": "Parsing Volumetirc Data..."}) + progress_callback = make_progress_writer(progress_path, cancel_path, scale=0.2) + data, meta = parse_volumetric_data( + data_file=config["filepath"], + series_id=config["series_id"], + progress_callback=progress_callback, + ) + + check_cancel(cancel_path) + orig_shape = tuple(config["orig_shape"]) + orig_spacing = tuple(config["orig_spacing"]) + shape = get_layer_shape(config["bioxel_size"], orig_shape, orig_spacing) + + mat_scale = transforms3d.zooms.zfdir2aff(config["bioxel_size"]) + affine = np.dot(meta["affine"], mat_scale) + kind = config["read_as"].lower() + + check_cancel(cancel_path) + frame_source = config["frame_source"] + if frame_source == "-1": + data = data[0:1, :, :, :, :] + elif frame_source == "0": + pass + elif frame_source == "1": + data = data.transpose(1, 0, 2, 3, 4) + shape = (1, shape[1], shape[2]) + elif frame_source == "2": + data = data.transpose(2, 1, 0, 3, 4) + shape = (shape[0], 1, shape[2]) + elif frame_source == "3": + data = data.transpose(3, 1, 2, 0, 4) + shape = (shape[0], shape[1], 1) + else: + data = data.transpose(4, 1, 2, 3, 0) + + layers = [] + if kind == "label": + name = config["layer_name"] or "Label" + data = data.astype(int) + label_count = int(np.max(data)) + progress_step = 0.7 / label_count + + for i in range(label_count): + check_cancel(cancel_path) + name_i = f"{name}_{i+1}" + progress = 0.2 + i * progress_step + write_json(progress_path, {"factor": progress, "text": f"Processing {name_i}..."}) + progress_callback = progress_callback_factory( + progress_path, cancel_path, name_i, progress, progress_step + ) + label_data = data == np.full_like(data, i + 1) + layer = Layer(data=label_data, name=name_i, kind=kind) + layer.resize( + shape=shape, + smooth=config["smooth"], + progress_callback=progress_callback, + ) + layer.affine = affine + layers.append(layer) + + if kind == "color": + if np.issubdtype(np.uint8, data.dtype): + data = np.multiply(data, 1.0 / 256, dtype=np.float32) + elif data.dtype.kind in ["u", "i"]: + data = data.astype(np.float32) + min_val = data.min() + max_val = data.max() + if max_val != min_val: + data = (data - min_val) / (max_val - min_val) + else: + data = np.zeros_like(data, dtype=np.float32) + else: + data = data.astype(np.float32) + + name = config["layer_name"] or "Color" + if data.shape[4] == 1: + data = np.repeat(data, repeats=3, axis=4) + elif data.shape[4] == 2: + d_shape = list(data.shape) + d_shape = d_shape[:4] + [1] + zore = np.zeros(tuple(d_shape), dtype=np.float32) + data = np.concatenate((data, zore), axis=-1) + elif data.shape[4] > 3: + data = data[:, :, :, :, :3] + + check_cancel(cancel_path) + write_json(progress_path, {"factor": 0.2, "text": f"Processing {name}..."}) + progress_callback = progress_callback_factory(progress_path, cancel_path, name, 0.2, 0.7) + layer = Layer(data=data, name=name, kind=kind) + layer.resize(shape=shape, progress_callback=progress_callback) + layer.affine = affine + layers.append(layer) + + elif kind == "scalar": + name = config["layer_name"] or "Scalar" + + if config["remap"]: + data = data.astype(np.float32) + min_val = data.min() + max_val = data.max() + if max_val != min_val: + data = (data - min_val) / (max_val - min_val) + else: + data = np.zeros_like(data, dtype=np.float32) + + if config["split_channel"]: + progress_step = 0.7 / config["channel_count"] + + for i in range(config["channel_count"]): + check_cancel(cancel_path) + name_i = f"{name}_{i+1}" + progress = 0.2 + i * progress_step + write_json(progress_path, {"factor": progress, "text": f"Processing {name_i}..."}) + progress_callback = progress_callback_factory( + progress_path, cancel_path, name_i, progress, progress_step + ) + layer = Layer(data=data[:, :, :, :, i : i + 1], name=name_i, kind=kind) + layer.resize(shape=shape, progress_callback=progress_callback) + layer.affine = affine + layers.append(layer) + else: + check_cancel(cancel_path) + write_json(progress_path, {"factor": 0.2, "text": f"Processing {name}..."}) + progress_callback = progress_callback_factory(progress_path, cancel_path, name, 0.2, 0.7) + layer = Layer(data=data, name=name, kind=kind) + layer.resize(shape=shape, progress_callback=progress_callback) + layer.affine = affine + layers.append(layer) + + check_cancel(cancel_path) + write_json(progress_path, {"factor": 0.9, "text": "Creating Layers..."}) + cache_infos = save_layers_to_cache(layers, config["cache_dir"]) + return {"cache_infos": cache_infos, "added_ids": [item["id"] for item in cache_infos]} + + +def main(): + config_path = Path(sys.argv[-1]) + config = json.loads(config_path.read_text(encoding="utf-8")) + progress_path = Path(config["progress_path"]) + result_path = Path(config["result_path"]) + cancel_path = Path(config["cancel_path"]) + + try: + if config["command"] == "read_meta": + result = read_meta(config, progress_path, cancel_path) + elif config["command"] == "import_layers": + result = build_layers(config, progress_path, cancel_path) + else: + raise ValueError(f"Unknown command: {config['command']}") + + write_json(result_path, {"ok": True, **result}) + write_json(progress_path, {"factor": 1.0, "text": ""}) + except KeyboardInterrupt: + write_json(result_path, {"ok": False, "cancelled": True}) + except Exception as e: + write_json( + result_path, + { + "ok": False, + "error": str(e), + "traceback": traceback.format_exc(), + }, + ) + + +if __name__ == "__main__": + main() diff --git a/src/bioxelnodes/operators/misc.py b/src/bioxelnodes/operators/misc.py index ea0efbe..a61541e 100644 --- a/src/bioxelnodes/operators/misc.py +++ b/src/bioxelnodes/operators/misc.py @@ -5,6 +5,7 @@ import bpy from pathlib import Path import shutil +from ..asset_library import add_bioxel_asset_library from ..constants import LATEST_NODE_LIB_PATH from ..utils import ( get_all_layer_objs, @@ -120,6 +121,27 @@ class Help(bpy.types.Operator): return {"FINISHED"} +class AddAssetLibrary(bpy.types.Operator): + bl_idname = "bioxel.add_asset_library" + bl_label = "Add Nodes Library" + bl_description = "Add the bundled O Bioxel asset library" + + def execute(self, context): + try: + add_bioxel_asset_library() + except FileNotFoundError as e: + self.report({"ERROR"}, str(e)) + return {"CANCELLED"} + + for window in context.window_manager.windows: + for area in window.screen.areas: + if area.type == "NODE_EDITOR": + area.tag_redraw() + + self.report({"INFO"}, "O Bioxel asset library is ready.") + return {"FINISHED"} + + # 定义虚无化切换操作 class TogglePhantom(bpy.types.Operator): """Toggle object phantom state (ray invisible, no shadows, semi-transparent wireframe)""" diff --git a/src/bioxelnodes/panels.py b/src/bioxelnodes/panels.py index eee3013..dd8308b 100644 --- a/src/bioxelnodes/panels.py +++ b/src/bioxelnodes/panels.py @@ -1,11 +1,12 @@ from pathlib import Path import bpy +from .asset_library import has_bioxel_asset_library from .node import get_layer_nodes, get_main_node_group from .utils import load_icon from .layer import get_layer_caches from .operators.io import ImportAsColor, ImportAsLabel, ImportAsScalar, ImportData -from .operators.misc import Help, RenderSettingPreset +from .operators.misc import AddAssetLibrary, Help, RenderSettingPreset from .operators.layer import ( AddLayerNode, DeleteLayer, @@ -54,22 +55,38 @@ class BioxelPanelBase: bl_region_type = "UI" bl_context = "geometry_node" bl_category = "Bioxel Nodes" + requires_asset_library = True # try to make Bioxel panels order early (may be respected by Blender) @classmethod def poll(cls, context): node_group = get_main_node_group(context) - return node_group is not None + if node_group is None: + return False + + if not getattr(cls, "requires_asset_library", True): + return True + + return has_bioxel_asset_library() class HeaderPanel(bpy.types.Panel, BioxelPanelBase): bl_label = "Bioxel Nodes" bl_idname = "BIOXEL_PT_header_panel" bl_order = 0 + requires_asset_library = False def draw(self, context): layout = self.layout + if not has_bioxel_asset_library(): + layout.operator( + AddAssetLibrary.bl_idname, + text="Add Nodes Library", + icon="ASSET_MANAGER", + ) + return + layout.operator( Help.bl_idname, text="Help", icon=Help.bl_icon # 复用原操作的图标定义 ) diff --git a/uv.lock b/uv.lock index 6bfea67..b70be8f 100644 --- a/uv.lock +++ b/uv.lock @@ -25,13 +25,14 @@ wheels = [ [[package]] name = "bioxelnodes" -version = "1.0.9" +version = "2.0.0" source = { editable = "." } dependencies = [ { name = "h5py" }, { name = "matplotlib" }, { name = "mrcfile" }, { name = "pyometiff" }, + { name = "scipy" }, { name = "simpleitk" }, { name = "transforms3d" }, ] @@ -59,6 +60,7 @@ requires-dist = [ { name = "matplotlib", specifier = "==3.10.7" }, { name = "mrcfile", specifier = "==1.5.1" }, { name = "pyometiff", specifier = "==1.0.0" }, + { name = "scipy", specifier = "==1.17.1" }, { name = "simpleitk", specifier = "==2.3.1" }, { name = "transforms3d", specifier = "==0.4.2" }, ] @@ -945,6 +947,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, ] +[[package]] +name = "scipy" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675, upload-time = "2026-02-23T00:16:00.13Z" }, + { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" }, + { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" }, + { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" }, + { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" }, + { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" }, +] + [[package]] name = "setuptools" version = "72.1.0"