From 0df4c97a9a67fe2caab060db3ab96eab94cea460 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Wed, 24 Sep 2025 00:33:09 +0200 Subject: [PATCH 01/14] now respecting uns color --- src/spatialdata_plot/pl/utils.py | 191 ++++++++++++++++++++++++++++--- 1 file changed, 178 insertions(+), 13 deletions(-) diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index 1368110d..bc93661c 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -760,7 +760,6 @@ def _set_color_source_vec( )[value_to_plot] # numerical case, return early - # TODO temporary split until refactor is complete if color_source_vector is not None and not isinstance(color_source_vector.dtype, pd.CategoricalDtype): if ( not isinstance(element, GeoDataFrame) @@ -777,18 +776,50 @@ def _set_color_source_vec( color_source_vector = pd.Categorical(color_source_vector) # convert, e.g., `pd.Series` - # TODO check why table_name is not passed here. - color_mapping = _get_categorical_color_mapping( - adata=sdata["table"], - cluster_key=value_to_plot, - color_source_vector=color_source_vector, - cmap_params=cmap_params, - alpha=alpha, - groups=groups, - palette=palette, - na_color=na_color, - render_type=render_type, - ) + # Use the provided table_name parameter, fall back to only one present + if table_name is not None: + table_to_use = table_name + else: + table_to_use = list(sdata.tables.keys())[0] + logger.warning(f"No table name provided, using '{table_to_use}' as fallback for color mapping.") + + # Check if custom colors exist in the table's .uns slot + if _has_colors_in_uns(sdata, table_name, value_to_plot): + # Extract colors directly from the table's .uns slot + color_mapping = _extract_colors_from_table_uns( + sdata=sdata, + table_name=table_name, + col_to_colorby=value_to_plot, + color_source_vector=color_source_vector, + na_color=na_color, + ) + if color_mapping is None: + logger.warning(f"Failed to extract colors for '{value_to_plot}', falling back to default mapping.") + # Fall back to the existing method if extraction fails + color_mapping = _get_categorical_color_mapping( + adata=sdata[table_to_use], + cluster_key=value_to_plot, + color_source_vector=color_source_vector, + cmap_params=cmap_params, + alpha=alpha, + groups=groups, + palette=palette, + na_color=na_color, + render_type=render_type, + ) + else: + # Use the existing color mapping method + color_mapping = _get_categorical_color_mapping( + adata=sdata[table_to_use], + cluster_key=value_to_plot, + color_source_vector=color_source_vector, + cmap_params=cmap_params, + alpha=alpha, + groups=groups, + palette=palette, + na_color=na_color, + render_type=render_type, + ) color_source_vector = color_source_vector.set_categories(color_mapping.keys()) if color_mapping is None: @@ -897,6 +928,140 @@ def _generate_base_categorial_color_mapping( return _get_default_categorial_color_mapping(color_source_vector=color_source_vector, cmap_params=cmap_params) +def _has_colors_in_uns( + sdata: sd.SpatialData, + table_name: str | None, + col_to_colorby: str, +) -> bool: + """ + Check if _colors exists in the specified table's .uns slot. + + Parameters + ---------- + sdata + SpatialData object containing tables + table_name + Name of the table to check. If None, uses the first available table. + col_to_colorby + Name of the categorical column (e.g., "celltype") + + Returns + ------- + True if _colors exists in the table's .uns, False otherwise + """ + # Determine which table to use + if table_name is not None: + if table_name not in sdata.tables: + return False + table_to_use = table_name + else: + if len(sdata.tables) == 0: + return False + table_to_use = list(sdata.tables.keys())[0] + + adata = sdata.tables[table_to_use] + color_key = f"{col_to_colorby}_colors" + + return color_key in adata.uns + + +def _extract_colors_from_table_uns( + sdata: sd.SpatialData, + table_name: str | None, + col_to_colorby: str, + color_source_vector: ArrayLike | pd.Series[CategoricalDtype], + na_color: ColorLike, +) -> Mapping[str, str] | None: + """ + Extract categorical colors from the _colors pattern in adata.uns. + + This function looks for colors stored in the format _colors in the + specified table's .uns slot and creates a mapping from categories to colors. + + Parameters + ---------- + sdata + SpatialData object containing tables + table_name + Name of the table to look in. If None, uses the first available table. + col_to_colorby + Name of the categorical column (e.g., "celltype") + color_source_vector + Categorical vector containing the categories to map + na_color + Color to use for NaN/missing values + + Returns + ------- + Mapping from category names to hex colors, or None if colors not found + """ + # Determine which table to use + if table_name is not None: + if table_name not in sdata.tables: + logger.warning(f"Table '{table_name}' not found in sdata. Available tables: {list(sdata.tables.keys())}") + return None + table_to_use = table_name + else: + if len(sdata.tables) == 0: + logger.warning("No tables found in sdata.") + return None + table_to_use = list(sdata.tables.keys())[0] + logger.info(f"No table name provided, using '{table_to_use}' for color extraction.") + + adata = sdata.tables[table_to_use] + color_key = f"{col_to_colorby}_colors" + + # Check if the color pattern exists + if color_key not in adata.uns: + logger.debug(f"Color key '{color_key}' not found in table '{table_to_use}' uns.") + return None + + # Extract colors and categories + stored_colors = adata.uns[color_key] + categories = color_source_vector.categories.tolist() + + # Validate na_color format + if "#" not in str(na_color): + logger.warning("Expected `na_color` to be a hex color, converting...") + na_color = to_hex(to_rgba(na_color)[:3]) + + # Strip alpha channel from na_color if present + if len(str(na_color)) == 9: # #rrggbbaa format + na_color = str(na_color)[:7] # Keep only #rrggbb + + # Convert stored colors to hex format (without alpha channel) + try: + hex_colors = [] + for color in stored_colors: + rgba = to_rgba(color)[:3] # Take only RGB, drop alpha + hex_color = to_hex(rgba) + # Ensure we strip alpha channel if present + if len(hex_color) == 9: # #rrggbbaa format + hex_color = hex_color[:7] # Keep only #rrggbb + hex_colors.append(hex_color) + except Exception as e: + logger.warning(f"Error converting colors to hex format: {e}") + return None + + # Create the mapping + color_mapping = {} + + # Map categories to colors + for i, category in enumerate(categories): + if i < len(hex_colors): + color_mapping[category] = hex_colors[i] + else: + # Not enough colors provided, use na_color for extra categories + logger.warning(f"Not enough colors provided for category '{category}', using na_color.") + color_mapping[category] = na_color + + # Add NaN category + color_mapping["NaN"] = na_color + + logger.info(f"Successfully extracted {len(hex_colors)} colors from '{color_key}' in table '{table_to_use}'.") + return color_mapping + + def _modify_categorical_color_mapping( mapping: Mapping[str, str], groups: list[str] | str | None = None, From 42a63f8c95004a21fc13a2231ff88e7e2fc6e06a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 22:36:14 +0000 Subject: [PATCH 02/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/spatialdata_plot/pl/utils.py | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index bc93661c..12ad6222 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -782,7 +782,7 @@ def _set_color_source_vec( else: table_to_use = list(sdata.tables.keys())[0] logger.warning(f"No table name provided, using '{table_to_use}' as fallback for color mapping.") - + # Check if custom colors exist in the table's .uns slot if _has_colors_in_uns(sdata, table_name, value_to_plot): # Extract colors directly from the table's .uns slot @@ -935,7 +935,7 @@ def _has_colors_in_uns( ) -> bool: """ Check if _colors exists in the specified table's .uns slot. - + Parameters ---------- sdata @@ -944,7 +944,7 @@ def _has_colors_in_uns( Name of the table to check. If None, uses the first available table. col_to_colorby Name of the categorical column (e.g., "celltype") - + Returns ------- True if _colors exists in the table's .uns, False otherwise @@ -958,10 +958,10 @@ def _has_colors_in_uns( if len(sdata.tables) == 0: return False table_to_use = list(sdata.tables.keys())[0] - + adata = sdata.tables[table_to_use] color_key = f"{col_to_colorby}_colors" - + return color_key in adata.uns @@ -974,10 +974,10 @@ def _extract_colors_from_table_uns( ) -> Mapping[str, str] | None: """ Extract categorical colors from the _colors pattern in adata.uns. - + This function looks for colors stored in the format _colors in the specified table's .uns slot and creates a mapping from categories to colors. - + Parameters ---------- sdata @@ -990,7 +990,7 @@ def _extract_colors_from_table_uns( Categorical vector containing the categories to map na_color Color to use for NaN/missing values - + Returns ------- Mapping from category names to hex colors, or None if colors not found @@ -1007,28 +1007,28 @@ def _extract_colors_from_table_uns( return None table_to_use = list(sdata.tables.keys())[0] logger.info(f"No table name provided, using '{table_to_use}' for color extraction.") - + adata = sdata.tables[table_to_use] color_key = f"{col_to_colorby}_colors" - + # Check if the color pattern exists if color_key not in adata.uns: logger.debug(f"Color key '{color_key}' not found in table '{table_to_use}' uns.") return None - + # Extract colors and categories stored_colors = adata.uns[color_key] categories = color_source_vector.categories.tolist() - + # Validate na_color format if "#" not in str(na_color): logger.warning("Expected `na_color` to be a hex color, converting...") na_color = to_hex(to_rgba(na_color)[:3]) - + # Strip alpha channel from na_color if present if len(str(na_color)) == 9: # #rrggbbaa format na_color = str(na_color)[:7] # Keep only #rrggbb - + # Convert stored colors to hex format (without alpha channel) try: hex_colors = [] @@ -1042,10 +1042,10 @@ def _extract_colors_from_table_uns( except Exception as e: logger.warning(f"Error converting colors to hex format: {e}") return None - + # Create the mapping color_mapping = {} - + # Map categories to colors for i, category in enumerate(categories): if i < len(hex_colors): @@ -1054,10 +1054,10 @@ def _extract_colors_from_table_uns( # Not enough colors provided, use na_color for extra categories logger.warning(f"Not enough colors provided for category '{category}', using na_color.") color_mapping[category] = na_color - + # Add NaN category color_mapping["NaN"] = na_color - + logger.info(f"Successfully extracted {len(hex_colors)} colors from '{color_key}' in table '{table_to_use}'.") return color_mapping From 4603fddd7bdd3f71b0545f12d40dba4b44504114 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Wed, 24 Sep 2025 00:45:31 +0200 Subject: [PATCH 03/14] added tests --- tests/pl/test_render_labels.py | 25 +++++++++++++++++++++++++ tests/pl/test_render_shapes.py | 27 ++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/tests/pl/test_render_labels.py b/tests/pl/test_render_labels.py index 8184de0a..5cca1663 100644 --- a/tests/pl/test_render_labels.py +++ b/tests/pl/test_render_labels.py @@ -298,6 +298,31 @@ def test_plot_can_handle_dropping_small_labels_after_rasterize_categorical(self, sdata_blobs.pl.render_labels("blobs_labels_large", color="category", table_name="table").pl.show() + def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): + + labels_name = "blobs_labels" + instances = get_element_instances(sdata_blobs[labels_name]) + n_obs = len(instances) + adata = AnnData( + get_standard_RNG().normal(size=(n_obs, 10)), + obs=pd.DataFrame(get_standard_RNG().normal(size=(n_obs, 3)), columns=["a", "b", "c"]), + ) + adata.obs["instance_id"] = instances.values + adata.obs["category"] = get_standard_RNG().choice(["a", "b", "c"], size=adata.n_obs) + adata.obs["category"][:3] = ["a", "b", "c"] + adata.obs["region"] = labels_name + table = TableModel.parse( + adata=adata, + region_key="region", + instance_key="instance_id", + region=labels_name, + ) + sdata_blobs["other_table"] = table + sdata_blobs["other_table"].obs["category"] = sdata_blobs["other_table"].obs["category"].astype("category") + sdata_blobs["other_table"].uns["category_colors"] = ["#800080", "#008000", "#FFFF00"] #purple, green ,yellow + + sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show() + def test_warns_when_table_does_not_annotate_element(sdata_blobs: SpatialData): # Work on an independent copy since we mutate tables diff --git a/tests/pl/test_render_shapes.py b/tests/pl/test_render_shapes.py index 5b890b1d..cf5c6c13 100644 --- a/tests/pl/test_render_shapes.py +++ b/tests/pl/test_render_shapes.py @@ -11,7 +11,7 @@ from anndata import AnnData from matplotlib.colors import Normalize from shapely.geometry import MultiPolygon, Point, Polygon -from spatialdata import SpatialData, deepcopy +from spatialdata import SpatialData, deepcopy, get_element_instances from spatialdata.models import ShapesModel, TableModel from spatialdata.transformations import Affine, Identity, MapAxis, Scale, Sequence, Translation from spatialdata.transformations._utils import _set_transformations @@ -583,3 +583,28 @@ def test_warns_when_table_does_not_annotate_element(sdata_blobs: SpatialData): table_name="other_table", ).pl.show() ) + + def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): + + labels_name = "blobs_labels" + instances = get_element_instances(sdata_blobs[labels_name]) + n_obs = len(instances) + adata = AnnData( + get_standard_RNG().normal(size=(n_obs, 10)), + obs=pd.DataFrame(get_standard_RNG().normal(size=(n_obs, 3)), columns=["a", "b", "c"]), + ) + adata.obs["instance_id"] = instances.values + adata.obs["category"] = get_standard_RNG().choice(["a", "b", "c"], size=adata.n_obs) + adata.obs["category"][:3] = ["a", "b", "c"] + adata.obs["region"] = labels_name + table = TableModel.parse( + adata=adata, + region_key="region", + instance_key="instance_id", + region=labels_name, + ) + sdata_blobs["other_table"] = table + sdata_blobs["other_table"].obs["category"] = sdata_blobs["other_table"].obs["category"].astype("category") + sdata_blobs["other_table"].uns["category_colors"] = ["#800080", "#008000", "#FFFF00"] #purple, green ,yellow + + sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show() \ No newline at end of file From 5333d457e6e06ca48964fdab5becad7111197ee2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 22:46:05 +0000 Subject: [PATCH 04/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/pl/test_render_labels.py | 3 +-- tests/pl/test_render_shapes.py | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/pl/test_render_labels.py b/tests/pl/test_render_labels.py index 5cca1663..363f43c4 100644 --- a/tests/pl/test_render_labels.py +++ b/tests/pl/test_render_labels.py @@ -299,7 +299,6 @@ def test_plot_can_handle_dropping_small_labels_after_rasterize_categorical(self, sdata_blobs.pl.render_labels("blobs_labels_large", color="category", table_name="table").pl.show() def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): - labels_name = "blobs_labels" instances = get_element_instances(sdata_blobs[labels_name]) n_obs = len(instances) @@ -319,7 +318,7 @@ def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): ) sdata_blobs["other_table"] = table sdata_blobs["other_table"].obs["category"] = sdata_blobs["other_table"].obs["category"].astype("category") - sdata_blobs["other_table"].uns["category_colors"] = ["#800080", "#008000", "#FFFF00"] #purple, green ,yellow + sdata_blobs["other_table"].uns["category_colors"] = ["#800080", "#008000", "#FFFF00"] # purple, green ,yellow sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show() diff --git a/tests/pl/test_render_shapes.py b/tests/pl/test_render_shapes.py index cf5c6c13..9a1f8004 100644 --- a/tests/pl/test_render_shapes.py +++ b/tests/pl/test_render_shapes.py @@ -585,7 +585,6 @@ def test_warns_when_table_does_not_annotate_element(sdata_blobs: SpatialData): ) def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): - labels_name = "blobs_labels" instances = get_element_instances(sdata_blobs[labels_name]) n_obs = len(instances) @@ -605,6 +604,6 @@ def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): ) sdata_blobs["other_table"] = table sdata_blobs["other_table"].obs["category"] = sdata_blobs["other_table"].obs["category"].astype("category") - sdata_blobs["other_table"].uns["category_colors"] = ["#800080", "#008000", "#FFFF00"] #purple, green ,yellow + sdata_blobs["other_table"].uns["category_colors"] = ["#800080", "#008000", "#FFFF00"] # purple, green ,yellow - sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show() \ No newline at end of file + sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show() From 5d7790fc1bcd5d86cd9c878d3bdb32d011cb898a Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Wed, 24 Sep 2025 03:13:02 +0200 Subject: [PATCH 05/14] updated behaviour --- src/spatialdata_plot/pl/basic.py | 16 +++--- src/spatialdata_plot/pl/utils.py | 5 +- ...Labels_respects_custom_colors_from_uns.png | Bin 0 -> 32296 bytes tests/pl/test_render_shapes.py | 46 +++++++++--------- 4 files changed, 37 insertions(+), 30 deletions(-) create mode 100644 tests/_images/Labels_respects_custom_colors_from_uns.png diff --git a/src/spatialdata_plot/pl/basic.py b/src/spatialdata_plot/pl/basic.py index 546b71b1..9ffd229a 100644 --- a/src/spatialdata_plot/pl/basic.py +++ b/src/spatialdata_plot/pl/basic.py @@ -970,12 +970,16 @@ def show( assert isinstance(params_copy.color, str) colors = sc.get.obs_df(sdata[table], [params_copy.color]) if isinstance(colors[params_copy.color].dtype, pd.CategoricalDtype): - _maybe_set_colors( - source=sdata[table], - target=sdata[table], - key=params_copy.color, - palette=params_copy.palette, - ) + # Avoid mutating `.uns` by generating new colors implicitly. + # Only copy colors if they already exist in `.uns`. + color_key = f"{params_copy.color}_colors" + if color_key in sdata[table].uns: + _maybe_set_colors( + source=sdata[table], + target=sdata[table], + key=params_copy.color, + palette=params_copy.palette, + ) rasterize = (params_copy.scale is None) or ( isinstance(params_copy.scale, str) diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index 12ad6222..902b58d5 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -785,6 +785,7 @@ def _set_color_source_vec( # Check if custom colors exist in the table's .uns slot if _has_colors_in_uns(sdata, table_name, value_to_plot): + print("no") # Extract colors directly from the table's .uns slot color_mapping = _extract_colors_from_table_uns( sdata=sdata, @@ -955,12 +956,14 @@ def _has_colors_in_uns( return False table_to_use = table_name else: - if len(sdata.tables) == 0: + if len(sdata.tables.keys()) == 0: return False table_to_use = list(sdata.tables.keys())[0] adata = sdata.tables[table_to_use] color_key = f"{col_to_colorby}_colors" + print(f"color_key: {color_key}") + print(f"adata.uns: {adata.uns}") return color_key in adata.uns diff --git a/tests/_images/Labels_respects_custom_colors_from_uns.png b/tests/_images/Labels_respects_custom_colors_from_uns.png new file mode 100644 index 0000000000000000000000000000000000000000..28ff080618ef999c38cab82a44b5f360b93d3065 GIT binary patch literal 32296 zcmYIP1yCKqvc=uqT|$rqcXx+CaCdiicPBxDOSrgu@Ze5xcXxMq%d2|-Q?<2K_i}f3 zX1aU2&p92bq#%imK!5-S28JvxCH4&r3_Jn27~o)lPfnY5dw?5{i@1i1ioKbOyP=aQ zn7pBjgN?n5jinKpo2iqtrM(?16Z2Ol4hAv{7Z(R-o-bc)|L;GT?48WNl$D461)c)$ zAf@RH28N{Yae@20$54WS`Tmd=6IS)eJk4_VA-sKk&*2$LYLg_2=Zf3z)f}fvmJ7 zzaOx@T<5$OD&`3E_V=?G_CR$!pYe{Gv39jr|fA5rKe*hadgL9b+NBV~l?Pt4Yq5$M+c;V&s3ryUU;9i7YZTx|50jx_lUj?gPC=%C`B z$u(>=IFau6w|l{}wrhos`}T9k>oLwc|98L2KW9AUYGnhqaioIdJ44AsV`IC5?~kZp zihP$)Dn)XJ&v&OgdwWYGepf@ZCZ?vB|75=?>+4Tc`M+A5jb{#J^Ls}`MuKlF)EKY$ z-mmWL?oLfkb|q2Erm>hJtoz;*2g4vE96usLod!{$xj^*C5`yG1xuz@^_1~^=p_NGd zUmV4iv38%=-#b_gy1<^Fp3gh=nKQ;@q@^Q$7fVz?Sjj_$3>wv49SmQ-C`Lv{tBhxI z8|&YVajt&~xH|WL*RB)5i59oCvr~JzKd<6@*a*Jc1t!{wEyV5nf+#z= zS)*0q158@Sb@sc$NLBltR@Jia<8G>47SGSoQMu>ZlM|aFg{E*?T!+y<1ztQvB44AUCgaiysa9~;*-rf27#M|rhvV$9h@C^l&*yJX+^BxjT zbm-aYA6`a9MMcRZzV$6^Y;0iNS{NsWhx7CEdn`32B*L^?fFTuf1dxl*%09MmX-P}Z z>yWzR9aeR8XD4QD zey8efJ?`fKFYe)Dyz2k{nkGk6q?j}Q=e%Qt_q^@z&EYh#(<|=lz6z!)Dk|yB#xSHl z7vS%&=l(5wzpM|YL8zSTKCED=I!^FORG01NzVQx%6&dyHA^9*#5nWHb(Ga0d}3QZW6HseLv__mi~A_ z2!jeo#0;|p{j)8ni>3-BQP=#QZHGrjG^-83fB*h1z^e^Cr6?zdBpFAv33zgTTU%y* zJsS`*`trr2fqgpF{#`o z&COf_PX`5em0?1YzYkcL%1uX7m~EHXK;VYXd!yv!ahC;i1bmn1#6yK3p;z*IT#uYU;yhXHnF<)hD^np9^uOjuZPP1vd4{8$@!?o3 zgfF*qvr}5~tt;dbRMph}Ei5b)`MN;2#sm}sZlI}o*w~hzALRG?)WWC_EDj!c_Azb+sHPSjI`kpN14f5CUtRHTn3{7nIRogueF{ zUJ3_??1y=jyly833)P0*s>&O|)5{8Vm!Yu=BUo52Bm~=;yv|&Y@yX+e)M>A&i+J0y z;6$EZE_l0~*I3>Y14zMen=HTZd*2}m>+%Td_J^`tOp-Nqpp?xH1Hpo~*F+)}Mpp{?$;_??4KZ3m#W+8jYXQj1ablkqT~0tTdrBxPiK5QK*nCDGF#GWV&4u%99>eBOcJc1Bcap)0in{WAb~*$ntDgl zAfW@6tOKwQ1MiE%KGj9;}P+ z<8MG%%GrA|n-grxzJh#%7W8Nj!@wG~k-gir4(LSFF>i(93#b;LkWH--;vq<(LG%_} ziKejrgGEGWGXI8VVOeh)x@vz~RMJXE;d&QVMXN2mlVFN3n;dGaPi#D9Z0!>jUX=?s zU`>cgxLs53PBk-rUL$Ph&AK6QT20pGLWfvL>3A|?%%*1P9%kKAMU-=8`|f&RQE6@V z7m+aSX}M&xLByrF(|FOD*mi_CGQ^ZhDbX~&mDLriT}5m+QN~JP9&D}ZCkVy4!n9@E znYp*&w=^@@JUB17f1QarBqszV`o!NvNuO=y2!@f&Mc01MgcL}vt-J=J8Pcam%6;xX z_cjOgM?yAQ46Cp%O{CK*f42z&*)Ns?MZ_oq8ir(MFFyH^ri-LyO9j!YZ4nk`$)oKl7q*9JifO5A>0+}7B_XbT?~;Wp!SbdDzm9I6 z)~j{)89yZHnR^we*uP|b9H;ge$z5Dw92*7bk5AWxa=s5 zduX&CRODE6fb?f=L3}lx=hxA%NogLrNE)x0BjI=YXUt_rwHx0Myo~7D#=?}-DqE0^ zdiu22{2)JJNL_Qh_RvxqfQN*GH_C%nCj`LrSdt9#|%w}GxC-soU}^=Ck| zKUTC6=-%)Q4n8qX4m9o3_UPE006SK$JBfl#un>lm`jIrp8G8o#M@3C_Z|ZmMYzcfI zCrMCTV1YyCnj3+&ahdEt_7#qV<1_Yxz_4Xm>-OJMJ)BiOe;=T?6OjVhF5V)-W8c9s z(bc4G$O`#n5^peqD+x_<9EOt5m$WGjk9!;K>FM**orKXGfw11zoH-j`vDZ6Kd!qcE zgYVYY^O$h@GbnUhKxc$U!uaRe=ih*lgKchcH2oCZ0#^#N3Wdvu2G%@g48gH?omNI$ zbKvS0yTaKGjt6H>f}SvEJ))ue=x%aj;sIHkyW+lbSLc$=VHO#mqq8l&h`?X>cSA7* z#-PerKiCLjPb6BxCy9TuNa>tVqUGJTU8%?wVZFE>U@PGp#NI(}k$=)cgTUCO+NWkc%#-fz z?SFV-e#SiZcUe__jtK)6(I%1mVhB8;p(0kO9Cls+!++8#qm|^Z9x6Uc70(F>yLPN< zo0k&ORoI3W4pu}cpGZ1MieAe2UlmQ_0_BvYZf;&mBY5buz!GhF0*ct|)Mwh`zbce= zf3>efE5H!vS+eg=75x#=0)2! ziQ(DvQjXLf{Zh&_cb!HE{egtRUEn-Ok|;mqPL0*BEjH`8FRbo|jFz0|Vag09x`&Jo z`J7Lrl0QWEy@NjcO1r^yC0x*#bnT8(+Z5!jm4QWi3_TTxmf$9oVp<-n21G^$mG79a zDWpP;jg2UdmX14$Bedo^C`Bg8+K^xHfuMILJQu+r(?M@ILa$xT(F~%y#96n;Oe{Cl zq@ex&W7^mT_2zxX_~$BRHQ%NsLjtIVsB*++M7M7!!<)WZ!3(|_-1RJ8h!J5u7~WJ< zqOrKMWbc=mf-S%JS%?l*L5N90uc%4{u!)8y(Q=njMt8pT@q1xrWB9OT3g2tCZ;4O5 zoNahT;+4K&n>7w!DP7>*j|dg@bd z@T(27`MKEOlFDN*?S~LtMJT7$$wt+VmefcF)vJ%Sa6cpf9Kh@?xM3Q%Wyw@SRf$ct z49;&0o>6N|-=?!hmIOTp?w#sJ$KTJOE*L11#I)YoyyQ>%HYZSdRn@(7D%sRHoD3ep zVb-}c_3?$GSl>!|><%Wo1ufrZ8$8 z2wzF3z>cek%?^E*chC8*R&nF(JyCP!ek?_rps;xxT8Ld3=`AP~67Ue2|LMffm{UsW zMghHXUGAG52EW98?)}Uf-gbOd0~iOpdir}mBpWYgDRtC<0}T^b)H&-8byE9A4p^O1MYZIWk=G#wG~$Kw1d;;p zYR5|nAkFp04i;j7wNHuEzX!pzU^?@!m7U=Q!gm=MpjP*pzGCH~CPXBAXqdRQbp(r+ zp<2E*^0hb+9k$)j*RQng_U-;4{R}#2rvS}ry%KG#j_qi5 zoY@f5a%5gugr+6Q7v4$#1`e}5zxMvCXp1$JKq~3No!<_J)2ZLQi&9=m&+j!FJMy#Z zp0z-b7c^Aay_5;h)96`+1^43ZuRI_%su@cg+WNLO$`O`<4xT+_zP8yZnzY9CAbGL= zFL;Vi8!qG&;DB8!V)gOMM{qJ<-ra1EjqRY5szp#qV~u{!wMpGSX^$IlEDv8RA3&qE z3yl+z(?O#1q>Fi7)QC5=sm!YKe{Yy}syHT1dY%rg5Tldpzp;TYEO!cjJ~v9kGqu}mZsp4AC+HA zPoRn{N7pR8lb_WgjeAxR28Tze`hxVV;&V9u4K(Sle|x*%WM$h}dmO8)@r!|E1R)b0 z0s|~gkf}mR!r$LRD<$yQtuikKY*5Lw{NJ{p{1A;3?Otn3na|Yw@LP|~dCWmqngJAr zv;WcLl(A}jwKgf(ET}ZA9Cd!Z$eNh{)t$fUpYCs;+Z*-GN!Yb=emkX;}INST7;^>_Oaq=^w9j< zYab0o?!_STZ`0A z2UP4>e3|#=HdYJ;XC$HBSc^1$)@*4b!P!l4Y|zl6G2JBN^cSe)WWpOmf+zHR-;QDK zurIfsAkVlPLHe;BCJA^RvqA`FI0g+G+-*-^#~Q{=^b_Qr&P{G4eA9H0VFS$_bL#T& z9|#^`*yXM{y0F5w5s4xvB4{h@3HDJk5!YYo4)MO43-$K>_47eSpNbN3!NTIaPbs7{ zwg|&R#2^z9f)E=C-DS-0Ym5asX$czHKeN%`L$-D!n?b@LA!V{op4$cuBztiEL-Gma z!Cd`Bkao*wIEO{&;Yxx6usYyH8rxV_rlw)_#LW|Eu zTi1fSz|uaWgP@w66v=oly=c9Nzd+9XJR=ZmU;$$#s*&1A(bT2@2@0U$367ReqIyy| zkEZLxN_np1KM*M9rE6C?$$70=v)#4n1dZmU$2>nagCz+d=%BCbfHl7j5{duShKfG+ z9yooC3=s}W6ePk=#Cz^afM0ux;5Z6k?^2sF0K<3fDd^~87vki(x>l3(LGt}_T1N9^ zGu5lKnp4Zb%fGMy)5@XBHmP%-NxYP4Lqj7_G=?gYBy2QzE4pye1M@r@tYz_L7U~fa zQ~Y)p6&>yQ_PD>;=E=(Ienv%08%`-1*Zfnv#t0f!@Z~FjB$=3-e_&xw@2~fNermUQ zFat0i3rI1?>|&#v@AYO{E=PdBxYZLAQC-L1WzDZyi}M*;usJ|a#Y;TzRvEI~_FSeO z9iI!~1%LL+VMleu8u5a1#*sn!HTe>VyEi%0q-A}>9r1VE_-fs2Ibfhpe)*wBjIBRS zMPInO(JhUK0g-*g||w3MUv(MQiRE08#x z7^EU$;ES^2@%ope#iOCku5SR4@8eFgA|9_BLsY(!vht>y*>sWo2V|IG-;s{1=Mf0N z@s}IHs77D$(ggiG+E=#vqCF4t!aa^kKp($)f1L1dz8a=qtTu!M@YyR(+^q4{&ZCi; zroO>}-@P9(_Q3e&$0<{Ri+9Q13t8pV7q7bP%_fxiZBrBXHKrpt-i0&m_iG~n0q}{Aj+}-jtiNC419R<0_3Hv=eELkn?L^hm z(&F=SIUsPHG{qmRZq~L{KRS&%me_pesPlC5`z}sGGiCOWvy*XiCnY(Pjt4S#T(wx; z-YMY4@)2wF6B$k3>7Jj*0xDnlQZtOK{f0DzWrF+3LU*;{-z5h*Ns|rcjfkAxvEu0} z3F}V{{y^oDeSg=iNfDUjY>q>&OeJ-k(ckPnfSy5+89n#U!0NQwKh+_w})*uc6LKH0?5joIn;rn&xr;X$iZ3p zs#MYM>)R3y35EmY=`&j=DHo2=BaCX< zapQ$5tq7MEMIU`sR*@zOR)v7@{6ytzsKTItw=F7#abtDJF`z z{Nnhj>GtYB2j_5@Q%fR`eci#ZmR43qlexkQBZ!EI;0tx;s9@saM@WHMy99)U+%5+R z`UBV4rPj~(-lX%4ahc5AB=@w^7)ipu)b}#|nKq67ae9|v`$X#9Nx?j!mfqx$yznpR zK7yqIZZIcjC6rA6pff!f+u^c1S*lM@m) zRGHYnyNWLiKlZ59|3n6n>PFw9cgQuJhC+KZ#Xctlcm{Nw&RSv;1~2TvS=A24#ZyW5 zx<(r>+=nfOQqge0TznbI7u>Cvi2P$`u21{7lG9zejX?^X86OWgH;x|Aqz4YXC8Af< z3?&9@VR63b*_?j?FSakH-B*~H3!&$cmK67a#^zn&edFaA>zYYXuU-f-mfVoEw=)}v z>uQ?bvm#Tvk40g(8u1l~ii>jz6kEICV?f4XK<=nu@NE;wT@UG0RqA%v?nJZ-$ZuGb z8AqMv$+8m|Yth{o0Wf<=Vl5#X95GYV-_ut|M^*rb0idjRPHJU8fBhn$rSCQCUKr-C zHRy)GVbCym&jh?E`JL-%BAoF(TTt??jn%JN-u%x9Ag(ymsH6H1Z?L9%A_+q_e; zb%Zv&4G!agM;C|fRr*?nI_pEGD0Lj~+Y9J_k!Mi@3a*40a*tzJ|6m{7bAU9^=5ZQl z*zJd*W#hs#87)7Tw3u#aBFbyU-RUxJ!IZ`MarNfXzTtD#_i+ohe;`HD&iF%lKAVT5 z=YwW8w9Ms!#FBtN22H5G%Fv8xH2=E&IRt=kM9zsqUa3vAvF@|g=+x2UuiJF}iG#)G z`QF~L_=dRn1LZnI&ERT3Wdi`KV*%5Jhb@WmQ(oL3vT_?4D6g_#)8*tcIAWXDybuR0 zc7DsICjI&~{BU_RYJ^E6N5;*a4$wx^dJ@W5Yd+WVOn**TI)NhCl+IO$Bm-llH=M?; zrvp`qR5CbzA&|>}X3BY)8Z(Wa3DuQIYG0B?3Ms9??9$d+26MhUyaR)1NnrlROtsx6 z&o8TAZ1?mdEc@}<`^W44@<7_0u)5FP#G$o#@d86mVMtM`tKsVE%Annd6d)RoqO7hy z0MJ~JU1`k5gCir`H3KBZ!$0U&90!P3+?H)^*4okqUk?=-wCV?$kZ6)4B}qI(!b$zo zVq%c`WAOi$Rdozk>i+TA{i)7JvW{&(ge4sNl=hM_L}f3f{9kVsMr?9EI5_9$(A!F8-03F*@lf8aaV9 zL;df21a)gUD&bHUW*5Q?Gl`aB34YhT<$Cq@oiKgWa1JvG$un$lwb`9tGcEvJzMs5F zCGAj=C@|57^ZX&1U$QX0*Z!0KP!^dlNEIU15O8z0O6U(WJOOaxnssK64EJ4-s0*P~ zN<_zo&*XTRF;r%>EC)-%x+VgF8U|oTTnR$y5-ysgaa0iV5Zg)>=mVdsMgnSz1%HnF z`L4pVNf*yKNrL}Fc)z7#XuMdqx!Z9bBTsYS#^ESQKL0FRskDc*~~B#ht`tZ<}}3o$m$q z$LQ5^iHfvtT359q|{2Z(1yueo@qg-IX-zrWeF%Q7_lnPd%m*BwR19tSLo}h@O zE5)+n=Je5rph(EQDp1wM{u)slOTl<0lUNtjWeiRwU4%BZX}sAS|DcfS&t9E3$NRdp zrQVjG2JQ?KacC_X@_+*kZUko6*Lk6y;o)+!6ReA^k_0ckz9i-mC2|u&I|W}z+N(bB zN9`9@h4FIa(o798COKIU*`VlHFYn@CFL=Blw0M*_sCJsBad(no2R(h9nB%9y6)L8- za}gL_{=tgbt34R!z8^LiXJu#BT0`{02xofdI!mfukR-bWVytsJ(B^vGR#de zd1ce&lQoXu_;?82q8I?GoV=VXJX7Cs1n13p&6`%9(K236=84+>n|Ah53|r?|$(C17 zqJq(32g@pS{*^sXN);?N-aMX0p8pDnFW}HcxOga&sHWV#^b-vC2}>g$qJBAH!`M5A zdMv3s>9L5~5#*=K&vWosQP8`|_U6Pru1L4^7D01b{uCl4CnL|F`WK=1&p45Bur@{k z^tTZAO-*<}5=g|yPY{bKj52N~2-oJUBO^~c1tb(FBFELjK|ILKR$yUVkbNW3C4&2& zR;B`U_I>ma*FSjH#+R_go<9Y%rO|pOdQdg$QB7ig$xHg?K>a;+3!_ zxO#4xNiChfKI*pOZxTvHQaf~DRPXCn5Nv#L~{ei{VnEby6M@I|m>t`$% z509o9bea-=^%IyNo0o@(`B@2YqI4t%9zym_E5gCq^0*6s)gWLX(s4}~4v}ecIdh}> z)K-}gbO>#C?Zr0BL9RWs9<2bn*8bW?KEeVZ{zU5@nWfv`!2tY&On_gY*i*bW^Wcq~ zA%U#Kvea<1HB^;d)sume(z*JDESiI9Yp6sqDPv`E4>nTo=+|-eu$l`Gv11q)`5JjI zK!==P`JJqEBm?U=lU)M6GT^lnH!*9|7JHf3G)OJolW9`~%$9t;sf$%aC_b=ENG=-^=tx4pgdmxpX(b@V#~9RLh31CNY+l<6DAS z*GtW{G&{)c@tj`uliGx$!tC$aa&Mo4O(vF_Y zs6J0%?y()wHT?Zf}#d{Ty>sCf9GTV!K8pHWaQ%b7KfZV=WXy9 zxGOi7L2$DvQ!4u~@BW@&Ts~;oxt{%m<5K;0;AKbR#frPHA2Vct@We$N`x92ZbZhhB zYk9$K-CtL$Mvm(v_bL_!V?4+H=0Uak$8v@ z*_WfXMN{R!5{35VDLZHV_>4yIi%_H4j$GV4YUR#aRATQotLj=|idWa{X&mqj0p5r7 zr|!F3p0_4l%y84$*x9z`!#<{K;!s5EWN$Cbc~3zwEX}-wEDD0pJ`?s#2O2;`g=kl( z>TsNeWb}2gIH@9V_&z!C@^Z1S%Bf~eIpq(L01!Vb!;KxGtme_8pq z*VO_^#P82W;d&ASq(mA=jCR{hHqAvmH2?~CKP5oEl!XMKG7hHi^och5S!L84R-w6m z9LHlf^2dZf;MWZ-0cz_F#68!0iPva6GT2sgj9gyp&)Vo}qDHEB+My);M{#)5xo$;H zKKa>zE6`smDFpDIPXv_*la424#&?&bLE`{{L3WV15KIWOo*NZ0hso6Jx)*oI9d_op z8qA|-DNn~9%M_cnb+z`pn@`1C!k6WIXCZV&v@`kjkMMRUnT3LnZ;!xO9Z0S&SnJ;zNH%fDP(K>nVuxqz==r8a& zRt#(n)E6srFnQMq%A0gg9 z7P6A(SAXDoX7@SrZblrk?o7YS8%HZ3`6Z$Z#pd8DiCt_b=U@X0lM`INl_8F(uSe(G z6-biaF!LffGCN9H_;6;6lxnAddW#ZBQb_^{-2C{)a1IXZa<9pt3X!FfdebtQZ;t2U zZ9z?rH!sQ@MC$>H!!dkrzxrEXb;lnwD|Tg|NGe!}Fy3Lzzd2b;iIZkr?^>98IU?7!i} z(pqbWJKD%G%;V@Sn-UCq81u!;d4{YM>evdqdVC>ofDwWVl3Q6^l>v6>Mtk`P_32eNPE7y7wI?<#6DK2Ec^M zu|@_@5@QC5HtThADWowVr(vBY(!4!f#tJk{qE|5%bsICL77P0Bu_*v(`FZ1P)WZ)( z`>idsHp^5aV-^XH!bcCA+}k5GC9{|4O66)6l~L~}d-(jt z-Wlh2W%Ljz>7=h|$REt2N=~K>Z~z-k8%;^`Y_$$BKZJEt{Pd<3*B}dmGXlQ@TL;(H zouh_u4hR&2$n$8ltmaVC(?9!>s4ig!n5hl@Vm~A%2^l{}J0yaG3-IbgEkhsAbxM|d z%yVkJJ*MFq=Vb;&r|3d3!-4w&81)sg&Rw!XL=MCbbhhY#0!Gu_gn0jGyhXfxXz;@h z|CW)Md3C!~61o6K3L5alBu$EfuaLJ|^o;L)?kkHQDG@8n1^IV+9stX|e=onD$u!9Gbl<9r(QpVma8{q?PWS7@YLJFkA##%wU(ohVu(1>cHvS z@|6G=I=7x{X7D~rDJdUPbA3y_z~VbRnHW|5V3%Ov7-Nn;q)~ujR|6dRArTxndI&uJ z1C$3ToS7a*Mg$U!6Xf!@6wjsu-TgrN2jf)= z-QgjFC8r|Bb=-wA%qM!lYM6rK=#hb0gY$TXkq!REDQE46!-(}=OpREpZ}F*4ct&MI z4)X#$yDCFoDjN*Ni;gzJEhGT0CjjXMz8I;y!wmu(+*Wy3qp!v5e%x8e`&&th)2#d~ zU&9$)DM4vaF(~(Em2xn(&lK1T=>_f#9KWz6r4{r}miyY~QCU@ydX-*pUmvr_g@K;O zCiJh2jI7}bjhdiDN=YM*jG>8%{rk@M_PsX%Ns#mN6ELewS1ypaJOt%PY_YX|qApfU z$rF+|jX{Q}NQc$soz@-xIiGrc`4(?k%LeT}%A|;Sp$xXm*hRB}ttyN@CnZS%4E>?3 zG-0`1ah|yBe1DDqfEhn3NTA}J*83m!X!tj*#^=%Lto4|Q#OFd-&+pL`g?Mem^17=9&sNo91a9}KjZ3K65I>xp+HE`+BygTW1)_PE*`rVO% z$`q$T8tAM%Ob%TXmwX2$QH14QA_54jGomV5h^`_oy?57t&aaXLZSUQv>yzCV(Z zFj!bwTVAe4=;-N5u3icFj8r zJ6hKEXFAssTrf)ZRGG#*({7qwB<}HIm06+`?r`d>`Z@z&z7uGP%(2wq0EE?@~8DlYjyEE5yc3i3%GB#}%;5&fBq^OMQ?VDcW{(I5i5@%lo+C9yEgi?i#6)~=#905TsltC-z08j~go>hh zPxhH$cDM!cyPVjJj`u%9sKVmn2*H<4)R%_=K^i)`$S4GM7Fs~jS)yZPMB&w*eRbso z_WASY$>UopDk`p@vhv?SbM-$lLz0vP@b4fYa$sB?`VE*)JoBCrP+75`h_9kQ)0n!N zzSthGKiuwj?)m(E3^< z%%s=0ux1XS1fVH##Jm(vCvmYzFL0-5#Rgv?|D5IkzV_OIk}Q{ux8(e3^K5Uq-I^1= zA8H+%7k_D9MA(&Gyj6HT$g3)%H#U*#2)eMf^%npbOaW`S)Lqn1w)4;WjLRB_6Ys1OeEV9UR} z$RqofnwmsFE9tZ|h^|(tBOOn|e{%eEcN#rqQGf5c;Bb0f{W|~IoQ>dc8l=djD2&F2 z;lNxP0j0QJ-@(UrNp6H(a}*@RGiS?nmuL|J4IFq3%aII-oKeGUWYj$aKa^Q{-VxZ# zuIWTbN68(it)P3Y8l0x(IX`gv6h`g-0C336xeP#)EuYb^ZQs7TldsY0LRV5!5<@CT z5&(}$laQG?3d9x5F9n|v>^mN5Qgz+%B?_2XXlG0l0_a7nb4t2yL$+{EGv-qD<)6Nn zMKrq=dJ{Mlf1hiR8@bC+u*vVHAYk~(wZUvam1u8dGDD=(Y32C}`CX2H(#b_!nd@$r zx#M}lo#^=}ZT)QeL);B0{*zKtB%GXBK7jNLPW!udLte}Vrt+M(8<5XMH!OorGa4YJ z1@xY_`sx}QQs2H|#Pi?b0j&y~alB_6jmvh%*L!0xhl>72Q~BaxaJSQ?KKiP*e|n(#A^5iG<#ec-n2J1WAK+wvoEjv({I{3t<6g*H6mYLP zR}&)?j5Jfjo0H#KUm9W484*K}*U-58Gw{iP75r=HZp2SXdQac}V^xw$G5Z-~+uEe0 zoSq7Ldur-0eaDUL?Cd~@=0_qGAd2qmA$_}m{b-v2T15`#Dzr6@2odt#$P58>Ik(qM z@m?#t_1st2BUP}JFZ$zuQ3d6cmC+X$7e7R<`Y&6!cFTP4FV`=Z@%}r2b{=s5tD9*> zR_8sr&SOd#445AH8BnKz6qH}^ue0SWp=Ti?ZWZsaa6$hxFWL6iu4J(0IHP+}z+v^$ zUlD+kEcXb9#42F77`cRGmf|3CDXmdA^R*KvRtW#%`^dgZ*ImkeqT91+?zlV)wEenp zE+jm*_@-j;o7iKw6PB!Xaw+S#HK-Yb)TZj8+AxTy7GwG!;k z>Y}1pS0o3o5fX3^wDO(DwNuXRgFixM&sxU)7RcLOy=V;!>U^QwZC;9TojP9 zN~>C@++lrSE8r)RV@7CnHWW$lNcPuj{}BFFb66^7(r^wHVq2i%f^oT@5dn;C8_+4D z6P5Dy zZpB86Vp)AI7-!K4T7qi_Z)_A=F?$B@_!N~N^NSR$`VUrrb9?#n1jfH z*6_nV6^zn`uq*VXXoSeAmWy7AY$@CU<+5_Ei}3`<%?On2DBSRsnE?$4K(EZcz5g@e z^ZmK`c7N=O$962xT-Dg3w^`JF{=gK@FhW$u)9>&8mdfgC4uOd4s(X$mafAv>k5aqY z8^#e80j&}BYv&BLIIDg+5MWPOYmk?pCQ5#({Fq5;_BYqU$=-HSoZjS#c!>$ZH!OC{ z%_O^MQCUjj=2QjZd%`~G=E4z%U8LL==>4+O^`y7-ot`AT?WO9?)mp?puYgWcVjXyCs+s~eGouf9{nxzv>mXvqC6`}Ry)?ap6gm% z^IqyO)va3@efC~A7ny+XRwbPkzvUFkVPIxa?7B_y`o%bw{mjIt3tJIUp7M@?p>kD} zU?cptkiQLeU}fIT0~ zN;_7+nH9&??FG1=tdv!UzsRwqvk<%nJz{<7;I* z{gfF1@3qt18ugx197I(WUA@mRMKo$fc|}k zfwK&g5xSRorll-6Q)`Y^yi0mUY2t!xgoX6fI^Ak^*D{Wkqn1$YY?B8=;$uhcEdf?mi|a?)Lto z1@n(C!VQxy->b&EJV7g*U}tnbGrk1k?rm2lz#1S1on&kI#qZXHT3U1Kp(I8sw$8ga z#C@&iWWD^YQQ9O-bchC&VBJIGyH{bG{2Y+i8yK&X@#w;G;@`QMz0Q$40HOYhOOpND z6LN!jrnttulMoTR|>2jR!I+{lG5uJc;w)mI7DUS1v4-1Rz@@$ zVO*KYiIu5y!!~37Fgu2=6iyHriZ@yQ1EN0Or;(}ScC_^pLa=E$(jrE80gFguct_^Dart|nqNvbg zV6N_bAEi{bs&1A2E3>bRCRAv6qax%D2tE@Q^XQ2`b-Cm`&-deuu@Pwm^C(qgG~^7$ zEDbmie~mhLdEC!03P#;;C(GM|7!l_aZHl#M3+AET!y~n1;%iZPIh?swLy3rw-2W$# z>U2uBt~mCY=fFluW^z&~+Yr|I8uKP?cDJ!z5u)s)lf4x2mki&)x5hd}=Fh{qF%PvyJJN2HN8qi|6a!<7Z8)3dbN!HN^H&vxA zxMjRG>qr*YECG4w;BM*(H}x|?DqgWk5(4>1AOg{uNp=2^>Z$NnSOj59`c9T?vW6mW z!>VVo>-5v|)Khl`^j3Fk^waKVrU?jBif!z2@^2qDCI`82B&1gl^@o=4O&1kL0S3s7WE~mCG;=yn`h~0tm$Yb z2~!wLNnlZ#*(fF{>&lIY)(d8Myr8*O=l{1W0WFEjQM{902`kh+YRwS`J(lgHlEP>% zV@PJyXgq*BW|RcK&~y_O$G{%%?l=~2=5gXL>+GlE_4kAr@?I%swh_PP2%RO54;``TV0Xko)X!&S^f^Tv=E9%U})0tj5IXtR>y#hqd zcHVbXWljAhW4tKk=V*XDU(@qg=IYy3o85Cip}hmp8GJpf zuJ5?f1r%)CC`n049%n846yNR*rs&>eOmJygS(E?$n;cIwBXsmB-TN_}ETblZC1gSA~TEgM1AJJi-OJ0mGqA&vF)xs5* z#i-Pr=;aJ`M+J~cy0v37MGXzTEz6K&U6FBn_I72-Hlw-TcmLih|sFG6+NJ$MjA4vJ{^M~t$1jB{&wTxRF}tvoerQQ8JJiw?%)E)rf`q{<3@ZMWBvcU- z5lvON7KX>D;O}CEoE5A(5@)=+{yzMYpX0eAVFSc#9E!Klj^nG$zg0<-G?8+SbJOkj zMq-v!RqYQZQr?`e3)|xWdGIA5y8SkAPv}m`b@H95ub>rE&lnrZw`&D zHO5~$PnAzn^klP{1Xp1|7DbgTW)xq!rc46IfsT*xg1Zo2m(W`f=h{MqC+6*vf}4tq zSrDH$b+l%0_#*}@71tX(Aub9HO*o>)lq*Z285X7yyRKWVYDaIBly%**r5Yw59exnj z4>=RMG_WdAHb7%$MgP=&72zL(MXia` zfx?e22+e2&hBw>-7gdr<+Q|z(A77hdu%nBy_)s&+^1R5#=u8YSKIVhWoFQP#e7`+^ zWuAZj(E?~MKB~NS@B6FE0n%##_xflR7IS@vg+mlWW3ky{&bWJHMubX~08Q6i&Hb!U z)<{aEX^9jl@znqfIY(uA&1G61Xt1V{OAF{T+APYj+XBRCQA(%5l5i1S;P}OGM!e)C z5W;#gB;J0l;kN_xDmr>{!dl>%&a_Wh@j$cp()t&@Hm=bIBt~E(P&5K2AXob5_Q`ui z$$(B`xg+)x6}L2NawxHlE&+%PH4b8r0HFaVxO~z@ifN5iDWFBfB%0uI#@gu%MjZxo z8s)SNkaGQA3j!LifbU`=C7#AkV3XinB5(lQRjU|st*f(J3*#%sgTN7#c+hx|O(NZ@ z=5V(Aoswr;t!duV`Gz?xb3fsszqtPu)0IFifhxE~<@f8j*{q7~1@(bXY2O373psds zvQR{IthGphx6oOS0Un~KEC+PX40H;_+1R$zD%uG|(oOYNYllTD9efgs5xY-zh!KlN zu}PL}hb6i%Xaf{y;dj+M6s%7z)<%}~)tisVnXB$N;&=b)>%GId4FCUcGZb0bdqlSE zO;)y~vdPNcdxpp=GbDQ}dynjd$jT;!?7e0FUhmK6`@Mhnaoopo|Iy(n;c{K)d0yxF zdOn|zSDbUpa^-1b5y_SJ3ByCdVNR5OoPKa>P+lC6f?4uOW7V->PS0(T&u&I>jIq3& z7;iL)K17%jK^dSr$?baub(bsyiMY202=+siNWwI_pC0n2yx<_NuwKv`#=z=Q!oL8O~rwYW7`Xj#)z`KlA34waH&oY?UU1H}@fS zFkvHEEo5KDpJHn2#$d#L8MGdmZ>kcu^JHQG^kU9PRk7=+8{xO|nFGYkojKxG<$R9$ zC)j;=*=1gsy*f^jllQ&l^sqg;`Ll@O_Z>lxul(aJ`3qxN2xI9C4~MU6?y~N<)AhaX zh9$e*lrJel<%>uVy4i9w3fhCyr!sv`)Z&$>_1}cn-vM~hCplRSfv7|nXWfD~fAp_} zFAiX6frG*LRl7?5ak_l!LvA`y*I92qi<(TyI3hdoCywVNL|Y`A zHn>N`OB75%M{97GjDNZ}TIU~{Mj(4%lim?0lqV_6MCL>QF~Y&J-nZH7Yvf?(dKftzZ(tAvU2a^#0VY^aYdj%J@jJ$CD>A_!r=T5g~=1sYx;xeA}^QV-3xws0a zj&K2lH7EyAPk(6ji}BaU$irk6C=P|9-ywdYv5;D11;OQal)?m6QwZe&l!9IU(>l+6 zlY_%UfG@lw=Z{dAyy7D$7!L1|R!!juW2|J?oO-hUd)4^c7>d)&!yo;8Kdu`p7!~Pj zXo;Gqyr|zxv7^Z0Wl;Zdz^D?q)(%S%|ZKy5kW=8_qKf4IKbT?KT) zQsZW6RnkL;KiOrhQ^UuM|sxfsq&Dqu^Bz={m7yXyPye@_*0 zid83g+{zPj!ZI=NYW@BEJRCC|*RyzyCg z71G&8pQCGr7x{-UG%zOxnS~{;{>f>>{=>cT?FHcmqc$7z;AbOhzatFk+M>cmugFdbThxwL!L_~-(|9_+slK+uP zpom5v5fOpJ*T*j);Jh|Ock3=CX>xq{?cBtqR;pqGN1_ftA}?5%9lslI#~4@=5s*BJ zjj5;I49esgSBjGba~Q8ts-l}B|7vtT1KtV{tg8^ zwJs1D{bZAp_B6?}^1%_4xVNdzO=QiFh?npK)w`qKy?)DIJcxRGpkMgz1Z}m@7xhT zy5pU6B|%k?L@A@9wahGU^566y$aWTlae*!v&ZTFR7Va4fd!N4Tm>(0s@)Oo>OM723 z%J22A>0nOgW7p&u?r#Pn|N;cALGoqs*Q^W{r%u`8>Qfx-JR>zdOfpo^H)=z=EVR4Hvs{H`RG4b-5Q z?Lp`#gUQLsX%F7lW3!_R*c5*yeIVPskh9HFwwdb!1)o;`L#^=)?OhME1Vx9%mOHzq zj;HPTPTQ^tHVZU_8lpe#{AdNRr7{wacc36&4pwezufO;zOoRy74cwLg%upzm8<)B1 zg?l4Anf>jFg?b_cX&N9T@{s&J5NkrGsw`&u>QB5TuXo{Z4^6v-5_mx-TpwW$vcMA- z!=cxtAjbMQaqx?sC|?)rvYlSf)31BeR;*>%KupXvGv$bBhvv0p$a;vzDA!QJP?o%2 zgS_#vmCnvTmOnSwyEh8T%1fYsT3lcLLqMfKHjL zK@9XNIDYje+34L3`uhGlW-KPIZU>dZ8~-oo_aX&3^NaI;dL1?3&{1osP?uxWd}|^d zi^vG$B79mfvJYZ{D`w=kghHYiGTv8?Kkg@Sg9s1zai-SJ6a*kRhP?wm$nAh`YM*y3 zn)#01R345qc6Aj1a{@(4vchth{wp`^n-RAk;c^BMgOv9bc3I0gD`GuK&@!~@=Edfy zQLXXyUekO*T$Y>vxy!U6WRv)y^SgSCiCVb+vWRdcdy$LlXqxeId%_myjGd7nw;!#k zb5~6KN10c?`Q5kX==IJ{j_R7uXNyuDT=D!J=)T_mh|L7nB)mm@{)_l)_2ay)kD5aJPnf5mxssXKZ#Ct6~0A(ZA7Nav84I{e8y=m?N4;qAWs zt^cnPTOfP&9;fvu>$6t3o9=zq(5YFmcT_@JucP41NH%8rEZAmB7&eD{|FQ=EdERvM z=~8IiLyxqrcs-9es$K0Le>`FW0lmMFI%h3mG;(Ku7MWl5V$Q|K>-FG8>Sys0Yq!bL z43d2*jFE!^r`gQSU{B0x^oPui8M2$HYdDFw(zP#wt31zWx$Z}YXp+1w8ICn4Bb$;~ zWBbq@o*y*>j@QA`*NLdBcRe|CjUT~J14Z-1k58K-wQtHl*55U~RczDzsi`Jvv6p37 zz74)L!ZnItLmbv72r9$Qn#gmpORAFM%#|0nQNaOd%QZW&f7q?#;Y#JLIGBp;@?gtQ zAv%~kZG)wu{a0I+k$7LAGs*rQcm3eLOHNI!ymHQ=_e6VO=`KI_Wi5P#8Bd&O^Z^zhwJ@*g!J z6LCZtV+$d&U^ksSzJ<|;+gRp$dEIP)t4_aE^bR%0`(33TPf#tLo|*OFxU>DP@O%h5 zI8a=lz{{rJz~PI8i=>RWUEkn%+VYcsbms-9xQgO0s0_bv&KP+_kvkX4RMjM_G7DA| z*^;QM_+_i+j9n9XRO~j^a@Fb4WIHt+y)352LE#g;pn<(A0p4MTyiJSMu^GP+i$J}#r zYh{UWC#+uZ{}!z2uko$lmGS30cuZBh5O1E0d+IkyUbcFH7Sh;jR8C)cXXk2{>V(Hi(XGi$1iR>Z$`)eWdnJ|lC-WZISiO#@lw%mJfX%h z*lIYX@yEvB#wRTo4rUahm6-)KM4M$ZR}aTa>#9p=DL8TdB*yD~6n$wQS|d$fj8iiH zI1|TPukWjE%B!e+FK&^$ZmS!Uhdb0!{%)h`Tll^fSj6=VXpGW5l`7zR<+Ak+1OfEC zb0=_wzd)zb1&e?HEDVtcoY_A59!!7LXeF4^$3nG=#zUiTbrD9b@6Jd+*G#A)GLz{$ zov$ozpO$ixdq}oVM)m8qRW;u&zUReMG)uyKqQ9H#>5w_MU9A2buSxyqu-h@r6`id; zR>0s=nGE)8+V5zqEk)vbeT~c$8b*e=_3HC%m|zvfZ-eDvbG)^3y_0Es_&aqB5!n=L z)y5xIq&ZG+3M!G}%CXi0e_Z@WS=OE~e}4~lM;C0Jp0*4IrxQv)4OOVx82U1fdtEI^ z9XuM9y+0R!=a=ye^6ae`+XG2W`^VCW=8!dN@mi)(@<^oDTOOanV2rtDiS;q&44EJy zNLhJ}_Xvi^IEO6}t~y#=Q)Lm{te-;Rp*E7pmV))A>Y0t>e*b>oO1j}R*Zj$%vcoUT zsD5)Zb0c{gl74x8H-o5Q=~~KM&fUZ4AEvIO^ybBWcZBQI%G-89SA{zRByfUgX-z#I zEbE>&bIYiezg1+ryq5Hsg^e|5Z(16-JLi|28v|obXNTWLGm0jv1%i+9DW#=4048*4 zGt;Wefy?zGkTB|sEM1@C`h0|nyn)mYyAHRNDqez*YVDJ~ki+VPv)ago8t#w%86rqN z*98U!MuheqeD=~@PZ}RAvv%h*i~PAFY44swJ%O)hY6KN~hwFVD^RIoRuKl!N%4@(1 z&->94j>9~8I7hv~ruY5Z$g_s13z9Q=Oa)S5z1NBT%mQBv3Xpcw=F-P8rso$No8THG z$qotSUqxfj#~0NpaEF?M0D|x3ZC}m@x|95yVT)&aZD*BIzOuPqzXwK~bg!973G1zT zRMW=Kg(?=%aGuYtd~r%=B_WF{lN{K8-@Pte${aF5WTNs6Ln|G`nP!@;yq0Y0F-zO# zM>Vq2n2-N}Hy7sB;dT1y7#~sk-g4=llcci3yB_LCO%-kef&jaEQTZO0(Hs|fQ=X5c zvBE)**54>_GX+;K{80SqR8~dI*>Zurjw<~ELkrd!*<-90p#yY^D2L42&xwXC&7_IK z@5uZtVk}j#`#pvdYvudmj*hN`#T>DrI6w1tRz8U3QO?WNm%ERB{03@^`He()QYSrw z2vhWbMNekTih0D@^iOdjRu<#G3d^zMxKTLhp8l+E2CE@EShLBJ?h+5rNehQ22jR%Hq=J1AsPsZ-Bc@*7RrUjixi-vAgw(F%_n0-xvG{5csoD*cMrMl z<6XCgI!m@;8UnGjQ+r#Bf$@xGm2I*bI!7X0iij>A%0w3OW!*Vt1%2^7Yr%b_Fu|^P zGo{-;rt!8)uU@q3SS#I|5NRCcmycK|F!fh5bT-u9c>2_!qr>gal)HDzwBXXgY;O-= zUw^Skbp(lEGpYUqPL3VHnSa(g{}1>ARw*d&uv=Dp~&rBTZKfiJXu?tpQyzbBokQ4m=;F=L5F`pls55dNr>2 z(f9a15@Z}4cKuUe3n$kW^h)3(S%zpj6oPy>|FZp@rntMzw5+-qN^)7=7xuUgd6t_w z*{bl_1&$xij*ZO{S7*+)t9?p++OX@krFe29=jq?MFcYXa%#rS%+%E7$0`vWceN5S&kuW9-Eip$5C3LoL_q`>$T$7OUe$Y0(#Sg{}}6mEBK{mjv(t6_Why%)S| zzjS@cj1tXSMeACPn%Ehs%yRMcVqLvIZEsQ*p5~t0zznwGy+-LHCOf!l?9;KwCb-An z#e*l}>nF$WT*|;tiHRW{wTn4#ui^SObG5GBRpEq1uT)g!Qh&hxwb$J%I@p;}c0Pqs z@i)&FF%Kbc&1u=#d=|gFyt4k2l4!OIqp5Y#{u+g?*q&evX3u;0d(`}SE@vaU81>hxo#Blmb_El~jRdURDxYG3MS)tsS z;Q0IU-=kIh>nKaPiiTq4a8;|rfG#X?<|h;Ss}jkH+d@(F+2(2Wjb-=v(Y_Yx(g?tf zoI!dnE6`Nl&cU20ND^Nc<>AoREa!tI2JfYJq>QM7I4$8x0?mKL@01DFCAJQWrXlGh z3VUBaQ1;+3-%W1*^Y49$5nBe& zn*H{;2k!DF1FZ}M?0pZoM^q9EDvaG)pT)TpNugE>2T*v38P&2E%aiJNXV z#3WE;et$OZ0%*cf!&eEGucaf|=2E}E%I)3~&ldSqu3CG%(1NSS!T;L8EB)4y*T&E- z`D0SKS53+oo)n6F_Yc-SJWd|=czaQEGQK-T|A2r%lKdY7Y@hLk7!(QC-;9vmMDCNC zV1FvjmtqS3MLSN>?SJ4?ohmZ%D8H_2pH`co>&*rTNwOe$M!O~Yj|0X$uxakHTXgv zMBzqdfA5|^+N9Y<=63BNvvmJRe9PjQ2FWMB9sf8pwM7fl*ZI2X=>s^&3-r3^666r7 z9+o6~KQ}r3c_+fA%YZ|_J9aV=>+}YjIfxvX1!ID$%jR5gO}m$3?w$+jHvZv6ps#;{7sYN1G>jE0~+( zeSE0jb7J0pGbPp9caasJI+8MZ?UN$dx$j4twu|BcQAVz;{oIMjni#6fGyku5m zQ&Nkl5{SNBXq(Eq>KKs0mYi$j@&Xm7%`240Ns9g@S}FQD$`4pq)b%gX=F_gD z1l?O7>8K`Ogjr9#?W%Cm?wehne$v?Dp!2%+gncz-Al^Ev^vQ6?P6!-PS0AuX93Bk4 zemP3<@5jfCNdrx=FM7;{-l?QN+;53Su6G}*G4`O^7O9GSWmC1fiR$Zr=8}J!rdFwg zO^c1D$YtgJPW0`%H@U5482?Kpp4f+sZ?`vtQojs9JUsjwRy|s?XIa{Jd?Q#% z`>A`!YnqS@Wr;qJwT;0=BW@494;sb*6+&#V<(e93Xmr`hDXZz?72-U!;5O+ypU&4+ zOO?cTLy4nK830XR$H%o~^>9S!an;;UE~d*MAsNa{_Z|nKmiDTPB6CTeSp3*qksCaR z(`7k@fp{PkEp@dEMs)S51D9~oF{HbKQcVGGg5&Ow%qaW8X6~f3pPnXPzkezE?m^85 zOrS;KXGJ+8VRoAVxPi!Rcv9QiG^2iasEs&M)cJSwFE%E%?j;a8)$XuYs(mY2h)(I# z%%R9DHB6z{{2I4gXj^9nd*Hy~vK>lAr5crptG9OoLQueDwRR(s zYnA9$$jjinbhQ3CnJ0GD=w#Zr**hyP6hS#=yp@le`&#$4nc4NfZAqQiwthu&Cf{a+ z@QpN-HB?T|cGy#EW6UuU_m?ZUAgJm@f=spM=DkDhC%EL?)zFX8TI5PXJheC#SrMUsbh}ViWwl=!dMwcn&QlhHTB6)cMp`d($-0R?qpp|&{ z$MpOH30^WQPF}5jI_@vYd1%4wd#@t9lPtkF)e4e=W}e_KqQhOU#y!o_JZLL)G&JsWnepC``jU53>R zyhXweeB|H&SxT}=l%sY%yj0m)qhfPIDGJ%Beu#VK$w~hE`V*iUuY$P9J{<6Kez~&a-V@jkW@-9G|o%k&d#ap!khejh!zF<;M zSJBs}6!$**6Z@FD-K3&^dkKnj1?A;c!Hg6$ohB?dNUoB4z~ z3B2w`wG^}RnzP|A z0T@-z)^egfw<@|3-fIL=D76;|JU+g=KJ%t0TT=+Njjgmk2n_xS(Gur9gXF;n69%ZM zhq@;HvHSy}IQe!ilT3mvf^7f>3y>>}HQh1UdZ(&lm@O{H$idm~6=)L>xQV13>U@9f zK4pm*d7L+l#ua^xZc`tMO$NstKx^lTD)V=HdlFoJiGMzt_IX5~8IyxbS_)D%?S$%L z?Nx&ko3-GkNoN3vIMCjcl)0KeAks(78NP9#04763$fp4jUIOODr`2?yC`9`LxkzFs zU|$@h%wKj5>dFrA)%Fm#h#%W+<|-lQ9uIkMB)SsJ)9m{#zQ1lPV=r8E3TW%hOg_06 z3syE=$$Ejw(t6(v9v%vHTkLQOW+&=#Kv{XLZ zC9~Y?9~1k$S!8)PG2@Znmek#nn_Jr{gM1TX-oVe_T(@aaRKOqtg)oPaeNiHwtsAq} z5qgKi#K`OD9>QakN|W!mC9aM%LFW5gTUuHgmGd~72N>f8%aEbU&C9E>h$g?K`z%)i zzcG=G{TYVcRIl6}pMfnaHy_V6JdfKrZk>6<8)?5&pj?8wc2S6aEj_~?#xxpxzCB8_ zSTfkI{8v|16Gy$oC*nDVmd3n3%?Ezx?DODS^lY~@zS4Q3t5Q6C*}ITb&!$DoxeDLl zo_qWDmj6jr#y;3q;?vUlA@-I!uJ!C0QVb|mwRZo7z#I1E<$p0wsdb*i%8Q>y^K@sX z5`SGi=C{oDY(lxlIo{dJ@|O&UjqJ#|2G>dNO|>$2{&ZiiX56RZ#; z$&mq`-)|3*vvJg^Hu4z>$C+%N&3dOL6cWeGU+s8+w|)m^Oc;$1Xi`9@pS*4;ElsBq z-N7CPSuQy-NpvdFc4up<)^vR+)W*#eKV3c?VDOjFwedm|lrVqP`KfPN`Ls8x_&R zrIAp9eBXqD2NlR@2x-Xo%n=D;vU7HJ4vUU1fb68bA1Smm_>hz|b0KDXW6TIP|9NT z=q{&gZDg3RdQ2Ox($vB zH{Dm8vRv%!X3(bt3DMyMF(fw2TGOG;Of+ti%8b-Qo*u&TqjPT;ha~Z_=+HvzKB$D{)?=)IszS8c0HBvK=!s(corG%3 zrLEWAh&Y!2>DT#v=mC=sy;cl;w)sn2&aEY*b7j(S&8YV9pM<=Yrq6Q!G#@ItXw1MN z@IK}3TqlL-{1b-C>RXw@M_zv!YvjaiMeS!u!%i0CuQCb`1B9}Pkn<9VCbT@u3MxyD zM|IZ~E-Rj(`I~Z+ukmM*h;wcI2-}T*lJuQS>edgunt=~$s-XlibIm?E4|ZDHK$AWI zH|W3L*N`V$f+tZL8Azjl2kSZFF=DR?8G-Fu_k`Mka@CtS)M0~3k>X!ae^VR@kMO=^wjJZ zY-e?lK*lFc5RXv4&{z5*%zqmrLoQ#U=x)g(oZWZdmq*J+sFgCm)>oVBRN8D^^2Q}r z&B?=$v~7PthL0(7TUu&5I9Np2%3C`+&Q|T!+>n>P=$h_DJ?a}X$CTJIyDfRDN7Sq) zm~NP501MM}t^Mw{Jk5PkN!+A^QEE=rXLDc9m55l~tJIZqnX)&%NU}StR|Z>!rclEv zkX8gAq%>~wj(@JYYL*P;uEE}TS!@uh-eR2{^A_rsd9%v+K{stS%F~(Gi-3g#f4^3J z;@_MTG$NU68QD|xN4~$+rf|4pV6fHrVcB7e7{N7I~kj4wLJ&r z5r$NKIa*&;(DLv9^2_Hf%2fCK)tr@3eQ1Uzcxx(>p6IyZ4~9^r5<&^&{!Us5?8f;)W`W_t!izNfI+nmsknfJ5f9% z(+}>;&Oz2NyO#2|A=J+~d%uRoPBFYGtd<(OhRFPo@vN5aS$tgQjQgB??3=2|>f*>) z6DU9Z&HMZC^8};X^9+-IV+bJCejXQooTR2YoBmSePaqa9sL>4P5@=M!;5wtev!@6~ zp6xSHrQZ_**RGACn2#UTq1co9qC##(K>-R??0pCdg;ZL4eSSrkm6q3MFS9O-Y#HWG znV~FrvdggnzM0j{Yy@~9e&-xC=g|*$&{XVIrZLmg3{1h{I70RG)BeB(7$*4 zDL1+Y(1W4?G|w50hK<^CcR|85;F|7thA5<#1Tuba`32W+SK*Yj+%`&#eEW6dynTX~ z<2CuKHw`5Pba<|o|4Hjp_nhdkYMbf2x@oxL)6>hJJ5KECOmSNn^rhrjB*=+2mO4kW zr}Sk2wnfJ=BOc(Rkg8u{-+j(mY+OiBKn-G=r`4hIz+rAZfu$}B?y{x|%aO_sOE7p` zrC<=%LmhHMrko4a5odwYIz~L<$R1j%f?pQMl|5WJt1GmmJrjvsUFZlL8DU&7Lt>;Kj zgC@tBsKsS;fW4P08j$^9qsRXB|_(El>Z zF%m;+IGKJvgioYj)teC1+K?jX_LL+i7Kf$ZgXDiF6-59EL+nEe>R%Ma>OPmSGOr#g z`U*rfZR!K%!tL8=X*4j_pjcbcL#$-2{D9TQFCscJJjcV@0S@~5D|$&!I3hNiw)hXS zA687r-rW|@_1{a3>b!6815)d2d3*1b@i7}&rKLoKRTG&E=l_WqQC|=g**^bfgnSQz z{%f?~Q#-!JQ!}wW>@(k7J8*o}Y2hgA!I){M;!VgOr%-l`HQ96YXdOGC{Cq)1Htt0Ddl zzx#N>Sah^$_abc<)b*}qpUWg1`rZ@JKai#REY<Q-3a&U9RsVENIp}LT=eGrrI z@jHYAO@4+-;W2e`6~#Yw%@2!z&U`h1b)TW?dh)!mPTFPgti{H5I@PUo%L1pa*f&`x~U;L6KX-O}a*`DUZ!V=Y_r@Wrav>NO32-zxe(HWvSRtfTnD* z&d5Otes;0(Ay`hTE(V#}KT1{V)R&_D$Cyg!+_EnQZ>1+!f9!tcO7V`%;{*3hu!KvJ z>OvDocr-rQ*r4k0D?iP}io8p`Tf1 z%&%N3&&@WaasOpAGWv_06y$d0*Di#0KZ$1@_tbt(>4{GYanrB?`$u|KNaM&efoX-( zJoiXZ^s%#z*tejm2p$Zx7LI?3xTpR-U?tgpe|m1Z8U8-p+m?mA$|;Ou^n8Z&do!qH$0Acq%MlpA zEndB|H+#vyhxNs0G&YT+Y`HKw+k$SV3Ov<}D16%F+SUH}7X#ZPsa0QF8q$|B5)Z!* zb9q`W${;9GaZ4v^+x?NeMrLDK&wVRz2*1WmJ`KbkBp(3h$uG9gS`;N29{Z^^T9N7j zkpYtel$v;?#4iQQZ%u}rAKi^Xy@#ZQJiA8vew%5uh2P?UZ?1-V&(<#0% zE&?{=n#M|S?g76 z#}&z(I^;|2?%}ePGq>5X21Y%!tZ;dWe2vMDQu_-49L#}S0Y)f#mNOr^VlxRmDQ-4c zP1KRO9UWL$|eT4>?-?{GD=<{HEeiRshWi`ympWNol}VV`aIu#0nJ z*s}rUeEA;=09&A|ve*4g&%ODr>n5OGcAr;;xt)nx&+miHEki3W$+v6GoJ93sOPVyo zH+Y&QC==EXWSavJrvxw+K5>~fx;fW^riI@i@BgEx2ZW~-lFJp);M&xZzQ(Le!+U8mRcQ{~ z)P7ECr2pH|4J`l&%@Q}4F7{3P@~(~JkFWLY8$y8Z0fu0_aS?z2HJ9V}1?}F{#WB6- zy^haWu+dy7!m-jj)QL8V;{u1?O?%+IFJ&hi%f|e`ntkXiA_2}ym(>9|0QDv(|3KKN zp<&(jCb(`%`Fe!eirQahzP`EMn#ws}#-$ch(A13AYv|~ZM)GMWUozfH9~@rPQ0K8; zGt1Oh#i+j$5ejwM+1*Pbl+p~_q+fd{TN2F(fL8AV~|8a{iK~CnsE$k-#YhMjG zrBVpWAXXLQQ`GgTkGJ;%1UOb%!C=XW8mP^=?_br z=d#zj58CX|PJ?Tr)#AnZBEoc$hZigRI2kxN-gD^HIs$$*{?jKVfB@??z^??BON_#C z%s($m8ym^N@T{x*X{7>js0u>Avz5Wi%S$F;t1Wd5Z3>KDU)!t>|IxM7X6733j6FI# z3W%EU?`Z>qpAH-HDN3MUl7RcxB>tY;+NV_XbenG{&4JAOE3e*N*2DyoJb9ds(Sh`5 z!nJ&*RAz`SZK!r&@6nrE4adgXB`+YZ?y!5fHdDtXpEF#dub~m^N3*RK`kFf~Kr~QA zvR4gV{%wsw&_IN&fA?3OvZAW0`Q_QZaY>b;gR{{ZN3)1EIYIO2aP|j+fGLUIkAcFj znrS{xjdByS{uK8Vcas@;no}mQO|lF1Cc3S|S&lW{ z5x*un2)I2fkdXWjpJe4{@+D06Rp6Dp1b_62yyX4+A!9{a@gF{Px=k2#U;aC6*!WW9 zd38LIcEbNZ1m0S^8K465ogWv(l$svLWIQcO#Ro#C8%`yg?uKy>6@H?ru zNyjo_i+XB9beLT{yO!g=-H!@{&fUZ@!A4R}cEE(9?A_~~Ql07{w_A`>qVUiI&`0&LL9G^P0`eBTlXc|1V8 z^Ag}Wu|Z;{I(uR>A<5ADhm{dre-KdpKUk!D$?G(G*EoZ{m_tk1@#uhasl9|TsT?q@$mthpQZQebl!o>v_>~!;aeyhV3+P5>bP=3 z8{kq#CMH(!KYvLHxctj3sR5lFvqmQ-W|ErsI_@Z`sJwGNKeD>0gf)Rh%gC>0#J>z& z{pLL}bPJNmk7V&V*>TT!=NmKaTzBVY?WPJfa*%}FHa^TBPC5Lpj|J4yN`Hz47pS*@ z=~)74Am_89%HReUysK#t0U;n{+ixQ1M9;MhLZ)nMxxT`S8`}H6TJB9iq7-%xhT$k= zaOX+c6u_~CypJqB)ur$>V0^V@!1&6tm~C`}f-X>$Hcx#|(pTKU_MZ!wCE#((Wv) z76YZ_GJOzAt|-lhyNQ#70u*`mhAmJn{9_?`K^84}Ed-<<`%Q6!JC4_?o~+EJa;vgH z$72=pIbqi_a3exTM;8Ob_O?M9XZNoEspva-1}Mon_-M%u1>&JBB0C(G_G z9KEo#2)fG7aNIU(#ZsS8(T^MeJ@LQKV;g8@Jh0M5Q3`kTCa|p!=Y;yDwH{8*T-*F_ zY9O@$S{VDDaYI4~(OVO0wFs~}j8|mDirDkx2c3jOx?!_-gJ1W5%e5D79F!AxMBo%F z_Gi#{GpN?MMz>)-KV`Dg{0@-bOxpsG)i$qST0_bLx_%r&4Rsn0w;ceL`hm!{j9W#D zqCyPgB_M*-%3$`P?17k73CKFBD^*0*62|IeodHm(V7mqsEYz5cj6sO_r34ndm+p-J^d%@Y$)} z2KfzswhXR#F0^Kq|F_Kb`ZH3m&u%lxLKR*xFr^JA>l`w8OuMk}b8@OFDl2Oun0%Q%`zx?(*$TixK701VBvw+T`=6k z1I#qVRT*U|SPfv0lnZUQH6Zb)^x{S00dz2)mdG55h57rOjQeGP2_Ja^GU}}dh_=|d wUpT{P>C?U Date: Wed, 24 Sep 2025 01:14:35 +0000 Subject: [PATCH 06/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/pl/test_render_shapes.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/pl/test_render_shapes.py b/tests/pl/test_render_shapes.py index 1be07e88..ff358807 100644 --- a/tests/pl/test_render_shapes.py +++ b/tests/pl/test_render_shapes.py @@ -586,6 +586,7 @@ def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show() + def test_warns_when_table_does_not_annotate_element(sdata_blobs: SpatialData): # Work on an independent copy since we mutate tables sdata_blobs_local = deepcopy(sdata_blobs) @@ -606,5 +607,3 @@ def test_warns_when_table_does_not_annotate_element(sdata_blobs: SpatialData): table_name="other_table", ).pl.show() ) - - From bfdf2790e673b2729dbadc1605702955ad5e710e Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Wed, 24 Sep 2025 03:33:41 +0200 Subject: [PATCH 07/14] mypy --- src/spatialdata_plot/pl/utils.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index 902b58d5..489a848b 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -784,8 +784,7 @@ def _set_color_source_vec( logger.warning(f"No table name provided, using '{table_to_use}' as fallback for color mapping.") # Check if custom colors exist in the table's .uns slot - if _has_colors_in_uns(sdata, table_name, value_to_plot): - print("no") + if value_to_plot is not None and _has_colors_in_uns(sdata, table_name, value_to_plot): # Extract colors directly from the table's .uns slot color_mapping = _extract_colors_from_table_uns( sdata=sdata, @@ -962,9 +961,6 @@ def _has_colors_in_uns( adata = sdata.tables[table_to_use] color_key = f"{col_to_colorby}_colors" - print(f"color_key: {color_key}") - print(f"adata.uns: {adata.uns}") - return color_key in adata.uns @@ -1042,7 +1038,7 @@ def _extract_colors_from_table_uns( if len(hex_color) == 9: # #rrggbbaa format hex_color = hex_color[:7] # Keep only #rrggbb hex_colors.append(hex_color) - except Exception as e: + except (TypeError, ValueError) as e: logger.warning(f"Error converting colors to hex format: {e}") return None From 90868218e2ddb61f8176fc1d5f61ede33eb33ed9 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Wed, 24 Sep 2025 03:34:58 +0200 Subject: [PATCH 08/14] pic from runner --- .../Shapes_respects_custom_colors_from_uns.png | Bin 0 -> 32296 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/_images/Shapes_respects_custom_colors_from_uns.png diff --git a/tests/_images/Shapes_respects_custom_colors_from_uns.png b/tests/_images/Shapes_respects_custom_colors_from_uns.png new file mode 100644 index 0000000000000000000000000000000000000000..28ff080618ef999c38cab82a44b5f360b93d3065 GIT binary patch literal 32296 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 wUpT{P>C?U Date: Wed, 19 Nov 2025 15:15:26 +0000 Subject: [PATCH 09/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/pl/test_render_shapes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/pl/test_render_shapes.py b/tests/pl/test_render_shapes.py index 13009204..e60e3822 100644 --- a/tests/pl/test_render_shapes.py +++ b/tests/pl/test_render_shapes.py @@ -640,6 +640,7 @@ def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): sdata_blobs["other_table"].uns["category_colors"] = ["#800080", "#008000", "#FFFF00"] # purple, green ,yellow sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show() + def test_plot_can_render_circles_to_hex(self, sdata_blobs: SpatialData): sdata_blobs.pl.render_shapes(element="blobs_circles", shape="hex").pl.show() From 3e793f7a6729050a4e388808c23c896dd0f1ca94 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Wed, 19 Nov 2025 17:44:22 +0100 Subject: [PATCH 10/14] updated tests --- src/spatialdata_plot/pl/basic.py | 46 ++------ src/spatialdata_plot/pl/render.py | 22 ++-- src/spatialdata_plot/pl/utils.py | 188 ++++++++++++++++++++---------- tests/pl/test_render_labels.py | 70 ++++++++++- tests/pl/test_render_points.py | 12 ++ tests/pl/test_render_shapes.py | 104 +++++++++-------- 6 files changed, 288 insertions(+), 154 deletions(-) diff --git a/src/spatialdata_plot/pl/basic.py b/src/spatialdata_plot/pl/basic.py index 2ebf7455..d34d9fe4 100644 --- a/src/spatialdata_plot/pl/basic.py +++ b/src/spatialdata_plot/pl/basic.py @@ -1,7 +1,6 @@ from __future__ import annotations import sys -import warnings from collections import OrderedDict from copy import deepcopy from pathlib import Path @@ -23,6 +22,7 @@ from xarray import DataArray, DataTree from spatialdata_plot._accessor import register_spatial_data_accessor +from spatialdata_plot._logging import logger from spatialdata_plot.pl.render import ( _render_images, _render_labels, @@ -272,11 +272,7 @@ def render_shapes( """ # TODO add Normalize object in tutorial notebook and point to that notebook here if "vmin" in kwargs or "vmax" in kwargs: - warnings.warn( - "`vmin` and `vmax` are deprecated. Pass matplotlib `Normalize` object to norm instead.", - DeprecationWarning, - stacklevel=2, - ) + logger.warning("`vmin` and `vmax` are deprecated. Pass matplotlib `Normalize` object to norm instead.") params_dict = _validate_shape_render_params( self._sdata, element=element, @@ -423,11 +419,7 @@ def render_points( """ # TODO add Normalize object in tutorial notebook and point to that notebook here if "vmin" in kwargs or "vmax" in kwargs: - warnings.warn( - "`vmin` and `vmax` are deprecated. Pass matplotlib `Normalize` object to norm instead.", - DeprecationWarning, - stacklevel=2, - ) + logger.warning("`vmin` and `vmax` are deprecated. Pass matplotlib `Normalize` object to norm instead.") params_dict = _validate_points_render_params( self._sdata, element=element, @@ -544,11 +536,7 @@ def render_images( """ # TODO add Normalize object in tutorial notebook and point to that notebook here if "vmin" in kwargs or "vmax" in kwargs: - warnings.warn( - "`vmin` and `vmax` are deprecated. Pass matplotlib `Normalize` object to norm instead.", - DeprecationWarning, - stacklevel=2, - ) + logger.warning("`vmin` and `vmax` are deprecated. Pass matplotlib `Normalize` object to norm instead.") params_dict = _validate_image_render_params( self._sdata, element=element, @@ -679,11 +667,7 @@ def render_labels( """ # TODO add Normalize object in tutorial notebook and point to that notebook here if "vmin" in kwargs or "vmax" in kwargs: - warnings.warn( - "`vmin` and `vmax` are deprecated. Pass matplotlib `Normalize` object to norm instead.", - DeprecationWarning, - stacklevel=2, - ) + logger.warning("`vmin` and `vmax` are deprecated. Pass matplotlib `Normalize` object to norm instead.") params_dict = _validate_label_render_params( self._sdata, element=element, @@ -918,9 +902,7 @@ def show( # go through tree for i, cs in enumerate(coordinate_systems): - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=UserWarning) - sdata = self._copy() + sdata = self._copy() _, has_images, has_labels, has_points, has_shapes = ( cs_contents.query(f"cs == '{cs}'").iloc[0, :].values.tolist() ) @@ -1000,16 +982,12 @@ def show( assert isinstance(params_copy.color, str) colors = sc.get.obs_df(sdata[table], [params_copy.color]) if isinstance(colors[params_copy.color].dtype, pd.CategoricalDtype): - # Avoid mutating `.uns` by generating new colors implicitly. - # Only copy colors if they already exist in `.uns`. - color_key = f"{params_copy.color}_colors" - if color_key in sdata[table].uns: - _maybe_set_colors( - source=sdata[table], - target=sdata[table], - key=params_copy.color, - palette=params_copy.palette, - ) + _maybe_set_colors( + source=sdata[table], + target=sdata[table], + key=params_copy.color, + palette=params_copy.palette, + ) rasterize = (params_copy.scale is None) or ( isinstance(params_copy.scale, str) diff --git a/src/spatialdata_plot/pl/render.py b/src/spatialdata_plot/pl/render.py index 76e57d82..396efba9 100644 --- a/src/spatialdata_plot/pl/render.py +++ b/src/spatialdata_plot/pl/render.py @@ -147,9 +147,9 @@ def _render_shapes( color_vector = np.asarray(color_vector, dtype=float) if np.isnan(color_vector).any(): nan_count = int(np.isnan(color_vector).sum()) - logger.warning( - f"Found {nan_count} NaN values in color data. These observations will be colored with the 'na_color'." - ) + msg = f"Found {nan_count} NaN values in color data. These observations will be colored with the 'na_color'." + warnings.warn(msg, UserWarning, stacklevel=2) + logger.warning(msg) # Using dict.fromkeys here since set returns in arbitrary order # remove the color of NaN values, else it might be assigned to a category @@ -656,12 +656,14 @@ def _render_points( cols = sc.get.obs_df(adata, [col_for_color]) # maybe set color based on type if isinstance(cols[col_for_color].dtype, pd.CategoricalDtype): - _maybe_set_colors( - source=adata, - target=adata, - key=col_for_color, - palette=palette, - ) + uns_color_key = f"{col_for_color}_colors" + if uns_color_key in adata.uns: + _maybe_set_colors( + source=adata, + target=adata, + key=col_for_color, + palette=palette, + ) # when user specified a single color, we emulate the form of `na_color` and use it default_color = ( @@ -778,7 +780,7 @@ def _render_points( agg = agg.where((agg <= norm.vmin) | (np.isnan(agg)), other=2) agg = agg.where((agg != norm.vmin) | (np.isnan(agg)), other=0.5) - color_key = ( + color_key: list[str] | None = ( list(color_vector.categories.values) if (type(color_vector) is pd.core.arrays.categorical.Categorical) and (len(color_vector.categories.values) > 1) diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index 5248dfea..2e6382ae 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -834,41 +834,72 @@ def _set_color_source_vec( table_layer=table_layer, )[value_to_plot] - # numerical case, return early + # numerical vs. categorical case if color_source_vector is not None and not isinstance(color_source_vector.dtype, pd.CategoricalDtype): - if ( - not isinstance(element, GeoDataFrame) - and isinstance(palette, list) - and palette[0] is not None - or isinstance(element, GeoDataFrame) - and isinstance(palette, list) - ): - logger.warning( - "Ignoring categorical palette which is given for a continuous variable. " - "Consider using `cmap` to pass a ColorMap." - ) - return None, color_source_vector, False + is_numeric_like = pd.api.types.is_numeric_dtype(color_source_vector.dtype) + is_object_series = isinstance(color_source_vector, pd.Series) and color_source_vector.dtype == "O" + + # If it's an object-typed series but not coercible to float, treat as categorical + if is_object_series and not _is_coercable_to_float(color_source_vector): + color_source_vector = pd.Categorical(color_source_vector) + else: + is_numeric_like = True + + # Continuous case: return early + if is_numeric_like: + if ( + not isinstance(element, GeoDataFrame) + and isinstance(palette, list) + and palette[0] is not None + or isinstance(element, GeoDataFrame) + and isinstance(palette, list) + ): + logger.warning( + "Ignoring categorical palette which is given for a continuous variable. " + "Consider using `cmap` to pass a ColorMap." + ) + return None, color_source_vector, False color_source_vector = pd.Categorical(color_source_vector) # convert, e.g., `pd.Series` # Use the provided table_name parameter, fall back to only one present - if table_name is not None: + table_to_use: str | None + if table_name is not None and table_name in sdata.tables: table_to_use = table_name + elif table_name is not None and table_name not in sdata.tables: + logger.warning(f"Table '{table_name}' not found in `sdata.tables`. Falling back to default behavior.") + table_to_use = None else: - table_to_use = list(sdata.tables.keys())[0] - logger.warning(f"No table name provided, using '{table_to_use}' as fallback for color mapping.") + table_keys = list(sdata.tables.keys()) + if table_keys: + table_to_use = table_keys[0] + logger.warning(f"No table name provided, using '{table_to_use}' as fallback for color mapping.") + else: + table_to_use = None + + adata_for_mapping = sdata[table_to_use] if table_to_use is not None else None # Check if custom colors exist in the table's .uns slot if value_to_plot is not None and _has_colors_in_uns(sdata, table_name, value_to_plot): # Extract colors directly from the table's .uns slot + # Convert Color to ColorLike (str) for the function + na_color_like: ColorLike = na_color.get_hex() if isinstance(na_color, Color) else na_color color_mapping = _extract_colors_from_table_uns( sdata=sdata, table_name=table_name, col_to_colorby=value_to_plot, color_source_vector=color_source_vector, - na_color=na_color, + na_color=na_color_like, ) - if color_mapping is None: + if color_mapping is not None: + if isinstance(palette, str): + palette = [palette] + color_mapping = _modify_categorical_color_mapping( + mapping=color_mapping, + groups=groups, + palette=palette, + ) + else: logger.warning(f"Failed to extract colors for '{value_to_plot}', falling back to default mapping.") # Fall back to the existing method if extraction fails color_mapping = _get_categorical_color_mapping( @@ -883,9 +914,12 @@ def _set_color_source_vec( render_type=render_type, ) else: + color_mapping = None + + if color_mapping is None: # Use the existing color mapping method color_mapping = _get_categorical_color_mapping( - adata=sdata[table_to_use], + adata=adata_for_mapping, cluster_key=value_to_plot, color_source_vector=color_source_vector, cmap_params=cmap_params, @@ -906,7 +940,9 @@ def _set_color_source_vec( return color_source_vector, color_vector, True logger.warning(f"Color key '{value_to_plot}' for element '{element_name}' not been found, using default colors.") - color = np.full(sdata[table_name].n_obs, na_color.get_hex_with_alpha()) + # Fallback: color everything with na_color; use element length when table is unknown + n_obs = len(element) if element is not None else (sdata[table_name].n_obs if table_name in sdata.tables else 0) + color = np.full(n_obs, na_color.get_hex_with_alpha()) return color, color, False @@ -948,8 +984,9 @@ def _map_color_seg( else: # Case D: User didn't specify a column to color by, but modified the na_color val_im = map_array(seg.copy(), cell_id, cell_id) - if "#" in str(color_vector[0]): - # we have hex colors + first_value = color_vector.iloc[0] if isinstance(color_vector, pd.Series) else color_vector[0] + if _is_color_like(first_value): + # we have color-like values (e.g., hex or named colors) assert all(_is_color_like(c) for c in color_vector), "Not all values are color-like." cols = colors.to_rgba_array(color_vector) else: @@ -1019,6 +1056,8 @@ def _has_colors_in_uns( ------- True if _colors exists in the table's .uns, False otherwise """ + color_key = f"{col_to_colorby}_colors" + # Determine which table to use if table_name is not None: if table_name not in sdata.tables: @@ -1027,10 +1066,10 @@ def _has_colors_in_uns( else: if len(sdata.tables.keys()) == 0: return False - table_to_use = list(sdata.tables.keys())[0] + # When no table is specified, check all tables for the color key + return any(color_key in adata.uns for adata in sdata.tables.values()) adata = sdata.tables[table_to_use] - color_key = f"{col_to_colorby}_colors" return color_key in adata.uns @@ -1064,6 +1103,8 @@ def _extract_colors_from_table_uns( ------- Mapping from category names to hex colors, or None if colors not found """ + color_key = f"{col_to_colorby}_colors" + # Determine which table to use if table_name is not None: if table_name not in sdata.tables: @@ -1074,11 +1115,23 @@ def _extract_colors_from_table_uns( if len(sdata.tables) == 0: logger.warning("No tables found in sdata.") return None - table_to_use = list(sdata.tables.keys())[0] + # No explicit table provided: search all tables for the color key + candidate_tables: list[str] = [ + name + for name, ad in sdata.tables.items() + if color_key in ad.uns # type: ignore[union-attr] + ] + if not candidate_tables: + logger.debug(f"Color key '{color_key}' not found in any table uns.") + return None + table_to_use = candidate_tables[0] + if len(candidate_tables) > 1: + logger.warning( + f"Color key '{color_key}' found in multiple tables {candidate_tables}; using table '{table_to_use}'." + ) logger.info(f"No table name provided, using '{table_to_use}' for color extraction.") adata = sdata.tables[table_to_use] - color_key = f"{col_to_colorby}_colors" # Check if the color pattern exists if color_key not in adata.uns: @@ -1089,45 +1142,62 @@ def _extract_colors_from_table_uns( stored_colors = adata.uns[color_key] categories = color_source_vector.categories.tolist() - # Validate na_color format - if "#" not in str(na_color): - logger.warning("Expected `na_color` to be a hex color, converting...") - na_color = to_hex(to_rgba(na_color)[:3]) + # Validate na_color format and convert to hex string + if isinstance(na_color, Color): + na_color_hex = na_color.get_hex() + else: + na_color_str = str(na_color) + if "#" not in na_color_str: + logger.warning("Expected `na_color` to be a hex color, converting...") + na_color_hex = to_hex(to_rgba(na_color)[:3]) + else: + na_color_hex = na_color_str # Strip alpha channel from na_color if present - if len(str(na_color)) == 9: # #rrggbbaa format - na_color = str(na_color)[:7] # Keep only #rrggbb + if len(na_color_hex) == 9: # #rrggbbaa format + na_color_hex = na_color_hex[:7] # Keep only #rrggbb - # Convert stored colors to hex format (without alpha channel) - try: - hex_colors = [] - for color in stored_colors: - rgba = to_rgba(color)[:3] # Take only RGB, drop alpha - hex_color = to_hex(rgba) - # Ensure we strip alpha channel if present - if len(hex_color) == 9: # #rrggbbaa format - hex_color = hex_color[:7] # Keep only #rrggbb - hex_colors.append(hex_color) - except (TypeError, ValueError) as e: - logger.warning(f"Error converting colors to hex format: {e}") - return None - - # Create the mapping - color_mapping = {} + def _to_hex_no_alpha(color_value: Any) -> str | None: + try: + rgba = to_rgba(color_value)[:3] + hex_color: str = to_hex(rgba) + if len(hex_color) == 9: + hex_color = hex_color[:7] + return hex_color + except (TypeError, ValueError) as e: + logger.warning(f"Error converting color '{color_value}' to hex format: {e}") + return None - # Map categories to colors - for i, category in enumerate(categories): - if i < len(hex_colors): - color_mapping[category] = hex_colors[i] - else: - # Not enough colors provided, use na_color for extra categories - logger.warning(f"Not enough colors provided for category '{category}', using na_color.") - color_mapping[category] = na_color + color_mapping: dict[str, str] = {} + + if isinstance(stored_colors, Mapping): + for category in categories: + raw_color = stored_colors.get(category) + if raw_color is None: + logger.warning(f"No color specified for '{category}' in '{color_key}', using na_color.") + color_mapping[category] = na_color_hex + continue + hex_color = _to_hex_no_alpha(raw_color) + color_mapping[category] = hex_color if hex_color is not None else na_color_hex + logger.info(f"Successfully extracted {len(color_mapping)} colors from '{color_key}' in table '{table_to_use}'.") + else: + try: + hex_colors = [_to_hex_no_alpha(color) for color in stored_colors] + except TypeError: + logger.warning(f"Unsupported color storage for '{color_key}'. Expected sequence or mapping.") + return None - # Add NaN category - color_mapping["NaN"] = na_color + for i, category in enumerate(categories): + if i < len(hex_colors) and hex_colors[i] is not None: + hex_color = hex_colors[i] + assert hex_color is not None # type narrowing for mypy + color_mapping[category] = hex_color + else: + logger.warning(f"Not enough colors provided for category '{category}', using na_color.") + color_mapping[category] = na_color_hex + logger.info(f"Successfully extracted {len(hex_colors)} colors from '{color_key}' in table '{table_to_use}'.") - logger.info(f"Successfully extracted {len(hex_colors)} colors from '{color_key}' in table '{table_to_use}'.") + color_mapping["NaN"] = na_color_hex return color_mapping diff --git a/tests/pl/test_render_labels.py b/tests/pl/test_render_labels.py index b89d63f1..b8e7f350 100644 --- a/tests/pl/test_render_labels.py +++ b/tests/pl/test_render_labels.py @@ -263,7 +263,7 @@ def test_plot_can_annotate_labels_with_table_layer(self, sdata_blobs: SpatialDat sdata_blobs["table"].layers["normalized"] = get_standard_RNG().random(sdata_blobs["table"].X.shape) sdata_blobs.pl.render_labels("blobs_labels", color="channel_0_sum", table_layer="normalized").pl.show() - def _prepare_small_labels(self, sdata_blobs: SpatialData) -> SpatialData: + def _prepare_labels_with_small_objects(self, sdata_blobs: SpatialData) -> SpatialData: # add a categorical column adata = sdata_blobs["table"] sdata_blobs["table"].obs["category"] = ["a"] * 10 + ["b"] * 10 + ["c"] * 6 @@ -289,12 +289,12 @@ def _prepare_small_labels(self, sdata_blobs: SpatialData) -> SpatialData: def test_plot_can_handle_dropping_small_labels_after_rasterize_continuous(self, sdata_blobs: SpatialData): # reported here https://github.com/scverse/spatialdata-plot/issues/443 - sdata_blobs = self._prepare_small_labels(sdata_blobs) + sdata_blobs = self._prepare_labels_with_small_objects(sdata_blobs) sdata_blobs.pl.render_labels("blobs_labels_large", color="channel_0_sum", table_name="table").pl.show() def test_plot_can_handle_dropping_small_labels_after_rasterize_categorical(self, sdata_blobs: SpatialData): - sdata_blobs = self._prepare_small_labels(sdata_blobs) + sdata_blobs = self._prepare_labels_with_small_objects(sdata_blobs) sdata_blobs.pl.render_labels("blobs_labels_large", color="category", table_name="table").pl.show() @@ -322,6 +322,70 @@ def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show() + def test_plot_respects_custom_colors_from_uns_dict(self, sdata_blobs: SpatialData): + labels_name = "blobs_labels" + instances = get_element_instances(sdata_blobs[labels_name]) + n_obs = len(instances) + adata = AnnData( + get_standard_RNG().normal(size=(n_obs, 10)), + obs=pd.DataFrame(get_standard_RNG().normal(size=(n_obs, 3)), columns=["a", "b", "c"]), + ) + adata.obs["instance_id"] = instances.values + adata.obs["category"] = get_standard_RNG().choice(["a", "b", "c"], size=adata.n_obs) + adata.obs["category"][:3] = ["a", "b", "c"] + adata.obs["region"] = labels_name + table = TableModel.parse( + adata=adata, + region_key="region", + instance_key="instance_id", + region=labels_name, + ) + sdata_blobs["other_table"] = table + sdata_blobs["other_table"].obs["category"] = sdata_blobs["other_table"].obs["category"].astype("category") + sdata_blobs["other_table"].uns["category_colors"] = { + "a": "#800080", + "b": "#008000", + "c": "#FFFF00", + } + + sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show() + + def test_plot_respects_custom_colors_from_uns_with_groups_and_palette( + self, + sdata_blobs: SpatialData, + ): + labels_name = "blobs_labels" + instances = get_element_instances(sdata_blobs[labels_name]) + n_obs = len(instances) + adata = AnnData( + get_standard_RNG().normal(size=(n_obs, 10)), + obs=pd.DataFrame(get_standard_RNG().normal(size=(n_obs, 3)), columns=["a", "b", "c"]), + ) + adata.obs["instance_id"] = instances.values + adata.obs["category"] = get_standard_RNG().choice(["a", "b", "c"], size=adata.n_obs) + adata.obs["category"][:3] = ["a", "b", "c"] + adata.obs["region"] = labels_name + table = TableModel.parse( + adata=adata, + region_key="region", + instance_key="instance_id", + region=labels_name, + ) + sdata_blobs["other_table"] = table + sdata_blobs["other_table"].obs["category"] = sdata_blobs["other_table"].obs["category"].astype("category") + sdata_blobs["other_table"].uns["category_colors"] = { + "a": "#800080", + "b": "#008000", + "c": "#FFFF00", + } + + sdata_blobs.pl.render_labels( + "blobs_labels", + color="category", + groups=["a", "b"], + palette=["#111111", "#222222"], + ).pl.show() + def test_warns_when_table_does_not_annotate_element(sdata_blobs: SpatialData): # Work on an independent copy since we mutate tables diff --git a/tests/pl/test_render_points.py b/tests/pl/test_render_points.py index 5e3fc38a..704a7d6b 100644 --- a/tests/pl/test_render_points.py +++ b/tests/pl/test_render_points.py @@ -70,6 +70,18 @@ def test_plot_coloring_with_palette(self, sdata_blobs: SpatialData): palette=["lightgreen", "darkblue"], ).pl.show() + def test_plot_respects_custom_colors_from_uns_for_points(self, sdata_blobs: SpatialData): + sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_points"] * sdata_blobs["table"].n_obs) + sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_points" + + # set a custom palette in `.uns` for the categorical column + sdata_blobs["table"].uns["genes_colors"] = ["#800080", "#008000", "#FFFF00"] + + sdata_blobs.pl.render_points( + element="blobs_points", + color="genes", + ).pl.show() + def test_plot_coloring_with_cmap(self, sdata_blobs: SpatialData): sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_points"] * sdata_blobs["table"].n_obs) sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_points" diff --git a/tests/pl/test_render_shapes.py b/tests/pl/test_render_shapes.py index e60e3822..872342c8 100644 --- a/tests/pl/test_render_shapes.py +++ b/tests/pl/test_render_shapes.py @@ -11,7 +11,7 @@ from anndata import AnnData from matplotlib.colors import Normalize from shapely.geometry import MultiPolygon, Point, Polygon -from spatialdata import SpatialData, deepcopy, get_element_instances +from spatialdata import SpatialData, deepcopy from spatialdata.models import ShapesModel, TableModel from spatialdata.transformations import Affine, Identity, MapAxis, Scale, Sequence, Translation from spatialdata.transformations._utils import _set_transformations @@ -618,28 +618,32 @@ def test_plot_can_annotate_shapes_with_table_layer(self, sdata_blobs: SpatialDat sdata_blobs.pl.render_shapes("blobs_circles", color="feature0", table_layer="normalized").pl.show() def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): - labels_name = "blobs_labels" - instances = get_element_instances(sdata_blobs[labels_name]) - n_obs = len(instances) - adata = AnnData( - get_standard_RNG().normal(size=(n_obs, 10)), - obs=pd.DataFrame(get_standard_RNG().normal(size=(n_obs, 3)), columns=["a", "b", "c"]), - ) - adata.obs["instance_id"] = instances.values - adata.obs["category"] = get_standard_RNG().choice(["a", "b", "c"], size=adata.n_obs) - adata.obs["category"][:3] = ["a", "b", "c"] - adata.obs["region"] = labels_name - table = TableModel.parse( - adata=adata, - region_key="region", - instance_key="instance_id", - region=labels_name, - ) - sdata_blobs["other_table"] = table - sdata_blobs["other_table"].obs["category"] = sdata_blobs["other_table"].obs["category"].astype("category") - sdata_blobs["other_table"].uns["category_colors"] = ["#800080", "#008000", "#FFFF00"] # purple, green ,yellow + shapes_name = "blobs_polygons" + sdata_blobs.set_table_annotates_spatialelement("table", region=shapes_name) + + categories = get_standard_RNG().choice(["a", "b", "c"], size=sdata_blobs["table"].n_obs) + categories[:3] = ["a", "b", "c"] + categories = pd.Categorical(categories, categories=["a", "b", "c"]) + sdata_blobs["table"].obs["category"] = categories + sdata_blobs["table"].uns["category_colors"] = ["#800080", "#008000", "#FFFF00"] # purple, green, yellow + + sdata_blobs.pl.render_shapes(shapes_name, color="category", table_name="table").pl.show() + + def test_plot_respects_custom_colors_from_uns_dict(self, sdata_blobs: SpatialData): + shapes_name = "blobs_polygons" + sdata_blobs.set_table_annotates_spatialelement("table", region=shapes_name) - sdata_blobs.pl.render_labels("blobs_labels", color="category").pl.show() + categories = get_standard_RNG().choice(["a", "b", "c"], size=sdata_blobs["table"].n_obs) + categories[:3] = ["a", "b", "c"] + categories = pd.Categorical(categories, categories=["a", "b", "c"]) + sdata_blobs["table"].obs["category"] = categories + sdata_blobs["table"].uns["category_colors"] = { + "a": "#800080", + "b": "#008000", + "c": "#FFFF00", + } + + sdata_blobs.pl.render_shapes(shapes_name, color="category", table_name="table").pl.show() def test_plot_can_render_circles_to_hex(self, sdata_blobs: SpatialData): sdata_blobs.pl.render_shapes(element="blobs_circles", shape="hex").pl.show() @@ -749,39 +753,43 @@ def test_warns_when_table_does_not_annotate_element(sdata_blobs: SpatialData): ).pl.show() ) - def test_plot_can_handle_nan_values_in_color_data(self, sdata_blobs: SpatialData): - """Test that NaN values in color data are handled gracefully.""" - sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_circles"] * sdata_blobs["table"].n_obs) - sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_circles" - # Add color column with NaN values - sdata_blobs.shapes["blobs_circles"]["color_with_nan"] = [1.0, 2.0, np.nan, 4.0, 5.0] +def test_plot_can_handle_nan_values_in_color_data(sdata_blobs: SpatialData): + """Test that NaN values in color data are handled gracefully.""" + sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_circles"] * sdata_blobs["table"].n_obs) + sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_circles" - # Test that rendering works with NaN values and issues warning - with pytest.warns(UserWarning, match="Found 1 NaN values in color data"): - sdata_blobs.pl.render_shapes(element="blobs_circles", color="color_with_nan", na_color="red").pl.show() + # Add color column with NaN values + sdata_blobs.shapes["blobs_circles"]["color_with_nan"] = [1.0, 2.0, np.nan, 4.0, 5.0] - def test_plot_colorbar_normalization_with_nan_values(self, sdata_blobs: SpatialData): - """Test that colorbar normalization works correctly with NaN values.""" - sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * sdata_blobs["table"].n_obs) - sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons" + # Test that rendering works with NaN values and issues warning + with pytest.warns(UserWarning, match="Found 1 NaN values in color data"): + sdata_blobs.pl.render_shapes(element="blobs_circles", color="color_with_nan", na_color="red").pl.show() - sdata_blobs.shapes["blobs_polygons"]["color_with_nan"] = [1.0, 2.0, np.nan, 4.0, 5.0] - # Test colorbar with NaN values - should use nanmin/nanmax - sdata_blobs.pl.render_shapes(element="blobs_polygons", color="color_with_nan", na_color="gray").pl.show() +def test_plot_colorbar_normalization_with_nan_values(sdata_blobs: SpatialData): + """Test that colorbar normalization works correctly with NaN values.""" + sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_polygons"] * sdata_blobs["table"].n_obs) + sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_polygons" - def test_plot_can_handle_non_numeric_radius_values(self, sdata_blobs: SpatialData): - """Test that non-numeric radius values are handled gracefully.""" - sdata_blobs.shapes["blobs_circles"]["radius_mixed"] = [1.0, "invalid", 3.0, np.nan, 5.0] + sdata_blobs.shapes["blobs_polygons"]["color_with_nan"] = [1.0, 2.0, np.nan, 4.0, 5.0] - sdata_blobs.pl.render_shapes(element="blobs_circles", color="red").pl.show() + # Test colorbar with NaN values - should use nanmin/nanmax + sdata_blobs.pl.render_shapes(element="blobs_polygons", color="color_with_nan", na_color="gray").pl.show() - def test_plot_can_handle_mixed_numeric_and_color_data(self, sdata_blobs: SpatialData): - """Test handling of mixed numeric and color-like data.""" - sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_circles"] * sdata_blobs["table"].n_obs) - sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_circles" - sdata_blobs.shapes["blobs_circles"]["mixed_data"] = [1.0, 2.0, np.nan, "red", 5.0] +def test_plot_can_handle_non_numeric_radius_values(sdata_blobs: SpatialData): + """Test that non-numeric radius values are handled gracefully.""" + sdata_blobs.shapes["blobs_circles"]["radius_mixed"] = [1.0, "invalid", 3.0, np.nan, 5.0] + + sdata_blobs.pl.render_shapes(element="blobs_circles", color="red").pl.show() + + +def test_plot_can_handle_mixed_numeric_and_color_data(sdata_blobs: SpatialData): + """Test handling of mixed numeric and color-like data.""" + sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_circles"] * sdata_blobs["table"].n_obs) + sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_circles" + + sdata_blobs.shapes["blobs_circles"]["mixed_data"] = [1.0, 2.0, np.nan, "red", 5.0] - sdata_blobs.pl.render_shapes(element="blobs_circles", color="mixed_data", na_color="gray").pl.show() + sdata_blobs.pl.render_shapes(element="blobs_circles", color="mixed_data", na_color="gray").pl.show() From d52fbf23243fe74598865ea132a82d4b60d3639e Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Wed, 19 Nov 2025 17:57:29 +0100 Subject: [PATCH 11/14] fixed tests --- src/spatialdata_plot/pl/utils.py | 6 ++++-- ...Labels_respects_custom_colors_from_uns.png | Bin 32296 -> 32296 bytes ...ects_custom_colors_from_uns_for_points.png | Bin 0 -> 21008 bytes tests/pl/test_render_shapes.py | 4 ++++ 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 tests/_images/Points_respects_custom_colors_from_uns_for_points.png diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index 2e6382ae..95df77c0 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -425,8 +425,10 @@ def _as_rgba_array(x: Any) -> np.ndarray: fill_c[is_num] = cmap(used_norm(num[is_num])) # non-numeric entries as explicit colors - if (~is_num).any(): - fill_c[~is_num] = ColorConverter().to_rgba_array(c_series[~is_num].tolist()) + # treat missing values as na_color, and only convert valid color-like entries + non_numeric_mask = (~is_num) & c_series.notna() + if non_numeric_mask.any(): + fill_c[non_numeric_mask] = ColorConverter().to_rgba_array(c_series[non_numeric_mask].tolist()) # Case C: single color or list of color-like specs (strings or tuples) else: diff --git a/tests/_images/Labels_respects_custom_colors_from_uns.png b/tests/_images/Labels_respects_custom_colors_from_uns.png index 28ff080618ef999c38cab82a44b5f360b93d3065..6070966c02ea50ebe8cb4ade986c0be504e8b6d7 100644 GIT binary patch delta 43 zcmZ4ShjGOp#tEKs<~j-)B_##LR{Hw6i6sR&`6W4-NqYH3>H0n!l|weBAFKrcd2JCl delta 43 zcmZ4ShjGOp#tEKsW;zNPB_##LR{Hw6i6sR&`6W4-NqYH3>H4eJv>x7=ey|n*fR_?s diff --git a/tests/_images/Points_respects_custom_colors_from_uns_for_points.png b/tests/_images/Points_respects_custom_colors_from_uns_for_points.png new file mode 100644 index 0000000000000000000000000000000000000000..ddc3b5fabd57134b6347c041c61e5cf9cd5537e2 GIT binary patch literal 21008 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≈Zo_$pV3C&JvYB%g<1 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
Fx(K7zcW0!ZYbI0?naT8> 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 diff --git a/tests/_images/Labels_respects_custom_colors_from_uns_with_groups_and_palette.png b/tests/_images/Labels_respects_custom_colors_from_uns_with_groups_and_palette.png new file mode 100644 index 0000000000000000000000000000000000000000..88a05954e3cc4ad0d2ff62cd705040c6d3e0e4db GIT binary patch literal 18759 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 gJmip|kN+7L

+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 Date: Wed, 19 Nov 2025 18:35:51 +0100 Subject: [PATCH 12/14] changed test colors --- .gitignore | 3 +++ tests/pl/test_render_labels.py | 2 +- tests/pl/test_render_shapes.py | 8 ++++---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 580789d6..02a43f70 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,6 @@ tests/figures/ # other _version.py /temp/ + +# pixi +pixi.lock diff --git a/tests/pl/test_render_labels.py b/tests/pl/test_render_labels.py index b8e7f350..26377a72 100644 --- a/tests/pl/test_render_labels.py +++ b/tests/pl/test_render_labels.py @@ -383,7 +383,7 @@ def test_plot_respects_custom_colors_from_uns_with_groups_and_palette( "blobs_labels", color="category", groups=["a", "b"], - palette=["#111111", "#222222"], + palette=["red", "blue"], ).pl.show() diff --git a/tests/pl/test_render_shapes.py b/tests/pl/test_render_shapes.py index cc43cb14..d75cfa67 100644 --- a/tests/pl/test_render_shapes.py +++ b/tests/pl/test_render_shapes.py @@ -627,7 +627,7 @@ def test_plot_respects_custom_colors_from_uns(self, sdata_blobs: SpatialData): categories[:3] = ["a", "b", "c"] categories = pd.Categorical(categories, categories=["a", "b", "c"]) sdata_blobs["table"].obs["category"] = categories - sdata_blobs["table"].uns["category_colors"] = ["#800080", "#008000", "#FFFF00"] # purple, green, yellow + sdata_blobs["table"].uns["category_colors"] = ["red", "green", "blue"] # purple, green, yellow sdata_blobs.pl.render_shapes(shapes_name, color="category", table_name="table").pl.show() @@ -642,9 +642,9 @@ def test_plot_respects_custom_colors_from_uns_dict(self, sdata_blobs: SpatialDat categories = pd.Categorical(categories, categories=["a", "b", "c"]) sdata_blobs["table"].obs["category"] = categories sdata_blobs["table"].uns["category_colors"] = { - "a": "#800080", - "b": "#008000", - "c": "#FFFF00", + "a": "red", + "b": "green", + "c": "blue", } sdata_blobs.pl.render_shapes(shapes_name, color="category", table_name="table").pl.show() From a3d617048f7bb1508f3ada0b895deca5d0264d07 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Wed, 19 Nov 2025 18:44:49 +0100 Subject: [PATCH 13/14] changed test colors --- ...Shapes_respects_custom_colors_from_uns.png | Bin 32296 -> 16333 bytes tests/pl/test_render_labels.py | 38 +++--------------- 2 files changed, 5 insertions(+), 33 deletions(-) diff --git a/tests/_images/Shapes_respects_custom_colors_from_uns.png b/tests/_images/Shapes_respects_custom_colors_from_uns.png index 28ff080618ef999c38cab82a44b5f360b93d3065..742a1397ee4b2f02c5d197709969fd95062f74bb 100644 GIT binary patch literal 16333 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 literal 32296 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 wUpT{P>C?U Date: Wed, 19 Nov 2025 19:26:20 +0100 Subject: [PATCH 14/14] added images from runner --- ...Labels_respects_custom_colors_from_uns.png | Bin 32296 -> 29543 bytes ...olors_from_uns_with_groups_and_palette.png | Bin 0 -> 18759 bytes tests/pl/test_render_labels.py | 1 + tests/pl/test_render_shapes.py | 18 ------------------ 4 files changed, 1 insertion(+), 18 deletions(-) create mode 100644 tests/_images/Labels_respects_custom_colors_from_uns_with_groups_and_palette.png diff --git a/tests/_images/Labels_respects_custom_colors_from_uns.png b/tests/_images/Labels_respects_custom_colors_from_uns.png index 6070966c02ea50ebe8cb4ade986c0be504e8b6d7..d540e08f3a88af48912fb7d5a741f18ca644354e 100644 GIT binary patch literal 29543 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