              eroded = func(eroded, kernel, iterations=1, anchor=anchor)
  
          return eroded[..., None]
  
      def _get_erosion_kernels(self, mask: np.ndarray) -> List[np.ndarray]:
          """ Get the erosion kernels for each of the center, left, top right and bottom erosions.
  
          An approximation is made based on the number of positive pixels within the mask to create
          an ellipse to act as kernel.
  
 
</s> remove     def _binning_linear_threshold(self, units: str = "", multiplier: int = 1) -> List[List[str]]:
 </s> add     def _binning_linear_threshold(self, units: str = "", multiplier: int = 1) -> list[list[str]]: </s> remove     def binning(self) -> List[List[str]]:
 </s> add     def binning(self) -> list[list[str]]: </s> remove     def _get_segment_indices(self) -> T.List[int]:
 </s> add     def _get_segment_indices(self) -> list[int]: </s> remove     def _generate_spatial_filters(self) -> Tuple[tf.Tensor, int]:
 </s> add     def _generate_spatial_filters(self) -> tuple[tf.Tensor, int]: </s> remove                        viewer: T.Optional[T.Callable[[np.ndarray, str], None]],
                       timelapse_kwargs: T.Optional[T.Dict[Literal["input_a",
                                                                   "input_b",
                                                                   "output"], str]]) -> None:
 </s> add                        viewer: Callable[[np.ndarray, str], None] | None,
                       timelapse_kwargs: dict[T.Literal["input_a", "input_b", "output"],
                                              str] | None) -> None:
    def _get_erosion_kernels(self, mask: np.ndarray) -> list[np.ndarray]:
              eroded = func(eroded, kernel, iterations=1, anchor=anchor)
  
          return eroded[..., None]
  
    def _get_erosion_kernels(self, mask: np.ndarray) -> list[np.ndarray]:
          """ Get the erosion kernels for each of the center, left, top right and bottom erosions.
  
          An approximation is made based on the number of positive pixels within the mask to create
          an ellipse to act as kernel.
  
keep keep keep keep replace keep keep keep keep keep
 Rebase code (#1326)

* Remove tensorflow_probability requirement

* setup.py - fix progress bars

* requirements.txt: Remove pre python 3.9 packages

* update apple requirements.txt

* update INSTALL.md

* Remove python<3.9 code

* setup.py - fix Windows Installer

* typing: python3.9 compliant

* Update pytest and readthedocs python versions

* typing fixes

* Python Version updates
  - Reduce max version to 3.10
  - Default to 3.10 in installers
  - Remove incompatible 3.11 tests

* Update dependencies

* Downgrade imageio dep for Windows

* typing: merge optional unions and fixes

* Updates
  - min python version 3.10
  - typing to python 3.10 spec
  - remove pre-tf2.10 code
  - Add conda tests

* train: re-enable optimizer saving

* Update dockerfiles

* Update setup.py
  - Apple Conda deps to setup.py
  - Better Cuda + dependency handling

* bugfix: Patch logging to prevent Autograph errors

* Update dockerfiles

* Setup.py - Setup.py - stdout to utf-8

* Add more OSes to github Actions

* suppress mac-os end to end test 
plugins/convert/mask/mask_blend.py