From e7c5cd5ace443e727b0bc208c763c8ddc3ec1451 Mon Sep 17 00:00:00 2001 From: Greg Munday <100290135+mo-gregmunday@users.noreply.github.com> Date: Thu, 20 Jun 2024 09:43:58 +0100 Subject: [PATCH 01/87] CMIP6 climate patterns (#2785) Co-authored-by: Jon Lillis Co-authored-by: Emma Hogan --- .zenodo.json | 5 + CITATION.cff | 5 + .../figures/climate_patterns/patterns.png | Bin 0 -> 184589 bytes doc/sphinx/source/recipes/index.rst | 1 + .../recipes/recipe_climate_patterns.rst | 107 +++ esmvaltool/config-references.yml | 5 + .../climate_patterns/climate_patterns.py | 658 ++++++++++++++++++ .../diag_scripts/climate_patterns/plotting.py | 128 ++++ .../climate_patterns/sub_functions.py | 267 +++++++ .../recipes/recipe_climate_patterns.yml | 249 +++++++ .../references/huntingford2000climdyn.bibtex | 14 + esmvaltool/references/mathison2024gmd.bibtex | 10 + 12 files changed, 1449 insertions(+) create mode 100644 doc/sphinx/source/recipes/figures/climate_patterns/patterns.png create mode 100644 doc/sphinx/source/recipes/recipe_climate_patterns.rst create mode 100644 esmvaltool/diag_scripts/climate_patterns/climate_patterns.py create mode 100644 esmvaltool/diag_scripts/climate_patterns/plotting.py create mode 100644 esmvaltool/diag_scripts/climate_patterns/sub_functions.py create mode 100644 esmvaltool/recipes/recipe_climate_patterns.yml create mode 100644 esmvaltool/references/huntingford2000climdyn.bibtex create mode 100644 esmvaltool/references/mathison2024gmd.bibtex diff --git a/.zenodo.json b/.zenodo.json index c6a731981f..89a81326cb 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -380,6 +380,11 @@ "affiliation": "DLR, Germany", "name": "Bonnet, Pauline", "orcid": "0000-0003-3780-0784" + }, + { + "affiliation": "MetOffice, UK", + "name": "Munday, Gregory", + "orcid": "0000-0003-4750-9923" } ], "description": "ESMValTool: A community diagnostic and performance metrics tool for routine evaluation of Earth system models in CMIP.", diff --git a/CITATION.cff b/CITATION.cff index cd621538b7..7ed624d1d7 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -391,6 +391,11 @@ authors: family-names: Bonnet given-names: Pauline orcid: "https://orcid.org/0000-0003-3780-0784" + - + affiliation: "MetOffice, UK" + family-names: Munday + given-names: Gregory + orcid: "https://orcid.org/0000-0003-4750-9923" cff-version: 1.2.0 date-released: 2023-12-20 diff --git a/doc/sphinx/source/recipes/figures/climate_patterns/patterns.png b/doc/sphinx/source/recipes/figures/climate_patterns/patterns.png new file mode 100644 index 0000000000000000000000000000000000000000..396fd788302f32393bb3fc4e29ef6ee4812d3b5c GIT binary patch literal 184589 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

H)5r+ngrV+ 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 5: + axis[x_pos, y_pos].set_xlabel("Time") + + # January patterns + plt.subplot(3, 3, j + 1) + qplt.pcolormesh(cube[0]) + + plt.tight_layout() + plt.savefig(os.path.join(plot_path, "Patterns"), dpi=300) + plt.close() + + fig.tight_layout() + fig.savefig(os.path.join(plot_path, "Patterns Timeseries"), dpi=300) + + +def plot_timeseries(cubelist, plot_path, title, save_name): + """Plot timeseries and maps of climatologies, anomalies and patterns. + + Parameters + ---------- + cubelist : cubelist + input cubelist for plotting per variable + plot_path : path + path to plot_dir + title: str + title for the figure + save_name: str + name for the saved figure + + Returns + ------- + None + """ + fig, axs = plt.subplots(3, 3, figsize=(14, 12), sharex=True) + fig.suptitle(f"{title}", fontsize=18, y=0.98) + + for j, cube in enumerate(cubelist): + # determining plot positions + x_pos, y_pos = subplot_positions(j) + yrs = (1850 + np.arange(cube.shape[0])).astype("float") + months = np.arange(1, 13) + + # anomaly timeseries + avg_cube = area_statistics(cube, 'mean').data + if save_name == "Climatologies": + axs[x_pos, y_pos].plot(months, avg_cube) + else: + axs[x_pos, y_pos].plot(yrs, avg_cube) + axs[x_pos, + y_pos].set_ylabel(cube.long_name + " / " + str(cube.units)) + if j > 5: + axs[x_pos, y_pos].set_xlabel("Time") + + fig.tight_layout() + fig.savefig(os.path.join(plot_path, f"{save_name}"), dpi=300) diff --git a/esmvaltool/diag_scripts/climate_patterns/sub_functions.py b/esmvaltool/diag_scripts/climate_patterns/sub_functions.py new file mode 100644 index 0000000000..4b3fe00141 --- /dev/null +++ b/esmvaltool/diag_scripts/climate_patterns/sub_functions.py @@ -0,0 +1,267 @@ +# (C) Crown Copyright 2022-2024, Met Office. +"""Script containing relevant sub-functions for driving scripts. + +Author +------ +Gregory Munday (Met Office, UK) +""" + +import logging +import multiprocessing as mp +import os +from functools import partial +from pathlib import Path + +import iris +import iris.analysis.cartography +import iris.coord_categorisation +import dask as da + +logger = logging.getLogger(Path(__file__).stem) + + +def load_cube(filename): + """Load cube, remove any dimensions of length: 1. + + Parameters + ---------- + filename : path + path to load cube file + + Returns + ------- + cube : cube + a cube + """ + logger.debug("Loading %s", filename) + cube = iris.load_cube(filename) + cube = iris.util.squeeze(cube) + + return cube + + +def ocean_fraction_calc(sftlf): + """Calculate gridded land and ocean fractions. + + Parameters + ---------- + sftlf: cube + land-fraction cube from piControl experiment + + Returns + ------- + ocean_frac: cube + ocean_fraction cube for area-weights + land_frac: cube + land_fraction cube for area-weights + """ + sftlf.coord("latitude").coord_system = iris.coord_systems.GeogCS( + 6371229.0 + ) + sftlf.coord("longitude").coord_system = iris.coord_systems.GeogCS( + 6371229.0 + ) + sftof = 100 - sftlf + + ocean_frac = sftof / 100 + land_frac = sftlf / 100 + + return ocean_frac, land_frac + + +def area_avg_landsea(cube, + ocean_frac, + land_frac, + land=True, + return_cube=False): + """Calculate the global mean of a variable in a cube. + + Parameters + ---------- + cube : cube + input cube + ocean_frac : cube + ocean fraction cube, found from sftlf + land_frac : cube + land fraction cube, sftlf + land : bool + option to weight be land or ocean + return_cube : bool + option to return a cube or array + + Returns + ------- + cube2 : cube + cube with collapsed lat-lons, global mean over time + cube2.data : arr + array with collapsed lat-lons, global mean over time + """ + if not cube.coord("latitude").has_bounds(): + cube.coord("latitude").guess_bounds() + if not cube.coord("longitude").has_bounds(): + cube.coord("longitude").guess_bounds() + + global_weights = iris.analysis.cartography.area_weights( + cube, + normalize=False + ) + + if land is False: + ocean_frac.data = da.array.ma.masked_less(ocean_frac.core_data(), 0.01) + weights = iris.analysis.cartography.area_weights( + ocean_frac, + normalize=False + ) + ocean_area = ( + ocean_frac.collapsed( + ["latitude", "longitude"], iris.analysis.SUM, weights=weights + ) + / 1e12 + ) + cube2 = cube * global_weights * ocean_frac + + cube2 = ( + cube2.collapsed(["latitude", "longitude"], iris.analysis.SUM) + / 1e12 + / ocean_area + ) + + if land: + land_frac.data = da.array.ma.masked_less(land_frac.core_data(), 0.01) + weights = iris.analysis.cartography.area_weights( + land_frac, + normalize=False + ) + land_area = ( + land_frac.collapsed( + ["latitude", "longitude"], iris.analysis.SUM, weights=weights + ) + / 1e12 + ) + + # Iris is too strict so we need to use core_data in this calculation + cube2 = cube * global_weights * land_frac.core_data() + cube2 = ( + cube2.collapsed(["latitude", "longitude"], iris.analysis.SUM) + / 1e12 + / land_area + ) + + if return_cube: + return cube2 + + return cube2.data + + +def make_model_dirs(cfg, model): + """Create directories for each input model for saving. + + Parameters + ---------- + cfg: dict + Dictionary passed in by ESMValTool preprocessors + model : str + model name + + Returns + ------- + model_work_dir : path + path to specific model directory in work_dir + model_plot_dir : path + path to specific plot directory in plot_dir + """ + work_path = cfg["work_dir"] + plot_path = cfg["plot_dir"] + model_work_dir = os.path.join(work_path, model) + model_plot_dir = os.path.join(plot_path, model) + + if not os.path.exists(model_work_dir): + os.mkdir(model_work_dir) + if not os.path.exists(model_plot_dir): + os.mkdir(model_plot_dir) + + return model_work_dir, model_plot_dir + + +def rename_variables(cube, has_orig_vars=True, new_extension=""): + """Rename variables and a coord to fit in JULES framework. + + Parameters + ---------- + cube : cube + input cube + has_orig_vars : bool + if True, rename to new var names with correct extension + new_extension : str + extension to add to variable names + + Returns + ------- + cube : cube + cube with renamed variables + """ + original_var_names = ["tas", "range_tl1", "huss", "pr", + "sfcWind", "ps", "rsds", "rlds"] + new_var_names = ["tl1", "range_tl1", "ql1", "precip", + "wind", "pstar", "swdown", "lwdown"] + long_var_names = [ + "Air Temperature", + "Diurnal Range", + "Specific Humidity", + "Precipitation", + "Wind Speed", + "Surface Pressure", + "Surface Downwelling Shortwave Radiation", + "Surface Downwelling Longwave Radiation" + ] + for orig_var, new_var, long_var in zip( + original_var_names, new_var_names, long_var_names + ): + if has_orig_vars: + if cube.var_name == orig_var: + cube.var_name = f"{new_var}{new_extension}" + cube.coord("month_number").rename("imogen_drive") + return cube + else: + if cube.var_name == f"{new_var}_anom": + cube.rename(long_var) + cube.var_name = f"{new_var}_patt" + return cube + if cube.var_name == f"{new_var}_patt": + cube.rename(long_var) + cube.var_name = orig_var + cube.coord("imogen_drive").rename("month_number") + return cube + + return None + + +def parallelise(function, processes=None): + """Parallelise any function, by George Ford, Met Office. + + Parameters + ---------- + function : function + function to be parallelised + processes : int + number of threads to be used in parallelisation + + Returns + ------- + result : any + results of parallelised elements + """ + if processes is None: + processes = max(1, mp.cpu_count() - 1) + if processes <= 0: + processes = 1 + + def easy_parallise(func, sequence, cfg): + with mp.Pool(processes=processes) as pool: + config_wrapper = partial(func, cfg=cfg) + result = pool.map_async(config_wrapper, sequence).get() + pool.close() + pool.join() + return result + + return partial(easy_parallise, function) diff --git a/esmvaltool/recipes/recipe_climate_patterns.yml b/esmvaltool/recipes/recipe_climate_patterns.yml new file mode 100644 index 0000000000..08e0c51779 --- /dev/null +++ b/esmvaltool/recipes/recipe_climate_patterns.yml @@ -0,0 +1,249 @@ +# ESMValTool +# recipe_climate_patterns.yml +--- +documentation: + description: Generating climate patterns from CMIP6 models. + title: Generating Climate Patterns + + authors: + - munday_gregory + + maintainer: + - munday_gregory + + references: + - mathison2024gmd + - huntingford2000climdyn + +preprocessors: + global_mean_monthly: + monthly_statistics: + operator: mean + + regrid: + target_grid: {start_longitude: -180, end_longitude: 176.25, step_longitude: 3.75, + start_latitude: -55, end_latitude: 82.5, step_latitude: 2.5} + scheme: linear + + downscale_sftlf: + regrid: + target_grid: {start_longitude: -180, end_longitude: 176.25, step_longitude: 3.75, + start_latitude: -55, end_latitude: 82.5, step_latitude: 2.5} + scheme: linear + +monthly_global_settings: &monthly_global_settings + mip: Amon + project: CMIP6 + preprocessor: global_mean_monthly + +monthly_global_settings_day: &monthly_global_settings_day + mip: day + project: CMIP6 + preprocessor: global_mean_monthly + + +CMIP6_landfrac: &cmip6_landfrac + - {dataset: ACCESS-CM2, exp: piControl, ensemble: r1i1p1f1, grid: gn, institute: CSIRO-ARCCSS} + - {dataset: ACCESS-ESM1-5, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: AWI-CM-1-1-MR, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: BCC-CSM2-MR, exp: hist-resIPO,ensemble: r1i1p1f1, grid: gn} + - {dataset: CanESM5, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: CanESM5-CanOE, exp: piControl, ensemble: r1i1p2f1, grid: gn} + - {dataset: CanESM5-1, exp: piControl, ensemble: r1i1p1f1, grid: gn, institute: CCCma} + # - {dataset: CAS-ESM2-0, exp: piControl, ensemble: r1i1p1f1, grid: gn} # Global only + - {dataset: CMCC-ESM2, exp: piControl, ensemble: r1i1p1f1, grid: gn} + # - {dataset: CMCC-CM2-SR5, exp: piControl, ensemble: r1i1p1f1, grid: gn} # No tasmin/tasmax + - {dataset: CNRM-CM6-1, exp: piControl, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-CM6-1-HR, exp: piControl, ensemble: r1i1p1f2, grid: gr} + - {dataset: CNRM-ESM2-1, exp: piControl, ensemble: r1i1p1f2, grid: gr} + # - {dataset: E3SM-1-0, exp: piControl, ensemble: r1i1p1f1, grid: gr} # Tasmax == tasmin + - {dataset: EC-Earth3, exp: piControl, ensemble: r1i1p1f1, grid: gr} + # - {dataset: EC-Earth3-CC, exp: piControl, ensemble: r1i1p1f1, grid: gr} # Global only + - {dataset: EC-Earth3-Veg, exp: piControl, ensemble: r1i1p1f1, grid: gr} + # - {dataset: FGOALS-f3-L, exp: historical, ensemble: r1i1p1f1, grid: gr} # No tasmin/tasmax + - {dataset: FGOALS-g3, exp: piControl, ensemble: r1i1p1f1, grid: gn} + # - {dataset: FIO-ESM-2-0, exp: piControl, ensemble: r1i1p1f1, grid: gn} # Global only + - {dataset: GFDL-CM4, exp: piControl, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GFDL-ESM4, exp: ssp370, ensemble: r1i1p1f1, grid: gr1} + - {dataset: GISS-E2-1-H, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: GISS-E2-1-G, exp: piControl, ensemble: r1i1p5f1, grid: gn} + - {dataset: GISS-E2-2-G, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-LL, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: HadGEM3-GC31-MM, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: INM-CM4-8, exp: piControl, ensemble: r1i1p1f1, grid: gr1} + - {dataset: INM-CM5-0, exp: abrupt-4xCO2, ensemble: r1i1p1f1, grid: gr1} + - {dataset: IPSL-CM6A-LR, exp: piControl, ensemble: r1i1p1f1, grid: gr} + # - {dataset: KACE-1-0-G, exp: piControl, ensemble: r1i1p1f1, grid: gr} # Global only, weird tasmin/tasmax + # - {dataset: KIOST-ESM, exp: piControl, ensemble: r1i1p1f1, grid: gr} # Global only + - {dataset: MIROC6, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: MIROC-ES2L, exp: piControl, ensemble: r1i1p1f2, grid: gn} + - {dataset: MIROC-ES2H, exp: piControl, ensemble: r1i1p4f2, grid: gn} + - {dataset: MPI-ESM1-2-HR, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: MPI-ESM1-2-LR, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: MRI-ESM2-0, exp: piControl, ensemble: r1i1p1f1, grid: gn} + # - {dataset: NorESM2-LM, exp: piControl, ensemble: r1i1p1f1, grid: gn} # Global only, tasmax == tasmin + - {dataset: NorESM2-MM, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: TaiESM1, exp: piControl, ensemble: r1i1p1f1, grid: gn} + - {dataset: UKESM1-0-LL, exp: piControl, ensemble: r1i1p1f2, grid: gn} + +CMIP6_no_tasmax: &cmip6_no_tasmax + # - {dataset: E3SM-1-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2099} # bad tasmin/tasmax + # - {dataset: NorESM2-LM, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} # bad tasmin/tasmax + - {dataset: NorESM2-MM, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: TaiESM1, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + +CMIP6_DAY: &cmip6_day + # - {dataset: E3SM-1-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2099} # bad tasmin/tasmax + # - {dataset: NorESM2-LM, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} # bad tasmin/tasmax + - {dataset: NorESM2-MM, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: TaiESM1, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + +CMIP6_FULL: &cmip6_full + - {dataset: ACCESS-CM2, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100, institute: CSIRO-ARCCSS} + - {dataset: ACCESS-ESM1-5, exp: [historical, ssp585], ensemble: r3i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: AWI-CM-1-1-MR, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: BCC-CSM2-MR, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: CanESM5, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: CanESM5-1, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100, institute: CCCma} # optional extra + - {dataset: CanESM5-CanOE, exp: [historical, ssp585], ensemble: r1i1p2f1, grid: gn, start_year: 1850, end_year: 2100} + # - {dataset: CAS-ESM2-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} # Global only + - {dataset: CMCC-ESM2, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + # - {dataset: CMCC-CM2-SR5, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} # No tasmin/tasmax + - {dataset: CNRM-CM6-1, exp: [historical, ssp585], ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 2100} + - {dataset: CNRM-CM6-1-HR, exp: [historical, ssp585], ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 2100} + - {dataset: CNRM-ESM2-1, exp: [historical, ssp585], ensemble: r1i1p1f2, grid: gr, start_year: 1850, end_year: 2100} + - {dataset: EC-Earth3, exp: [historical, ssp585], ensemble: r11i1p1f1, grid: gr, start_year: 1850, end_year: 2100} + # - {dataset: EC-Earth3-CC, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} # Global only + - {dataset: EC-Earth3-Veg, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} + # - {dataset: FGOALS-f3-L, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} # No tasmin/tasmax + - {dataset: FGOALS-g3, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + # - {dataset: FIO-ESM-2-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} # Global only + - {dataset: GFDL-CM4, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 2100} + - {dataset: GFDL-ESM4, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 2100} + - {dataset: GISS-E2-1-H, exp: [historical, ssp585], ensemble: r3i1p1f2, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: GISS-E2-1-G, exp: [historical, ssp585], ensemble: r1i1p5f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: GISS-E2-2-G, exp: [historical, ssp585], ensemble: r1i1p3f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: HadGEM3-GC31-LL, exp: [historical, ssp585], ensemble: r1i1p1f3, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: HadGEM3-GC31-MM, exp: [historical, ssp585], ensemble: r1i1p1f3, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: INM-CM4-8, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 2100} + - {dataset: INM-CM5-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr1, start_year: 1850, end_year: 2100} + - {dataset: IPSL-CM6A-LR, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} + # - {dataset: KACE-1-0-G, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} # bad tasmin/tasmax + # - {dataset: KIOST-ESM, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gr, start_year: 1850, end_year: 2100} # optional extra + - {dataset: MIROC6, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: MIROC-ES2L, exp: [historical, ssp585], ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: MIROC-ES2H, exp: [historical, ssp585], ensemble: r1i1p4f2, grid: gn, start_year: 1850, end_year: 2100} # optional extra + - {dataset: MPI-ESM1-2-HR, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: MPI-ESM1-2-LR, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: MRI-ESM2-0, exp: [historical, ssp585], ensemble: r1i1p1f1, grid: gn, start_year: 1850, end_year: 2100} + - {dataset: UKESM1-0-LL, exp: [historical, ssp585], ensemble: r1i1p1f2, grid: gn, start_year: 1850, end_year: 2100} + +diagnostics: + monthly_timeseries: + description: Mean monthly variables + + variables: + + # sftlf: + # short_name: sftlf + # mip: fx + # project: CMIP6 + # preprocessor: downscale_sftlf + # additional_datasets: *cmip6_landfrac + + tasmax_585: + short_name: tasmax + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + tasmin_585: + short_name: tasmin + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + tas_585: + short_name: tas + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + huss_585: + short_name: huss + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + pr_585: + short_name: pr + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + sfcWind_585: + short_name: sfcWind + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + ps_585: + short_name: ps + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + rsds_585: + short_name: rsds + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + rlds_585: + short_name: rlds + <<: *monthly_global_settings + additional_datasets: *cmip6_full + + tasmax_585_day: + short_name: tasmax + <<: *monthly_global_settings_day + additional_datasets: *cmip6_day + + tasmin_585_day: + short_name: tasmin + <<: *monthly_global_settings_day + additional_datasets: *cmip6_day + + tas_585_no_tasmax: + short_name: tas + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + huss_585_no_tasmax: + short_name: huss + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + pr_585_no_tasmax: + short_name: pr + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + sfcWind_585_no_tasmax: + short_name: sfcWind + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + ps_585_no_tasmax: + short_name: ps + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + rsds_585_no_tasmax: + short_name: rsds + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + rlds_585_no_tasmax: + short_name: rlds + <<: *monthly_global_settings + additional_datasets: *cmip6_no_tasmax + + scripts: + climate_patterns_script: + script: climate_patterns/climate_patterns.py + jules_mode: false # options: true, false + parallelise: false # options: true, false + area: global # options global, land. If land, uncomment landfrac recipe settings diff --git a/esmvaltool/references/huntingford2000climdyn.bibtex b/esmvaltool/references/huntingford2000climdyn.bibtex new file mode 100644 index 0000000000..69bc072d49 --- /dev/null +++ b/esmvaltool/references/huntingford2000climdyn.bibtex @@ -0,0 +1,14 @@ +@article{huntingford2000, + title = {An analogue model to derive additional climate change scenarios from existing {GCM} simulations}, + volume = {16}, + issn = {1432-0894}, + url = {https://doi.org/10.1007/s003820000067}, + doi = {10.1007/s003820000067}, + abstract = {Changes in land surface driving variables, predicted by GCM transient climate change experiments, are confirmed to exhibit linearity in the global mean land temperature anomaly, ΔTl. The associated constants of proportionality retain spatial and seasonal characteristics of the GCM output, whilst ΔTlis related to radiative forcing anomalies. The resultant analogue model is shown to be robust between GCM runs and as such provides a computationally efficient technique of extending existing GCM experiments to a large range of climate change scenarios. As an example impacts study, the analogue model is used to drive a terrestrial ecosystem model, and predicted changes in terrestrial carbon are found to be similar to those when using GCM anomalies directly.}, + number = {8}, + journal = {Climate Dynamics}, + author = {Huntingford, C. and Cox, P. M.}, + month = aug, + year = {2000}, + pages = {575--586}, +} diff --git a/esmvaltool/references/mathison2024gmd.bibtex b/esmvaltool/references/mathison2024gmd.bibtex new file mode 100644 index 0000000000..a6090db6c7 --- /dev/null +++ b/esmvaltool/references/mathison2024gmd.bibtex @@ -0,0 +1,10 @@ +@Article{mathison2024, + AUTHOR = {Mathison, C. T. and Burke, E. and Kovacs, E. and Munday, G. and Huntingford, C. and Jones, C. and Smith, C. and Steinert, N. and Wiltshire, A. and Gohar, L. and Varney, R.}, + TITLE = {A rapid application emissions-to-impacts tool for scenario assessment: Probabilistic Regional Impacts from Model patterns and Emissions (PRIME)}, + JOURNAL = {EGUsphere}, + VOLUME = {2024}, + YEAR = {2024}, + PAGES = {1--28}, + URL = {https://egusphere.copernicus.org/preprints/2024/egusphere-2023-2932/}, + DOI = {10.5194/egusphere-2023-2932} +} From 304d38b8e1bdf5106714a436c74cec39dc6dd6ee Mon Sep 17 00:00:00 2001 From: Ed <146008263+mo-gill@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:07:12 +0100 Subject: [PATCH 02/87] Improve the formatting of the recipe documentation template (#3652) --- doc/sphinx/source/recipes/recipe_seaborn.rst | 4 ++-- doc/sphinx/source/recipes/recipe_template.rst.template | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/sphinx/source/recipes/recipe_seaborn.rst b/doc/sphinx/source/recipes/recipe_seaborn.rst index 3c8fa64357..4eb3c6571c 100644 --- a/doc/sphinx/source/recipes/recipe_seaborn.rst +++ b/doc/sphinx/source/recipes/recipe_seaborn.rst @@ -16,11 +16,11 @@ Available recipes and diagnostics Recipes are stored in recipes/ - * recipe_seaborn.yml +* recipe_seaborn.yml Diagnostics are stored in diag_scripts/ - * :ref:`seaborn_diag.py ` +* :ref:`seaborn_diag.py ` Variables diff --git a/doc/sphinx/source/recipes/recipe_template.rst.template b/doc/sphinx/source/recipes/recipe_template.rst.template index 55e28ddf7e..6c248ed5d7 100644 --- a/doc/sphinx/source/recipes/recipe_template.rst.template +++ b/doc/sphinx/source/recipes/recipe_template.rst.template @@ -14,11 +14,11 @@ Available recipes and diagnostics Recipes are stored in esmvaltool/recipes/ - * recipe_.yml +* recipe_.yml Diagnostics are stored in esmvaltool/diag_scripts// - * : one line scription +* : one line scription User settings in recipe From 967589c5eda541694e7090770a141632995a4ecf Mon Sep 17 00:00:00 2001 From: Lisa Bock Date: Fri, 21 Jun 2024 14:39:27 +0200 Subject: [PATCH 03/87] Fix recipe_check_obs to be aligned with DKRZ (#3673) --- .../recipes/examples/recipe_check_obs.yml | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index bfc6639bc9..10504a3692 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -23,7 +23,7 @@ diagnostics: variables: pr: additional_datasets: - - {project: OBS6, dataset: AGCD, mip: Amon, tier: 3, + - {project: OBS6, dataset: AGCD, mip: Amon, tier: 2, type: ground, version: v2-0-1} scripts: null @@ -539,7 +539,7 @@ diagnostics: rsutcs: additional_datasets: - {dataset: JRA-25, project: OBS6, mip: Amon, tier: 2, - type: reanaly, version: 1, start_year: 1979, end_year: 2013} + type: reanaly, version: 1, start_year: 1979, end_year: 2007} scripts: null Kadow2020: @@ -932,7 +932,7 @@ diagnostics: variables: od440aer: additional_datasets: - - {dataset: AERONET, project: OBS6, mip: AERmon, tier: 3, type: atmos, version: 20231021} + - {dataset: AERONET, project: OBS6, mip: AERmon, tier: 3, type: atmos, version: 20240406} scripts: null ANUClimate: @@ -1481,10 +1481,10 @@ diagnostics: short_name: rlns mip: E1hr frequency: 1hr - rlus_E1hr: - short_name: rlus - mip: E1hr - frequency: 1hr + #rlus_E1hr: + # short_name: rlus + # mip: E1hr + # frequency: 1hr rsds_E1hr: short_name: rsds mip: E1hr @@ -1495,10 +1495,10 @@ diagnostics: short_name: rsns mip: E1hr frequency: 1hr - rsus_E1hr: - short_name: rsus - mip: E1hr - frequency: 1hr + #rsus_E1hr: + # short_name: rsus + # mip: E1hr + # frequency: 1hr rss_E1hr: short_name: rss mip: E1hr @@ -1565,9 +1565,9 @@ diagnostics: rlns_Amon: short_name: rlns mip: Amon - rlus_Amon: - short_name: rlus - mip: Amon + #rlus_Amon: + # short_name: rlus + # mip: Amon rsds_Amon: short_name: rsds mip: Amon @@ -1577,9 +1577,9 @@ diagnostics: rsns_Amon: short_name: rsns mip: Amon - rsus_Amon: - short_name: rsus - mip: Amon + #rsus_Amon: + # short_name: rsus + # mip: Amon rss_Amon: short_name: rss mip: Amon From ba18b0498e22f8cf1391d35dcee13c8e9792094c Mon Sep 17 00:00:00 2001 From: Lisa Bock Date: Mon, 24 Jun 2024 07:50:58 +0200 Subject: [PATCH 04/87] Fix recipe_bock20jgr_fig_8-10.yml (#3665) --- esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_8-10.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_8-10.yml b/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_8-10.yml index a01020e709..bc277209d7 100644 --- a/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_8-10.yml +++ b/esmvaltool/recipes/bock20jgr/recipe_bock20jgr_fig_8-10.yml @@ -434,6 +434,8 @@ diagnostics: exp: historical ensemble: r1i1p1 mip: Amon + modeling_realm: atmos + frequency: mon additional_datasets: *cmip5_all fig_9_cmip6: @@ -446,6 +448,8 @@ diagnostics: exp: historical ensemble: r1i1p1f1 mip: Amon + modeling_realm: atmos + frequency: mon grid: gr additional_datasets: *cmip6_all From a9ba8e59d507a77e5ea707387801c028160ec5c1 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Mon, 24 Jun 2024 09:37:19 +0200 Subject: [PATCH 05/87] Add introduction material on the main documentation page (#3628) --- doc/sphinx/source/index.rst | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/doc/sphinx/source/index.rst b/doc/sphinx/source/index.rst index 9975172bc4..ac9b177fa9 100644 --- a/doc/sphinx/source/index.rst +++ b/doc/sphinx/source/index.rst @@ -6,6 +6,26 @@ Welcome to ESMValTool's documentation! ====================================== +To get a first impression of what ESMValTool and ESMValCore can do for you, +have a look at our blog posts +`Analysis-ready climate data with ESMValCore `_ +and +`ESMValTool: Recipes for solid climate science `_. + +A tutorial is available on https://tutorial.esmvaltool.org. + +A series of video lectures has been created by `ACCESS-NRI `_. +While these are tailored for ACCESS users, they are still very informative. + +.. raw:: html + + + +| +For more detailed information, the documentation is available below. + +Get in touch! Contact information is available :ref:`here `. + .. include:: _sidebar.rst.inc Indices and tables @@ -13,4 +33,3 @@ Indices and tables * :ref:`genindex` * :ref:`search` - From 6f3e3b5b44b588624ad1a2091e901f7cbb05e3a5 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Mon, 24 Jun 2024 10:23:23 +0200 Subject: [PATCH 06/87] Avoid warning in documentation build (#3675) --- doc/sphinx/source/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/sphinx/source/index.rst b/doc/sphinx/source/index.rst index ac9b177fa9..136c2eba08 100644 --- a/doc/sphinx/source/index.rst +++ b/doc/sphinx/source/index.rst @@ -22,6 +22,7 @@ While these are tailored for ACCESS users, they are still very informative. | + For more detailed information, the documentation is available below. Get in touch! Contact information is available :ref:`here `. From b946c9b5b8f17cc9477f5b033c227dfbc6536ada Mon Sep 17 00:00:00 2001 From: Emma Hogan Date: Mon, 24 Jun 2024 17:24:54 +0100 Subject: [PATCH 07/87] Use `importlib` as the import mode for `pytest` (#3672) --- .../aerosols/aod_aeronet_assess.py | 2 +- .../climate_patterns/climate_patterns.py | 16 ++++++++-------- esmvaltool/diag_scripts/ensclus/ens_anom.py | 11 +++++++++-- .../diag_scripts/ensclus/ens_eof_kmeans.py | 4 ++-- esmvaltool/diag_scripts/ensclus/ens_plots.py | 4 ++-- esmvaltool/diag_scripts/ensclus/ensclus.py | 17 +++++++++++------ esmvaltool/diag_scripts/examples/correlate.py | 2 +- .../iht_toa/single_model_diagnostics.py | 2 +- esmvaltool/diag_scripts/mpqb/mpqb_lineplot.py | 2 +- .../diag_scripts/mpqb/mpqb_lineplot_anncyc.py | 2 +- .../mpqb/mpqb_lineplot_growthrate.py | 2 +- .../weighting/climwip/calibrate_sigmas.py | 16 ++++++++-------- .../diag_scripts/weighting/climwip/main.py | 18 ++++++++++-------- .../diag_scripts/weighting/plot_utilities.py | 3 ++- .../weighting/weighted_temperature_graph.py | 5 ++++- .../weighting/weighted_temperature_map.py | 5 ++++- esmvaltool/diag_scripts/zmnam/zmnam.py | 9 ++++++--- setup.cfg | 1 + 18 files changed, 73 insertions(+), 48 deletions(-) diff --git a/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py b/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py index 27ab6b2714..3866e3c51a 100644 --- a/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py +++ b/esmvaltool/diag_scripts/aerosols/aod_aeronet_assess.py @@ -11,10 +11,10 @@ import matplotlib.pyplot as plt import numpy as np import scipy -from aero_utils import add_bounds, extract_pt from matplotlib import colors, gridspec from numpy import ma +from esmvaltool.diag_scripts.aerosols.aero_utils import add_bounds, extract_pt from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic from esmvaltool.diag_scripts.shared._base import get_plot_filename diff --git a/esmvaltool/diag_scripts/climate_patterns/climate_patterns.py b/esmvaltool/diag_scripts/climate_patterns/climate_patterns.py index 7fdb98a293..bc265cda00 100644 --- a/esmvaltool/diag_scripts/climate_patterns/climate_patterns.py +++ b/esmvaltool/diag_scripts/climate_patterns/climate_patterns.py @@ -28,24 +28,24 @@ """ import logging -from pathlib import Path import os +from pathlib import Path import iris import iris.coord_categorisation import iris.cube import numpy as np import sklearn.linear_model - -import sub_functions as sf -from plotting import ( - plot_timeseries, - plot_patterns -) from esmvalcore.preprocessor import ( area_statistics, + climate_statistics, extract_time, - climate_statistics +) + +import esmvaltool.diag_scripts.climate_patterns.sub_functions as sf +from esmvaltool.diag_scripts.climate_patterns.plotting import ( + plot_patterns, + plot_timeseries, ) from esmvaltool.diag_scripts.shared import run_diagnostic diff --git a/esmvaltool/diag_scripts/ensclus/ens_anom.py b/esmvaltool/diag_scripts/ensclus/ens_anom.py index a3b664d11a..ef9c303786 100644 --- a/esmvaltool/diag_scripts/ensclus/ens_anom.py +++ b/esmvaltool/diag_scripts/ensclus/ens_anom.py @@ -1,12 +1,19 @@ """Computation of ensemble anomalies based on a desired value.""" import os + import numpy as np from scipy import stats # User-defined packages -from read_netcdf import read_iris, save_n_2d_fields -from sel_season_area import sel_area, sel_season +from esmvaltool.diag_scripts.ensclus.read_netcdf import ( + read_iris, + save_n_2d_fields, +) +from esmvaltool.diag_scripts.ensclus.sel_season_area import ( + sel_area, + sel_season, +) def ens_anom(filenames, dir_output, name_outputs, varname, numens, season, diff --git a/esmvaltool/diag_scripts/ensclus/ens_eof_kmeans.py b/esmvaltool/diag_scripts/ensclus/ens_eof_kmeans.py index 2be17195b0..940af71278 100644 --- a/esmvaltool/diag_scripts/ensclus/ens_eof_kmeans.py +++ b/esmvaltool/diag_scripts/ensclus/ens_eof_kmeans.py @@ -10,8 +10,8 @@ from sklearn.cluster import KMeans # User-defined libraries -from eof_tool import eof_computation -from read_netcdf import read_n_2d_fields +from esmvaltool.diag_scripts.ensclus.eof_tool import eof_computation +from esmvaltool.diag_scripts.ensclus.read_netcdf import read_n_2d_fields def ens_eof_kmeans(dir_output, name_outputs, numens, numpcs, perc, numclus): diff --git a/esmvaltool/diag_scripts/ensclus/ens_plots.py b/esmvaltool/diag_scripts/ensclus/ens_plots.py index 55ad420b08..1b06acd671 100644 --- a/esmvaltool/diag_scripts/ensclus/ens_plots.py +++ b/esmvaltool/diag_scripts/ensclus/ens_plots.py @@ -3,12 +3,12 @@ import math import os +import cartopy.crs as ccrs import matplotlib.pyplot as plt import numpy as np -import cartopy.crs as ccrs # User-defined libraries -from read_netcdf import read_n_2d_fields +from esmvaltool.diag_scripts.ensclus.read_netcdf import read_n_2d_fields def ens_plots(dir_output, dir_plot, name_outputs, numclus, diff --git a/esmvaltool/diag_scripts/ensclus/ensclus.py b/esmvaltool/diag_scripts/ensclus/ensclus.py index a669a9a02d..df06ea411c 100644 --- a/esmvaltool/diag_scripts/ensclus/ensclus.py +++ b/esmvaltool/diag_scripts/ensclus/ensclus.py @@ -13,16 +13,21 @@ 20170710-mavilia_irene: routines written. """ -import os import logging +import os + import numpy as np -from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic -from esmvaltool.diag_scripts.shared import ProvenanceLogger, sorted_metadata # Import user diagnostic routines -from ens_anom import ens_anom -from ens_eof_kmeans import ens_eof_kmeans -from ens_plots import ens_plots +from esmvaltool.diag_scripts.ensclus.ens_anom import ens_anom +from esmvaltool.diag_scripts.ensclus.ens_eof_kmeans import ens_eof_kmeans +from esmvaltool.diag_scripts.ensclus.ens_plots import ens_plots +from esmvaltool.diag_scripts.shared import ( + ProvenanceLogger, + group_metadata, + run_diagnostic, + sorted_metadata, +) logger = logging.getLogger(os.path.basename(__file__)) diff --git a/esmvaltool/diag_scripts/examples/correlate.py b/esmvaltool/diag_scripts/examples/correlate.py index 171a24a51f..052f3d2bdc 100644 --- a/esmvaltool/diag_scripts/examples/correlate.py +++ b/esmvaltool/diag_scripts/examples/correlate.py @@ -6,7 +6,7 @@ from iris.analysis import MEAN from iris.analysis.stats import pearsonr -from diagnostic import plot_diagnostic +from esmvaltool.diag_scripts.examples.diagnostic import plot_diagnostic from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic logger = logging.getLogger(os.path.basename(__file__)) diff --git a/esmvaltool/diag_scripts/iht_toa/single_model_diagnostics.py b/esmvaltool/diag_scripts/iht_toa/single_model_diagnostics.py index fc917a8aa5..e56240c67a 100644 --- a/esmvaltool/diag_scripts/iht_toa/single_model_diagnostics.py +++ b/esmvaltool/diag_scripts/iht_toa/single_model_diagnostics.py @@ -16,8 +16,8 @@ import numpy as np from iris import NameConstraint from matplotlib import gridspec, rcParams -from poisson_solver import SphericalPoisson +from esmvaltool.diag_scripts.iht_toa.poisson_solver import SphericalPoisson from esmvaltool.diag_scripts.shared import ( group_metadata, run_diagnostic, diff --git a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot.py b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot.py index fe4cf2deb0..b08a2cd012 100644 --- a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot.py +++ b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot.py @@ -7,9 +7,9 @@ import iris import matplotlib.dates as mdates import matplotlib.pyplot as plt -from mpqb_utils import get_mpqb_cfg import esmvaltool.diag_scripts.shared.iris_helpers as ih +from esmvaltool.diag_scripts.mpqb.mpqb_utils import get_mpqb_cfg from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic from esmvaltool.diag_scripts.shared._base import ( ProvenanceLogger, diff --git a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_anncyc.py b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_anncyc.py index e2a5a662b2..d087499d60 100644 --- a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_anncyc.py +++ b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_anncyc.py @@ -6,8 +6,8 @@ import iris import matplotlib.pyplot as plt -from mpqb_utils import get_mpqb_cfg +from esmvaltool.diag_scripts.mpqb.mpqb_utils import get_mpqb_cfg from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic from esmvaltool.diag_scripts.shared._base import ( ProvenanceLogger, diff --git a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_growthrate.py b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_growthrate.py index a6ec136966..90662be72b 100644 --- a/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_growthrate.py +++ b/esmvaltool/diag_scripts/mpqb/mpqb_lineplot_growthrate.py @@ -8,9 +8,9 @@ import matplotlib.dates as mdates import matplotlib.pyplot as plt import numpy as np -from mpqb_utils import get_mpqb_cfg import esmvaltool.diag_scripts.shared.iris_helpers as ih +from esmvaltool.diag_scripts.mpqb.mpqb_utils import get_mpqb_cfg from esmvaltool.diag_scripts.shared import group_metadata, run_diagnostic from esmvaltool.diag_scripts.shared._base import ( ProvenanceLogger, diff --git a/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py b/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py index 0998346b22..1d85e1f95a 100644 --- a/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py +++ b/esmvaltool/diag_scripts/weighting/climwip/calibrate_sigmas.py @@ -6,7 +6,13 @@ import matplotlib.pyplot as plt import numpy as np import xarray as xr -from core_functions import ( +from scipy.optimize import brute + +from esmvaltool.diag_scripts.shared import ( + get_diagnostic_filename, + get_plot_filename, +) +from esmvaltool.diag_scripts.weighting.climwip.core_functions import ( area_weighted_mean, calculate_model_distances, calculate_weights, @@ -14,17 +20,11 @@ compute_overall_mean, weighted_quantile, ) -from io_functions import ( +from esmvaltool.diag_scripts.weighting.climwip.io_functions import ( read_metadata, read_model_data, read_model_data_ancestor, ) -from scipy.optimize import brute - -from esmvaltool.diag_scripts.shared import ( - get_diagnostic_filename, - get_plot_filename, -) logger = logging.getLogger(os.path.basename(__file__)) diff --git a/esmvaltool/diag_scripts/weighting/climwip/main.py b/esmvaltool/diag_scripts/weighting/climwip/main.py index 6b22399547..f46db62090 100644 --- a/esmvaltool/diag_scripts/weighting/climwip/main.py +++ b/esmvaltool/diag_scripts/weighting/climwip/main.py @@ -10,15 +10,22 @@ import numpy as np import seaborn as sns import xarray as xr -from calibrate_sigmas import calibrate_performance_sigma -from core_functions import ( + +from esmvaltool.diag_scripts.shared import ( + get_diagnostic_filename, + get_plot_filename, + run_diagnostic, +) +from esmvaltool.diag_scripts.weighting.climwip.calibrate_sigmas import ( + calibrate_performance_sigma, ) +from esmvaltool.diag_scripts.weighting.climwip.core_functions import ( area_weighted_mean, calculate_model_distances, calculate_weights, combine_ensemble_members, compute_overall_mean, ) -from io_functions import ( +from esmvaltool.diag_scripts.weighting.climwip.io_functions import ( log_provenance, read_metadata, read_model_data, @@ -27,11 +34,6 @@ read_observation_data_ancestor, ) -from esmvaltool.diag_scripts.shared import ( - get_diagnostic_filename, - get_plot_filename, - run_diagnostic, -) logger = logging.getLogger(os.path.basename(__file__)) diff --git a/esmvaltool/diag_scripts/weighting/plot_utilities.py b/esmvaltool/diag_scripts/weighting/plot_utilities.py index 706dfd64c9..a071a3c7f0 100644 --- a/esmvaltool/diag_scripts/weighting/plot_utilities.py +++ b/esmvaltool/diag_scripts/weighting/plot_utilities.py @@ -3,7 +3,8 @@ import xarray as xr -from climwip.core_functions import weighted_quantile +from esmvaltool.diag_scripts.weighting.climwip.core_functions import ( + weighted_quantile, ) def read_weights(filename: str) -> dict: diff --git a/esmvaltool/diag_scripts/weighting/weighted_temperature_graph.py b/esmvaltool/diag_scripts/weighting/weighted_temperature_graph.py index 5b871283d7..f5f1086e1e 100644 --- a/esmvaltool/diag_scripts/weighting/weighted_temperature_graph.py +++ b/esmvaltool/diag_scripts/weighting/weighted_temperature_graph.py @@ -10,13 +10,16 @@ import matplotlib.pyplot as plt import numpy as np import xarray as xr -from climwip.io_functions import log_provenance, read_model_data from esmvaltool.diag_scripts.shared import ( get_diagnostic_filename, get_plot_filename, run_diagnostic, ) +from esmvaltool.diag_scripts.weighting.climwip.io_functions import ( + log_provenance, + read_model_data, +) from esmvaltool.diag_scripts.weighting.plot_utilities import ( calculate_percentiles, read_metadata, diff --git a/esmvaltool/diag_scripts/weighting/weighted_temperature_map.py b/esmvaltool/diag_scripts/weighting/weighted_temperature_map.py index 7a161d2535..667a382d94 100644 --- a/esmvaltool/diag_scripts/weighting/weighted_temperature_map.py +++ b/esmvaltool/diag_scripts/weighting/weighted_temperature_map.py @@ -11,13 +11,16 @@ import matplotlib.pyplot as plt import numpy as np from cartopy.mpl.ticker import LatitudeFormatter, LongitudeFormatter -from climwip.io_functions import log_provenance, read_model_data from esmvaltool.diag_scripts.shared import ( get_diagnostic_filename, get_plot_filename, run_diagnostic, ) +from esmvaltool.diag_scripts.weighting.climwip.io_functions import ( + log_provenance, + read_model_data, +) from esmvaltool.diag_scripts.weighting.plot_utilities import ( calculate_percentiles, read_metadata, diff --git a/esmvaltool/diag_scripts/zmnam/zmnam.py b/esmvaltool/diag_scripts/zmnam/zmnam.py index d86ee48458..c0450c117a 100644 --- a/esmvaltool/diag_scripts/zmnam/zmnam.py +++ b/esmvaltool/diag_scripts/zmnam/zmnam.py @@ -20,9 +20,12 @@ from esmvaltool.diag_scripts.shared import ProvenanceLogger, run_diagnostic # Import zmnam diagnostic routines -from zmnam_calc import zmnam_calc -from zmnam_plot import zmnam_plot -from zmnam_preproc import (zmnam_preproc, zmnam_preproc_clean) +from esmvaltool.diag_scripts.zmnam.zmnam_calc import zmnam_calc +from esmvaltool.diag_scripts.zmnam.zmnam_plot import zmnam_plot +from esmvaltool.diag_scripts.zmnam.zmnam_preproc import ( + zmnam_preproc, + zmnam_preproc_clean, +) logger = logging.getLogger(__name__) diff --git a/setup.cfg b/setup.cfg index c738c5d716..e28f8079a0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,6 @@ [tool:pytest] addopts = + --import-mode=importlib --doctest-modules --ignore=doc/sphinx/source/conf.py --cov=esmvaltool From 0c323e4a4ecc5304f075a97168f10294b0da41a9 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:37:20 +0200 Subject: [PATCH 08/87] Prevent overlapping time axis tick labels in monitoring recipe (#3682) --- .../diag_scripts/monitor/multi_datasets.py | 90 ++++++++++--------- .../monitor/recipe_monitor_with_refs.yml | 6 +- 2 files changed, 54 insertions(+), 42 deletions(-) diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index a760a312f6..c87fd26cac 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -138,12 +138,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the datasets plotted in the - corresponding plot, e.g., ``{short_name}``, ``{exp}``. Facets like - ``{project}`` that vary between the different datasets will be transformed - to something like ``ambiguous_project``. Examples: ``title: 'Awesome Plot - of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. time_format: str, optional (default: None) :func:`~datetime.datetime.strftime` format string that is used to format the time axis using :class:`matplotlib.dates.DateFormatter`. If ``None``, @@ -171,12 +171,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the datasets plotted in the - corresponding plot, e.g., ``{short_name}``, ``{exp}``. Facets like - ``{project}`` that vary between the different datasets will be transformed - to something like ``ambiguous_project``. Examples: ``title: 'Awesome Plot - of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. Configuration options for plot type ``map`` ------------------------------------------- @@ -247,10 +247,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the corresponding dataset, e.g., - ``{project}``, ``{short_name}``, ``{exp}``. Examples: ``title: 'Awesome - Plot of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. rasterize: bool, optional (default: True) If ``True``, use rasterization_ for map plots to produce smaller files. This is only relevant for vector graphics (e.g., ``output_file_type: @@ -326,10 +328,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the corresponding dataset, e.g., - ``{project}``, ``{short_name}``, ``{exp}``. Examples: ``title: 'Awesome - Plot of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. rasterize: bool, optional (default: True) If ``True``, use rasterization_ for profile plots to produce smaller files. This is only relevant for vector graphics (e.g., ``output_file_type: @@ -378,12 +382,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the datasets plotted in the - corresponding plot, e.g., ``{short_name}``, ``{exp}``. Facets like - ``{project}`` that vary between the different datasets will be transformed - to something like ``ambiguous_project``. Examples: ``title: 'Awesome Plot - of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. show_y_minor_ticklabels: bool, optional (default: False) Show tick labels for the minor ticks on the Y axis. @@ -409,12 +413,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the datasets plotted in the - corresponding plot, e.g., ``{short_name}``, ``{exp}``. Facets like - ``{project}`` that vary between the different datasets will be transformed - to something like ``ambiguous_project``. Examples: ``title: 'Awesome Plot - of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. Configuration options for plot type ``hovmoeller_z_vs_time`` ------------------------------------------------------------ @@ -476,10 +480,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the corresponding dataset, e.g., - ``{project}``, ``{short_name}``, ``{exp}``. Examples: ``title: 'Awesome - Plot of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. rasterize: bool, optional (default: True) If ``True``, use rasterization_ for profile plots to produce smaller files. This is only relevant for vector graphics (e.g., ``output_file_type: @@ -559,10 +565,12 @@ pyplot_kwargs: dict, optional Optional calls to functions of :mod:`matplotlib.pyplot`. Dictionary keys are functions of :mod:`matplotlib.pyplot`. Dictionary values are used as - single argument for these functions. String arguments can include facets in - curly brackets which will be derived from the corresponding dataset, e.g., - ``{project}``, ``{short_name}``, ``{exp}``. Examples: ``title: 'Awesome - Plot of {long_name}'``, ``xlabel: '{short_name}'``, ``xlim: [0, 5]``. + argument(s) for these functions (if values are dictionaries, these are + interpreted as keyword arguments; otherwise a single argument is assumed). + String arguments can include facets in curly brackets which will be derived + from the corresponding dataset, e.g., ``{project}``, ``{short_name}``, + ``{exp}``. Examples: ``title: 'Awesome Plot of {long_name}'``, ``xlabel: + '{short_name}'``, ``xlim: [0, 5]``. rasterize: bool, optional (default: True) If ``True``, use rasterization_ for profile plots to produce smaller files. This is only relevant for vector graphics (e.g., ``output_file_type: @@ -1791,6 +1799,8 @@ def _process_pyplot_kwargs(self, plot_type, dataset): ) if arg is None: getattr(plt, func)() + elif isinstance(arg, dict): + getattr(plt, func)(**arg) else: getattr(plt, func)(arg) diff --git a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml index 681277310c..48c5153287 100644 --- a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml +++ b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml @@ -225,7 +225,7 @@ diagnostics: ta: preprocessor: global_mean_extract_levels mip: Amon - timerange: '2000/2004' + timerange: '2000/2005' scripts: plot: <<: *plot_multi_dataset_default @@ -238,6 +238,8 @@ diagnostics: log_y: false pyplot_kwargs: ylim: [0, 20000] + xticks: + rotation: 25 plot_time_vs_lat_with_references: description: Plot Hovmoeller time vs. latitude including reference datasets. @@ -245,7 +247,7 @@ diagnostics: tas: mip: Amon preprocessor: zonal_mean_2d - timerange: '2000/2004' + timerange: '2000/2005' scripts: plot: <<: *plot_multi_dataset_default From baa34009a6332e9e3ca4c9e2a09e385394dca1e2 Mon Sep 17 00:00:00 2001 From: Emma Hogan Date: Thu, 27 Jun 2024 16:51:54 +0100 Subject: [PATCH 09/87] Pin R <4.3.0 (#3689) --- environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment.yml b/environment.yml index c3d746f34f..7f37b52448 100644 --- a/environment.yml +++ b/environment.yml @@ -103,7 +103,7 @@ dependencies: # R and dependencies - cdo - - r-base >=3.5 + - r-base >=3.5,<4.3.0 - r-abind - r-akima - r-climdex.pcic From bc25f8723634a8f57f43fd89646c8da1f78ba8cd Mon Sep 17 00:00:00 2001 From: Emma Hogan Date: Tue, 2 Jul 2024 10:00:49 +0100 Subject: [PATCH 10/87] Update `scipy.integrate.simps` import (#3704) --- esmvaltool/diag_scripts/emergent_constraints/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/esmvaltool/diag_scripts/emergent_constraints/__init__.py b/esmvaltool/diag_scripts/emergent_constraints/__init__.py index 545a07d9b5..5a03750bbe 100644 --- a/esmvaltool/diag_scripts/emergent_constraints/__init__.py +++ b/esmvaltool/diag_scripts/emergent_constraints/__init__.py @@ -9,10 +9,16 @@ import matplotlib.pyplot as plt import numpy as np import pandas as pd +import scipy import seaborn as sns import yaml +from packaging.version import Version from scipy import integrate from scipy.stats import linregress +if Version(scipy.version.version) < Version('1.14.0'): + from scipy.integrate import simps as simpson +else: + from scipy.integrate import simpson from esmvaltool.diag_scripts.shared import ( ProvenanceLogger, @@ -1673,7 +1679,7 @@ def cdf(data, pdf): """ idx_range = range(1, len(data) + 1) - cum_dens = [integrate.simps(pdf[:idx], data[:idx]) for idx in idx_range] + cum_dens = [simpson(pdf[:idx], x=data[:idx]) for idx in idx_range] return np.array(cum_dens) From 45442c2c072e8bb645edce3264d32b35eea57579 Mon Sep 17 00:00:00 2001 From: Ed <146008263+mo-gill@users.noreply.github.com> Date: Wed, 3 Jul 2024 12:35:49 +0100 Subject: [PATCH 11/87] Update all pre-commit versions (#3678) Co-authored-by: Emma Hogan --- .pre-commit-config.yaml | 14 +++++++------- environment.yml | 18 ++++++++---------- environment_osx.yml | 14 +++++++------- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f13cea8c72..f3ac440f05 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,7 +8,7 @@ exclude: | ^esmvaltool/diag_scripts/cvdp/ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.6.0 hooks: - id: check-added-large-files - id: check-ast @@ -19,7 +19,7 @@ repos: - id: trailing-whitespace args: [--markdown-linebreak-ext=md] - repo: https://github.com/adrienverge/yamllint - rev: 'v1.31.0' + rev: 'v1.35.1' hooks: - id: yamllint - repo: local # nclcodestyle is installed alongside ESMValTool @@ -30,16 +30,16 @@ repos: language: system files: '\.(ncl|NCL)$' - repo: https://github.com/lorenzwalthert/precommit/ # Checks for R - rev: 'v0.3.2.9007' + rev: 'v0.4.2' hooks: - id: style-files # styler - id: lintr - repo: https://github.com/codespell-project/codespell - rev: 'v2.2.4' + rev: 'v2.3.0' hooks: - id: codespell - repo: https://github.com/PyCQA/isort - rev: '5.12.0' + rev: '5.13.2' hooks: - id: isort - repo: https://github.com/pre-commit/mirrors-yapf @@ -49,10 +49,10 @@ repos: additional_dependencies: - 'toml' - repo: https://github.com/myint/docformatter - rev: 'v1.6.5' + rev: 'v1.7.5' hooks: - id: docformatter - repo: https://github.com/pycqa/flake8 - rev: '6.0.0' + rev: '5.0.4' hooks: - id: flake8 diff --git a/environment.yml b/environment.yml index 7f37b52448..0d9d82a5c9 100644 --- a/environment.yml +++ b/environment.yml @@ -70,7 +70,7 @@ dependencies: - xlsxwriter - zarr # Python packages needed for unit testing - - flake8 + - flake8 ==5.0.4 - pytest >=3.9,!=6.0.0rc1,!=6.0.0 - pytest-cov - pytest-env @@ -84,16 +84,16 @@ dependencies: - sphinx >=6.1.3 - pydata-sphinx-theme # Python packages needed for development - - codespell - - docformatter + - codespell ==2.3.0 + - docformatter ==1.7.5 - imagehash - - isort + - isort ==5.13.2 - pre-commit - prospector - pyroma # - vprof not on conda-forge - - yamllint - - yapf + - yamllint ==1.35.1 + - yapf ==0.32.0 # NCL and dependencies - ncl @@ -113,7 +113,6 @@ dependencies: - r-functional - r-ggplot2 - r-gridextra - - r-lintr - r-logging - r-mapproj - r-maps @@ -127,13 +126,12 @@ dependencies: - r-s2dverification - r-snow - r-spei - - r-styler - r-udunits2 - r-yaml # R packages needed for development - r-git2r # dependency of lintr - - r-lintr - - r-styler + - r-lintr ==3.1.2 + - r-styler ==1.10.3 # Julia (dependencies installed by separate script) - julia diff --git a/environment_osx.yml b/environment_osx.yml index 92eb9fed93..049017a30c 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -24,8 +24,8 @@ dependencies: - esmpy >=8.6.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - esmvalcore 2.10.* - fiona - - fsspec - fire + - fsspec - gdal - iris >=3.6.1 - iris-esmf-regrid >=0.10.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 @@ -70,7 +70,7 @@ dependencies: - xlsxwriter - zarr # Python packages needed for unit testing - - flake8 + - flake8 ==5.0.4 - pytest >=3.9,!=6.0.0rc1,!=6.0.0 - pytest-cov - pytest-env @@ -84,13 +84,13 @@ dependencies: - sphinx >=6.1.3 - pydata-sphinx-theme # Python packages needed for development - - codespell - - docformatter + - codespell ==2.3.0 + - docformatter ==1.7.5 - imagehash - - isort + - isort ==5.13.2 - pre-commit - prospector - pyroma # - vprof not on conda-forge - - yamllint - - yapf + - yamllint ==1.35.1 + - yapf ==0.32.0 From 5f72637a57b4767097be439f914ee5632274c19b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2024 13:13:03 +0100 Subject: [PATCH 12/87] [Condalock] Update Linux condalock file (#3698) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 536 ++++++++++++++++++++++---------------------- 1 file changed, 270 insertions(+), 266 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index c7670dd5cd..200d0023c2 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 6b13b0874631d4e45248b978f87b5b87d49cf73206e43bd1989bedfb09b60743 +# input_hash: 754e4bbbc79880492aef3ffa7778e09114b9822be948dbbc8a449432b636e284 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/_py-xgboost-mutex-2.0-gpu_0.tar.bz2#7702188077361f43a4d61e64c694f850 @@ -12,144 +12,132 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_17.conda#d731b543793afc0433c4fd593e693fce -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_3.conda#7c1062eaa78dec4ea8a9a988dbda6045 -https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.85.0-ha770c72_1.conda#012455a6eddcbf487ef0ddd1715f0b80 -https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.2.0-hceb6213_107.conda#2cc37ba482c6321237ce72329e1aaea2 -https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.2.0-hceb6213_107.conda#2b409e9645fb3d69115d04496d1219cc -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 -https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.2-ha770c72_0.conda#8c924f0b7f3e064b1c954a08e7c32fba +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.85.0-ha770c72_2.conda#a685407e4876ad2327fcfc0024b5e204 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.2.1-ha770c72_0.conda#b39b12d3809e4042f832b76192e0e7e8 https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.7-0.tar.bz2#23acfc5a339a6a34cc2241f64e4111be https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 +https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.1.0-h5d3d1c9_100.conda#6d4f65dc440f7b3422113b135be19703 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d +https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.1.0-h5d3d1c9_100.conda#cedc62fd8c4cf28f23d3cd5db7839e99 https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.12-he073ed8_17.conda#595db67e32b276298ff3d94d07d47fbf https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_3.conda#2b0c0d451353cde73295d799ea8886b1 +https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_7.conda#3f840c7ed70a96b5ebde8044b2f36f32 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 -https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.0-hac33072_0.conda#93a3bf248e5bc729807db198a9c89f07 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.15-hd590300_0.conda#ad8955a300fd09e97e76c38638ac7157 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f -https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 -https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2#cddaf2c63ea4a5901cf09524c490ecdc -https://conda.anaconda.org/conda-forge/linux-64/ghostscript-10.03.1-h59595ed_0.conda#be973b4541601270b77232bc46249a3a https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 -https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_1.conda#e358c7c5f6824c272b5034b3816438a7 -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c -https://conda.anaconda.org/conda-forge/linux-64/gtest-1.14.0-h00ab1b0_1.conda#d362a81b815334cc921b9362782881f3 -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h7ab15ed_0.conda#9961b1f100c3b6852bd97c9233d06979 https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_h59595ed_0.conda#682bdbe046a68f749769b492f3625c5c -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda#172bcc51059416e7ce99e7b528cede83 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 https://conda.anaconda.org/conda-forge/linux-64/libnl-3.9.0-hd590300_0.conda#d27c451db4f1d3c983c78167d2fdabc2 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libopenlibm4-0.8.1-hd590300_1.conda#e6af610e01d04927a5060c95ce4e0875 -https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.2.0-h6ddb7a1_7.conda#ecba88d2296bf40186a9dc65bdf7b621 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 -https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2#a730b2badd586580c5752cc73842e068 https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2#ede4266dc02e875fe1ea77b25dd43747 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda#049b7df8bae5e184d1de42cdf64855f8 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 https://conda.anaconda.org/conda-forge/linux-64/make-4.3-hd18ef5c_1.tar.bz2#4049ebfd3190b580dffe76daed26155a -https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h59595ed_0.conda#a7b444a6e008b804b35521895e3440e2 https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda#40ccb8318df2500f83bd868dd8fcd201 -https://conda.anaconda.org/conda-forge/linux-64/nccl-2.21.5.1-h6103f9b_0.conda#05381b62b2faed9609fb68b27cd575aa https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c -https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_1.conda#b1e9d076f14e8d776213fd5047b4c3d9 https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h36c2ea0_1008.tar.bz2#fbef41ff6a4c8140c30057466a1cdd47 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1 -https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.0-hac33072_0.conda#2a08edb7cd75e56623f2712292a97325 https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024a-h3f72095_0.conda#32146e34aaec3745a08b6f49af3f41b0 -https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 -https://conda.anaconda.org/conda-forge/linux-64/xorg-makedepend-1.0.9-h59595ed_0.conda#71c756cfcc6649ed7614eb07712bfce0 https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h59595ed_0.conda#fd486bffbf0d6841cf1456a8f2e3a995 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.0.7-h0b41bf4_0.conda#49e8329110001f04923fe7e864990b0c +https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.11-heb1d5e4_0.conda#98784bb35b316e2ba8698f4a75326e9a https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-hce8ee76_3.conda#b19224a5179ecb512c4aac9f8a6d57a7 https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.15-hce8ee76_3.conda#0c4f0205a1ae4ca6c89af922ec54271c https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-hce8ee76_3.conda#9aa734a17b9b0b793c7696435fe7789a +https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 -https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.2.0-h9eb54c0_7.conda#57f0fcb5d432d5f98be5705e2bf65352 -https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.0-hed5481d_0.conda#a9ea19c48e11754899299f8123070f4e +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 +https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2#cddaf2c63ea4a5901cf09524c490ecdc +https://conda.anaconda.org/conda-forge/linux-64/ghostscript-10.03.1-h59595ed_0.conda#be973b4541601270b77232bc46249a3a +https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c +https://conda.anaconda.org/conda-forge/linux-64/gtest-1.14.0-h00ab1b0_1.conda#d362a81b815334cc921b9362782881f3 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 -https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.0.4-hd2f8ffe_4.conda#cb911b3e0d863ca9caafd767525f7cac +https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_h59595ed_0.conda#682bdbe046a68f749769b492f3625c5c +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d +https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda#b63d9b6da3653179a278077f0de20014 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd -https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda#3eb5f16bcc8a02892199aa63555c731f +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda#73301c133ded2bf71906aa2104edae8b https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 -https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 -https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.conda#264f9a3a4ea52c8f4d3e8ae1213a3335 +https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.1.0-hcba0ae0_0.conda#88343f89ea4280a79ddd9e755992743d https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 +https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2#a730b2badd586580c5752cc73842e068 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.0.3-cuda118_h09a87be_4.conda#bfaf927bc7665d327ff5b8e5b8dbf2df -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b -https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_1.conda#8083b20f566639c22f78bcd6ca35b276 +https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h59595ed_0.conda#a7b444a6e008b804b35521895e3440e2 +https://conda.anaconda.org/conda-forge/linux-64/nccl-2.22.3.1-hee583db_0.conda#5d4192971be1643f333582dc79a29393 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.8.1-hd590300_1.conda#6eba22eb06d69e53d0ca01eef42bc675 +https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 -https://conda.anaconda.org/conda-forge/linux-64/rdma-core-51.1-he02047a_0.conda#d3729d689f9febadb17462936a90e2e9 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/rdma-core-52.0-he02047a_0.conda#b607b8e2361ead79785d77eb4b21e8cc https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.12-h06160fa_0.conda#bf1899cfd6dea061a220fa7e96a1f4bd +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1 +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.0-hac33072_0.conda#2a08edb7cd75e56623f2712292a97325 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 +https://conda.anaconda.org/conda-forge/linux-64/xorg-makedepend-1.0.9-h59595ed_0.conda#71c756cfcc6649ed7614eb07712bfce0 +https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-hac33072_1.conda#df96b7266e49529d82de467b23977452 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.7-hbfbeace_6.conda#d6382461de9a91a2665e964f92d8da0a @@ -159,28 +147,30 @@ https://conda.anaconda.org/conda-forge/linux-64/bwidget-1.9.14-ha770c72_1.tar.bz https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.12.0-hb4ffafa_0.conda#1a9b16afb84d734a1bb2d196c308d477 https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda#ee3e687b78b778db7b304e5b00a4dca6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 -https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-13.2.0-h738fc78_7.conda#0a9c20316a67fbfee9d5778ed0aff24d -https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.2.0-h2a599c4_7.conda#2ac5f82e4fd21f968b370e54bb839a4e +https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.1.0-h3c94d91_0.conda#b0dd0de49e0f3e34f3f636e5c7d149fe +https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hebf79cf_1003.conda#23bb57b64a629bc3b33379beece7f0d7 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.0.4-hd2f8ffe_4.conda#cb911b3e0d863ca9caafd767525f7cac https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.7.1-hca3a8ce_0.conda#6af97ac284ffaf76d8f63cc1f9d64f7a -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h5622ce7_1001.conda#fc2d5b79c2d3f8568fbab31db7ae02f3 -https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda#3eb5f16bcc8a02892199aa63555c731f https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.27-pthreads_h384dd9e_0.conda#025629e15edccee84df4713ce69192e5 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 +https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 +https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.conda#264f9a3a4ea52c8f4d3e8ae1213a3335 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 -https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 -https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.6-h9d307f2_0.conda#857b62ff5fc3b6282189798bf06aa2ca -https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda#949c4a82290ee58b3c970cef4bcfd4ad -https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.0-h1e5e2c1_0.conda#53e8f030579d34e1a36a735d527c021f +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.0.3-cuda118_h09a87be_4.conda#bfaf927bc7665d327ff5b8e5b8dbf2df +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 +https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 +https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_1.conda#8083b20f566639c22f78bcd6ca35b276 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.101-h593d115_0.conda#b24ab6abea1bdc28d646336a03d15392 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b -https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda +https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 -https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.16.3-hf0b6e87_3.conda#1e28da846782f91a696af3952a2472f9 -https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h0c5db8f_5.conda#9464044754ea25557a9c93f0327d90a6 +https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h8bc8fbc_6.conda#dff3627fec2c0584ded391205295abf0 https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-ha691c75_8.conda#3f9bc6137b240642504a6c9b07a10c25 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec @@ -216,14 +206,19 @@ https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-1.1.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h743c826_0.conda#12e6988845706b2cfbc3bc35c9a61a95 https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h459d7ec_0.conda#b267e553a337e1878512621e374845c5 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_0.tar.bz2#6b1f32359fc5d2ab7b491d0029bfffeb +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 +https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.1.0-he4a1faa_0.conda#a9ce7cd0848a93a8df88c1fc0ac84d9d +https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.1.0-h2879b86_0.conda#47d6de998d7a285b98b60bce2fecb54b +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd8ed1ab_6.conda#2ed1fe4b9079da97c44cfe9c2e5078fd +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -231,15 +226,16 @@ https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.10.0-py311h459d7ec_0.conda#d39020c78fd00ed774ff9c876e8aba07 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.1-hebfc3b9_0.conda#ddd09e8904fde46b85f41896621803e6 -https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h5622ce7_1001.conda#fc2d5b79c2d3f8568fbab31db7ae02f3 +https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-hdffd6e0_0.conda#a8661c87c873d8c8f90479318ebf0a17 -https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.42.0-py311ha6695c7_1.conda#d6e13a53b4f0cc38f4a348f47bfd5b97 +https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 +https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py311hbde99c3_0.conda#4c60dfcba06b363be954401addee8800 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/lxml-5.2.2-py311hc0a218f_0.conda#5a9c71f5cbdf3c5b1ad2504e13792629 https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py311h38e4bf4_0.conda#3910c815fc788621f88b2bdc0fa9f0a6 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2#34fc335fc50eef0b5ea708f2b5f54e0c @@ -253,13 +249,14 @@ https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhd8ed1ab_0.conda#7 https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda#d335fd5704b46f4efb89a6774e81aef0 https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.27-pthreads_h3d04fff_0.conda#15e92dc6a755173a10d993b92d700e70 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.0-h1e5e2c1_0.conda#53e8f030579d34e1a36a735d527c021f +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda#17064acba08d3686f1135b5ec1b32b12 https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py311h459d7ec_0.conda#9bc62d25dcf64eec484974a3123c9d57 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h331c9d8_0.conda#f1cbef9236edde98a811ba5a98975f2e https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.9.1-pyhd8ed1ab_0.tar.bz2#0191dd7efe1a94262812770183b68892 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pyflakes-2.5.0-pyhd8ed1ab_0.tar.bz2#1b3bef4313288ae8d35b1dfba4cd84a3 @@ -267,16 +264,17 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda#4d3ceee3af4b0f9a1f48f57176bf8625 +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a +https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.1-py311h5ecf98a_0.conda#9ce82e95681cb5c5e4bd872ed0a7aceb https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py311h459d7ec_0.conda#7865c897d89a39abc0056d89e37bd9e9 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.1-pyhd8ed1ab_0.conda#985e9e86e1b0fc75a74a9bfab9309ef7 https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.2-py311h459d7ec_0.conda#d6478cbce002db6303f0d749860f3e22 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 @@ -285,11 +283,11 @@ https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.0-pyhd8ed1ab_0.conda#4dd428bd295ba44babd13050f2bcc622 -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h297d8ca_1.conda#3ff978d8994f591818a506640c6a7071 https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f -https://conda.anaconda.org/conda-forge/noarch/tenacity-8.3.0-pyhd8ed1ab_0.conda#216cfa8e32bcd1447646768351df6059 +https://conda.anaconda.org/conda-forge/noarch/tenacity-8.4.2-pyhd8ed1ab_0.conda#325a80d37b5233230906a77115e00f37 https://conda.anaconda.org/conda-forge/noarch/termcolor-2.4.0-pyhd8ed1ab_0.conda#a5033708ad9283907c3b1bc1f90d0d0d https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd +https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.16.3-hf0b6e87_3.conda#1e28da846782f91a696af3952a2472f9 https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda#e5dde5caf905e9d95895e05f94967e14 @@ -313,35 +311,32 @@ https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.6.0-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/asgiref-3.8.1-pyhd8ed1ab_0.conda#b5c2e1034ccc76fb14031637924880eb https://conda.anaconda.org/conda-forge/linux-64/astroid-2.15.8-py311h38be061_0.conda#46d70fcb74472aab178991f0231ee3c6 -https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.17-he0b1f16_2.conda#ea6d998135d5f8932cffc91381104690 https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.3-h50844eb_4.conda#e72fdd8942f266ea79c70ec085661d6c https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.3.0-hbdc6101_0.conda#797554b8b7603011e8677884381fbcc5 https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 -https://conda.anaconda.org/conda-forge/linux-64/curl-8.8.0-he654da7_0.conda#042341d8b9ba4ee7f2722b81fae9f0ad +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.4-py311h331c9d8_0.conda#5c93ea564766cd29c0864436ca9f247e +https://conda.anaconda.org/conda-forge/linux-64/curl-8.8.0-he654da7_1.conda#78678b2ddfd9bd7c7861b8d2e3b7473b https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a https://conda.anaconda.org/conda-forge/noarch/fire-0.6.0-pyhd8ed1ab_0.conda#e9ed10aa8fa1dd6782940b95c942a6ae https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py311h331c9d8_0.conda#2daef6c4ce74840c8d7a431498be83e9 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h6c15284_3.conda#06f97c8b69157d91993af0c4f2e16bdc https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 -https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 @@ -352,13 +347,15 @@ https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-he9388d3_8.conda#f3abc6e6ab60fa404c23094f5a03ec9b +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.1-hebfc3b9_0.conda#ddd09e8904fde46b85f41896621803e6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.22.0-h9be4e54_1.conda#4b4e36a91e7dabf7345b82d85767a7c3 +https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b +https://conda.anaconda.org/conda-forge/linux-64/lxml-5.2.2-py311hc0a218f_0.conda#5a9c71f5cbdf3c5b1ad2504e13792629 https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 -https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.2-py311h459d7ec_1.conda#5c809fb753f06a04c2f114394404769e +https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.4-py311h459d7ec_0.conda#ce8c8565ab28dc02587e3c4014186e06 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 @@ -374,12 +371,12 @@ https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.3-py311h08a0b41_0.con https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-py_2.tar.bz2#a11f356d6f93b74b4a84e9501afd48b4 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py311h459d7ec_0.conda#4dccc0bc3bb4d6e5c30bccbd053c4f90 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h297d8ca_1.conda#3ff978d8994f591818a506640c6a7071 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda#e74cd796e70a4261f86699ee0a3a7a24 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-hac6953d_0.conda#63b80ca78d29380fe69e69412dcbe4ac https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.1.3-h4ab18f5_1.conda#4d6c9925cdcda27e9d022e40eb3eac05 @@ -389,28 +386,30 @@ https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h459d7ec_0.conda#fff0f2058e9d86c8bf5848ee93917a8d https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.5-py311h459d7ec_0.conda#0175d2636cc41dc019b51462c13ce225 https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 +https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.7-hb7bd14b_1.conda#82bd3d7da86d969c62ff541bab19526a +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.3-pyhd8ed1ab_0.conda#91fc4700dcce4a46d439900a132fe4e5 https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.8-py311h4a61cc7_0.conda#962bcc96f59a31b62c43ac2b306812af https://conda.anaconda.org/conda-forge/noarch/django-5.0.6-pyhd8ed1ab_0.conda#8451875d7b41dbab4d282f02719f3d6d https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h6c15284_3.conda#06f97c8b69157d91993af0c4f2e16bdc https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-hee599c5_13.conda#8c55dacddd589be64b2bd6a5d4264be6 https://conda.anaconda.org/conda-forge/linux-64/git-2.42.0-pl5321h86e50cf_0.conda#96ad24c67e0056d171385859c43218a2 https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda#0b2154c1818111e17381b1df5b4b0176 https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 +https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hf1a501a_15.conda#d2e16a32f41d67c7d280da11b2846328 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_0.conda#a284ff318fbdb0dd83928275b4b6087c -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.22.0-hc7a4891_1.conda#7811f043944e010e54640918ea82cecd +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.22.0-h9be4e54_1.conda#4b4e36a91e7dabf7345b82d85767a7c3 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h090f1da_1.conda#9a2d6acaa8ce6d53a150248e7b11165e https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/linux-64/poppler-23.08.0-hf2349cb_2.conda#fb75401ae7e2e3f354dff72e9da95cae https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.4.2-pyhd8ed1ab_0.conda#aca82be28a1c676a3e0365e83892f412 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed @@ -419,162 +418,106 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.3-pyhd8ed1ab_0.conda#1dbdf019d740419852c4a7803fff49d9 https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_0.conda#52b91ecba854d55b28ad916a8b10da24 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.1-pyhd8ed1ab_0.conda#d657cde3b3943fcedf6038138eea84de https://conda.anaconda.org/conda-forge/noarch/rdflib-7.0.0-pyhd8ed1ab_0.conda#44d14ef95495b3d4438f28998e0296a9 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.2.2-pyhd8ed1ab_0.conda#6626918380d99292df110f3c91b6e5ec https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h5a4f163_3.conda#f363554b9084fb9d5e3366fbbc0d18e0 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e https://conda.anaconda.org/conda-forge/noarch/yapf-0.40.1-pyhd8ed1ab_0.conda#f269942e802d5e148632143d4c37acc9 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py311hb6f056b_1.conda#72e84ef20a510ab5fca1f3d80a16e9e2 https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.6-hf567797_4.conda#ffb662b31aef333e68a00dd17fda2027 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h18e1886_1.conda#f1beb063aad4446eb146d8b88420a4ea -https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.conda#1a57a819915e1c169b74933720b138f2 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.9.18-py311h9b38416_0.conda#67bed2bd92ffa76b20506d83427706ae -https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda#bcf6a6f4c6889ca083e8d33afbafb8d5 +https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.2-pyh12aca89_0.conda#97ad994fae55dce96bd397054b32e41a https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.22.0-pyhd8ed1ab_0.conda#b9661a4b1200d6bc7d8a4cdafdc91468 https://conda.anaconda.org/conda-forge/linux-64/julia-1.9.3-h06b7c97_0.conda#6214d0563598ae0cc9b954344b9f9c10 https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 -https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6238fc3_5.conda#2fef4283b2bb45a66f8b81099d36721e +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.22.0-hc7a4891_1.conda#7811f043944e010e54640918ea82cecd https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 -https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.1-pyhd8ed1ab_0.conda#4dff4abb5728f7662ecaaa8bee3a0260 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h228c76a_104.conda#91bc3ac73308181d55a09d9e4aeb4496 -https://conda.anaconda.org/conda-forge/linux-64/numba-0.59.1-py311h96b013e_0.conda#cd581f19ea0c298ec6ef612fdf7d041c +https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py311h4bc866e_0.conda#e32a210e9caf97383c35685fd2343512 https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py311h4332511_1.conda#887aa6096851eab5c34fe95ed1641591 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py311h320fe9a_0.conda#e44ccb61b6621bf3f8053ae66eba7397 -https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/poppler-23.08.0-hf2349cb_2.conda#fb75401ae7e2e3f354dff72e9da95cae https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.0.0-pyhd8ed1ab_0.conda#b50aec2c744a5c493c09cce9e2e7533e -https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py311h92ebd52_0.conda#ee757dff4cdb96bb972200c85b37f9e8 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py311h1f0f07a_1.conda#86b71ff85f3e4c8a98b5bace6d9c4565 -https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.0-pyhd8ed1ab_1.conda#f351ee57bb9c3e4b2f4952980461ba1d -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda#764b0e055f59dbd7d114d32b8c6e55e6 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py311h18e1886_0.conda#f43c7f60c7b1e7a7cc4234d28520b06a +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h517d4fd_0.conda#92bf19ecf13e70907ae8c301de32ed10 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-py_0.tar.bz2#cb83a3d6ecf73f50117635192414426a https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-hbf3e495_6.conda#a6caf5a0d9ca940d95f21d40afe8f857 -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.1-pyhd8ed1ab_0.conda#0f8e0831bbf38d83973438ce9af9af9a -https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.0.3-pyhd8ed1ab_0.conda#46b7eb9d2f3ca144f3195dc6aa7bdf93 +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.2-pyhd8ed1ab_0.conda#e704d0474c0155db9632bd740b6c9d17 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.5.2-pyhd8ed1ab_0.conda#2fa6807bd19e5cdc77fe1b6a42c86228 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.6.2-pyhd8ed1ab_0.conda#eecb4c188864376d2b45a5afc4bcb2fa https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h4869a97_1.conda#308799e5ffa83b7b520a9c2c8c0319c1 -https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.2-py311h815a124_5.conda#84a14fd830b72b09ef886a23de557a16 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h0a5817f_2.conda#e23c62f75f67166cf4ca137fc8bcdce7 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6238fc3_5.conda#2fef4283b2bb45a66f8b81099d36721e https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda#0848e2084cbb57014f232f48568561af https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311h74118c1_102.conda#5f98c1d56c5853270c7876bb1000a631 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 +https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.tar.bz2#00d8853fb1f87195722ea6a582cc9b56 https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b -https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h1f0f07a_1.conda#cd36a89a048ad2bcc6d8b43f648fb1d0 -https://conda.anaconda.org/conda-forge/linux-64/r-base-4.3.1-h639d9d3_5.conda#f320a6b4aba89a080d757a365138b642 -https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.conda#dcee6ba4d1ac6af18827d0941b6a1b42 +https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h18e1886_2.conda#b1e90d33ae504ac06a3928a2dc5654ba +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.0-py311he08f58d_1.conda#d55e4dde3b30272090f33ddd367c580b https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyhd8ed1ab_0.conda#846d12530687ba836791dd54db1f45c5 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py311h18e1886_0.conda#82c29bf38b3fb66da09736106609b5fe -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.5.22-pyhd8ed1ab_0.conda#3930cabe8ca8c8594026fa8768cae75c -https://conda.anaconda.org/conda-forge/noarch/xarray-2024.5.0-pyhd8ed1ab_0.conda#e839fd0ae78a368c930f0b1feafa6736 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.6.18-pyhd8ed1ab_0.conda#7c3077529bfe3b86f9425d526d73bd24 +https://conda.anaconda.org/conda-forge/noarch/xarray-2024.6.0-pyhd8ed1ab_1.conda#a6775bba72ade3fd777ccac04902202c https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.2-pyhd8ed1ab_0.conda#02f53038910b6fbc9d36bd5f663318e8 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.0-pyhd8ed1ab_0.conda#f7433e3bd2749b934ddf81451a45967d -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.1-pyhd8ed1ab_0.conda#9b1ddfcc35856fbd69e193b945b7d7f2 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.2-pyhd8ed1ab_0.conda#395b23e1e49b582952a9f2f65a8d6f70 +https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.5-pyhd8ed1ab_0.conda#abfb434fb6654f83d740428863ec85a8 -https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b -https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda#786d3808394b1bdfd3f41f2e2c67279e -https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb +https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.2-py311h815a124_5.conda#84a14fd830b72b09ef886a23de557a16 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/libarrow-15.0.2-h176673d_2_cpu.conda#c130ba0c765437749dbc37fa9de85ce5 +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 https://conda.anaconda.org/conda-forge/linux-64/magics-4.14.2-haee2765_1.conda#0c46d548472ee1b043c65d4ab4ad6a83 +https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.1-pyhd8ed1ab_0.conda#4dff4abb5728f7662ecaaa8bee3a0260 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-he3b17a9_50.conda#a37fcb5a2da31cfebe6734b0fda20bd5 -https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.4-he646072_0.conda#ccf011f3b8edd84d938edd0848ab56d4 +https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.6-hc167251_0.conda#fad6bcd027d55d5e1b925cf2d7ceb4f2 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.0-py311h38be061_1.conda#e172dce6d5f3dbf0c8dfc537c8146be3 https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.0.3-cuda120_pyh3ef1b53_4.conda#101b6519015db5451632163bc6fed36a -https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r43hc72bb7e_1005.conda#dd7719a32c342948c6fbafb13bd2ee03 -https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.5.0-r43hb1dbf0f_0.conda#9f3376d466dc88a5a8f2b8cf3e052772 -https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.8-r43hc72bb7e_0.conda#be78955142329022e2927b57b11e98fa -https://conda.anaconda.org/conda-forge/linux-64/r-cli-3.6.2-r43ha503ecb_0.conda#7a325f68b1354c1a5261688b5e54d008 -https://conda.anaconda.org/conda-forge/noarch/r-codetools-0.2_20-r43hc72bb7e_0.conda#6fd216ce15e662d68b5fa1c7e6c1a75d -https://conda.anaconda.org/conda-forge/linux-64/r-colorspace-2.1_0-r43h57805ef_1.conda#22117ffc4b380dba0732166eec62d8cb -https://conda.anaconda.org/conda-forge/linux-64/r-contfrac-1.1_12-r43h57805ef_1004.conda#b4dca65264e43e9a3ef2e2f39f687349 -https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.4.7-r43hc72bb7e_0.conda#c9ec548d90ba0c4de83a14dab499d015 -https://conda.anaconda.org/conda-forge/noarch/r-crayon-1.5.2-r43hc72bb7e_2.conda#f13cc355add93ff41ef3d7aeefee247a -https://conda.anaconda.org/conda-forge/noarch/r-dbi-1.2.3-r43hc72bb7e_0.conda#b5c79fe477c107fba33e9700d1d7e2a1 -https://conda.anaconda.org/conda-forge/linux-64/r-desolve-1.40-r43hd9ac46e_0.conda#a85bc66bb89726a8fb5310f2def5d8ac -https://conda.anaconda.org/conda-forge/linux-64/r-digest-0.6.35-r43ha503ecb_0.conda#d28a7db9b060ceaf683f0b036780b962 -https://conda.anaconda.org/conda-forge/noarch/r-docopt-0.7.1-r43hc72bb7e_3.conda#d1a51c4e48b1184be5bb47ff13298472 -https://conda.anaconda.org/conda-forge/linux-64/r-dotcall64-1.1_1-r43h61816a4_0.conda#54040b9373933275c211ccbb1d5de023 -https://conda.anaconda.org/conda-forge/noarch/r-evaluate-0.24.0-r43hc72bb7e_0.conda#1c3aa7ca297fae40ea8d6a8fe78317f0 -https://conda.anaconda.org/conda-forge/linux-64/r-fansi-1.0.6-r43h57805ef_0.conda#c94b12c76504df3548707218409b678f -https://conda.anaconda.org/conda-forge/linux-64/r-farver-2.1.2-r43ha18555a_0.conda#b56c791245428e7b08601e3bca812b0a -https://conda.anaconda.org/conda-forge/noarch/r-functional-0.6-r43ha770c72_1004.conda#2a0d8d39d328f570af24f6a2d10a47ed -https://conda.anaconda.org/conda-forge/noarch/r-generics-0.1.3-r43hc72bb7e_2.conda#bf424d7238a8a02bd3970346112de34f -https://conda.anaconda.org/conda-forge/noarch/r-geomapdata-2.0_2-r43hc72bb7e_0.conda#a865cc1e66d1370e8545baa03d2901fe -https://conda.anaconda.org/conda-forge/linux-64/r-git2r-0.33.0-r43hbae1c7c_0.conda#74577e5aad177b12c066b268a7cd864b -https://conda.anaconda.org/conda-forge/linux-64/r-glue-1.7.0-r43h57805ef_0.conda#20e2cb7c0d27bccf8fe21ec5c3897751 -https://conda.anaconda.org/conda-forge/linux-64/r-goftest-1.2_3-r43h57805ef_2.conda#14d5dcb272fd5df57248893446a4948f -https://conda.anaconda.org/conda-forge/linux-64/r-isoband-0.2.7-r43ha503ecb_2.conda#6db3b5f97166c8b0fd8c995fbe32c89d -https://conda.anaconda.org/conda-forge/noarch/r-iterators-1.0.14-r43hc72bb7e_2.conda#5f0c56c25fafdfde7acaf0f332f24195 -https://conda.anaconda.org/conda-forge/linux-64/r-jsonlite-1.8.8-r43h57805ef_0.conda#fb01953d78a87de6211b1ebccafed273 -https://conda.anaconda.org/conda-forge/linux-64/r-kernsmooth-2.23_24-r43hc2011d3_0.conda#9fbf29bd0ded7844a2a493a6190ef9d9 -https://conda.anaconda.org/conda-forge/noarch/r-labeling-0.4.3-r43hc72bb7e_0.conda#8d5f7d07433437c48c1c497ec8c77aec -https://conda.anaconda.org/conda-forge/linux-64/r-lattice-0.22_6-r43h57805ef_0.conda#748c702a5c6c89f9794d148bdcbbdfbc -https://conda.anaconda.org/conda-forge/linux-64/r-lazyeval-0.2.2-r43h57805ef_4.conda#412e7e2defa8af842c9f4d7844d7b949 -https://conda.anaconda.org/conda-forge/linux-64/r-lmom-3.0-r43h61816a4_0.conda#e2ee8254c7baa313122de7a08330c296 -https://conda.anaconda.org/conda-forge/noarch/r-logging-0.10_108-r43ha770c72_4.conda#e32f157d485d2fbd076abf006156d757 -https://conda.anaconda.org/conda-forge/linux-64/r-magrittr-2.0.3-r43h57805ef_2.conda#7b04cb810f47eb12efc2e9be5f8ca1f1 -https://conda.anaconda.org/conda-forge/linux-64/r-maps-3.4.2-r43h57805ef_0.conda#a8a9f2a4fc6692046eebb1d89860b94a -https://conda.anaconda.org/conda-forge/linux-64/r-mass-7.3_60-r43h57805ef_1.conda#be049620c8ceefdb69a24db0c1919c85 -https://conda.anaconda.org/conda-forge/linux-64/r-mba-0.1_0-r43ha503ecb_1.conda#71752b2b57c41eb2e03653bea2a44d94 -https://conda.anaconda.org/conda-forge/noarch/r-nbclust-3.0.1-r43hc72bb7e_2.conda#1a7497d490b8f19d192c26040b6b35e5 -https://conda.anaconda.org/conda-forge/linux-64/r-ncdf4-1.22-r43h5647f33_0.conda#8ff19fc3195d7742c704a957c55cc87a -https://conda.anaconda.org/conda-forge/linux-64/r-pcict-0.5_4.4-r43h57805ef_1.conda#238a8a2e93424fa8cb9942925fc515a2 -https://conda.anaconda.org/conda-forge/noarch/r-pkgconfig-2.0.3-r43hc72bb7e_3.conda#8978eef741fffaa48be070693a17f42f -https://conda.anaconda.org/conda-forge/linux-64/r-proxy-0.4_27-r43h57805ef_2.conda#742133e20563c7321e9d0cbd7e7102c7 -https://conda.anaconda.org/conda-forge/linux-64/r-ps-1.7.6-r43h57805ef_0.conda#48f9e73215aa6de4545ec3ec36e5e534 -https://conda.anaconda.org/conda-forge/noarch/r-r.methodss3-1.8.2-r43hc72bb7e_2.conda#e6976d24b97b9cdcb9a74ac55495f404 -https://conda.anaconda.org/conda-forge/noarch/r-r6-2.5.1-r43hc72bb7e_2.conda#79f167972554dc6b65aa099cd85c22a1 -https://conda.anaconda.org/conda-forge/noarch/r-rcolorbrewer-1.1_3-r43h785f33e_2.conda#d998f26d6a55b83dab1c25b583e1463a -https://conda.anaconda.org/conda-forge/linux-64/r-rcpp-1.0.12-r43h7df8631_0.conda#a8aac8be0868617b28f27484ea548d6c -https://conda.anaconda.org/conda-forge/noarch/r-remotes-2.5.0-r43hc72bb7e_0.conda#a3f5e53761f368633e54c76917940eb6 -https://conda.anaconda.org/conda-forge/linux-64/r-rlang-1.1.4-r43ha18555a_0.conda#74c4cb6644843dccabc350cba4b56ec6 -https://conda.anaconda.org/conda-forge/noarch/r-rpmg-2.2_7-r43hc72bb7e_0.conda#9fceb6466208ae034b8847cdd27bf6db -https://conda.anaconda.org/conda-forge/noarch/r-rprojroot-2.0.4-r43hc72bb7e_0.conda#279a906f3d37ee80ee94950754eb9ded -https://conda.anaconda.org/conda-forge/noarch/r-snow-0.4_4-r43hc72bb7e_2.conda#ceedb5263134a3100813b84c32747c78 -https://conda.anaconda.org/conda-forge/linux-64/r-udunits2-0.13.2.1-r43h57805ef_3.conda#f80ce6fa5f07c33a4fac0bcfc151b161 -https://conda.anaconda.org/conda-forge/linux-64/r-utf8-1.2.4-r43h57805ef_0.conda#d228498392dce22d3fe6266554498493 -https://conda.anaconda.org/conda-forge/linux-64/r-uuid-1.2_0-r43h57805ef_0.conda#88a02431c8ab8be38eed2b01f9d44ab4 -https://conda.anaconda.org/conda-forge/noarch/r-viridislite-0.4.2-r43hc72bb7e_1.conda#307f6c8262afed91d2999568e2268ed6 -https://conda.anaconda.org/conda-forge/noarch/r-withr-3.0.0-r43hc72bb7e_0.conda#7380a50d9daae38b40777f7630b8c3ba -https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.44-r43ha18555a_0.conda#8fbbfbc83f3f8572c8d5bb066a1eb8a4 -https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r43hc72bb7e_2.conda#a973f1f52947adda7b4cd1ea3c2f9941 -https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r43h57805ef_0.conda#41db1ee9d0073339e681379b92e7dfb6 -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.23.2-py311hd037940_0.conda#a27a1dc2d447c48b3a38125c70d2dc89 +https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 +https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h0887e52_8.conda#34cb3750c8a6da10a490e470f87e670b +https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.conda#dcee6ba4d1ac6af18827d0941b6a1b42 +https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py311h14de704_1.conda#873580dfb41f82fe67dcd525bd243027 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 +https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.0.3-pyhd8ed1ab_0.conda#46b7eb9d2f3ca144f3195dc6aa7bdf93 https://conda.anaconda.org/conda-forge/linux-64/cdo-2.3.0-h24bcfa3_0.conda#238311a432a8e49943d3348e279af714 -https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_19-pl5321h7e74ff9_0.conda#a4a0ce7caba20cae61aac9aeacbd76c2 +https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a +https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda#786d3808394b1bdfd3f41f2e2c67279e +https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-15.0.2-hac33072_2_cpu.conda#12951edff85582aedcd2db0b79393102 https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-15.0.2-hd42f311_2_cpu.conda#dcc3a1e12157bbbbae96029d9d34fd0e @@ -582,95 +525,156 @@ https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-15.0.2-hd4ab825 https://conda.anaconda.org/conda-forge/linux-64/libparquet-15.0.2-h6a7eafb_2_cpu.conda#b06caaa4ef20db071dc832323701e5e3 https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_0.conda#43d9cd74e3950ab09cbddf36f1706b9f +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.0-py311h38be061_1.conda#0c795bac4990aec7adabb34caa9d3873 -https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.7.1-pyhd8ed1ab_0.conda#447d61cb83a9c3a3916fba1bc3cff0bf -https://conda.anaconda.org/conda-forge/linux-64/pydot-2.0.0-py311h38be061_0.conda#cdfd23a54a18f3c8d5320d7717f4ed52 -https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r43ha503ecb_0.conda#8737c1d2787e754db2e88ef1610c737a -https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r43h57805ef_0.conda#b3e470863d9e21349b1a6c075b681901 -https://conda.anaconda.org/conda-forge/linux-64/r-class-7.3_22-r43h57805ef_1.conda#edcd749bf55569ea5c2f419c10e6ee59 -https://conda.anaconda.org/conda-forge/linux-64/r-climdex.pcic-1.1_11-r43ha503ecb_2.conda#59f6775bc30ccc52a2ec7aa8f353dd9b -https://conda.anaconda.org/conda-forge/noarch/r-desc-1.4.3-r43hc72bb7e_0.conda#3bd51d5d0cc81f943e93eabb982b318b -https://conda.anaconda.org/conda-forge/linux-64/r-ellipsis-0.3.2-r43h57805ef_2.conda#10c5892991072cfa3a61489d2ac6ad66 -https://conda.anaconda.org/conda-forge/noarch/r-elliptic-1.4_0-r43hc72bb7e_4.conda#16e4352829cf433be8884e27e1b8e4a1 -https://conda.anaconda.org/conda-forge/noarch/r-foreach-1.5.2-r43hc72bb7e_2.conda#cf8d448c534caecc11d3999a041d4769 -https://conda.anaconda.org/conda-forge/noarch/r-highr-0.11-r43hc72bb7e_0.conda#ecd3b95a01caa7bdcf63714427b5b88c -https://conda.anaconda.org/conda-forge/noarch/r-lifecycle-1.0.4-r43hc72bb7e_0.conda#291d2fb68ea1b181644b40d6743ae000 -https://conda.anaconda.org/conda-forge/linux-64/r-mapproj-1.2.11-r43h57805ef_1.conda#cb9973326cda79323ab1127d0006c3fd -https://conda.anaconda.org/conda-forge/linux-64/r-matrix-1.6_5-r43h316c678_0.conda#8146ef1b3c54e1a484822085d39357b0 -https://conda.anaconda.org/conda-forge/noarch/r-munsell-0.5.1-r43hc72bb7e_0.conda#2f189c59532c130f4b83e4a50626c08b -https://conda.anaconda.org/conda-forge/noarch/r-ncdf4.helpers-0.3_6-r43hc72bb7e_2.conda#23938872f695db31c28a0207c51c0f09 -https://conda.anaconda.org/conda-forge/linux-64/r-nlme-3.1_165-r43hbcb9c34_0.conda#261b441154346a173a7efd53925729dc -https://conda.anaconda.org/conda-forge/linux-64/r-plyr-1.8.9-r43ha503ecb_0.conda#47bf330a88b5a59bc6e110624f1b8e7a -https://conda.anaconda.org/conda-forge/linux-64/r-processx-3.8.4-r43h57805ef_0.conda#660d4e9ff8beef35dbda645484d17a25 -https://conda.anaconda.org/conda-forge/noarch/r-r.oo-1.26.0-r43hc72bb7e_0.conda#e467767d55b77c81b3167f00f2ecac65 -https://conda.anaconda.org/conda-forge/linux-64/r-rcpparmadillo-0.12.8.4.0-r43h58a4165_0.conda#57e177923b3c89382db34962ff5320e2 -https://conda.anaconda.org/conda-forge/noarch/r-rex-1.2.1-r43hc72bb7e_2.conda#0a2c2b272177122311ca46834b8ca6ab -https://conda.anaconda.org/conda-forge/linux-64/r-sp-2.1_4-r43hb1dbf0f_0.conda#01d55e9a8ae9cb6d222b0154316346a4 -https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.10_0-r43h9f9f741_0.conda#b1f50ff35422ee8bc5e3d6c0565b3e62 -https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.3.0-r43ha503ecb_0.conda#9502bf10997943c1f3d6abeced14b792 -https://conda.anaconda.org/conda-forge/linux-64/r-units-0.8_5-r43ha503ecb_0.conda#001680df8c5745b7dc3b799a9e1ac2b0 -https://conda.anaconda.org/conda-forge/linux-64/r-wk-0.9.1-r43ha503ecb_0.conda#4a0dad8564d2b623e91d9d9f38e5abb5 -https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.6-r43hbfba7a4_1.conda#545f26a602ff99102e7fd70f425ead32 -https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r43h57805ef_1.conda#5e4c7ad3824c359f05601463ec7ba9c5 +https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.8.0-pyhd8ed1ab_0.conda#fba377622e74ee0bbeb8ccae9fa593d3 +https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r42hc72bb7e_1005.conda#f2744985b083b1bbffd4df19437cf1e8 +https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.5.0-r42hb1dbf0f_0.conda#d879e1fbd80113312364a5db3682c789 +https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.8-r42hc72bb7e_0.conda#383f36b5a0b7dd7c467aa1b6b5fe7307 +https://conda.anaconda.org/conda-forge/linux-64/r-cli-3.6.3-r42ha18555a_0.conda#93fc8055b8aee751e201604a02d7d06f +https://conda.anaconda.org/conda-forge/noarch/r-codetools-0.2_20-r42hc72bb7e_0.conda#a9e9276ab95d053b9db56159cfeda2c9 +https://conda.anaconda.org/conda-forge/linux-64/r-colorspace-2.1_0-r42h57805ef_1.conda#68ec691b072953b496ca1a4d83b2bc3d +https://conda.anaconda.org/conda-forge/linux-64/r-contfrac-1.1_12-r42h57805ef_1004.conda#bc308888aa4b4fb4e37a7a17fdc911c9 +https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.4.7-r42hc72bb7e_0.conda#941d7bcf2b94a682419ea1fbf6789d1f +https://conda.anaconda.org/conda-forge/noarch/r-crayon-1.5.3-r42hc72bb7e_0.conda#4a74a6114bbea1ad8d488e99b83df3da +https://conda.anaconda.org/conda-forge/noarch/r-dbi-1.2.3-r42hc72bb7e_0.conda#b283bb5431a4b960cfa3f82043d1437b +https://conda.anaconda.org/conda-forge/linux-64/r-desolve-1.40-r42hd9ac46e_0.conda#7232f8b5707fc9739cb2f8fdc5b4b64d +https://conda.anaconda.org/conda-forge/linux-64/r-digest-0.6.36-r42ha18555a_0.conda#332551d9a37018826d528cf16701bd2b +https://conda.anaconda.org/conda-forge/noarch/r-docopt-0.7.1-r42hc72bb7e_3.conda#99be998b67c40ef6eb1a5af90e307c1d +https://conda.anaconda.org/conda-forge/linux-64/r-dotcall64-1.1_1-r42h61816a4_0.conda#d83332ff8d9912151d9a4b4972fd1da0 +https://conda.anaconda.org/conda-forge/noarch/r-evaluate-0.24.0-r42hc72bb7e_0.conda#c2a50c427d0febc367122a875239e771 +https://conda.anaconda.org/conda-forge/linux-64/r-fansi-1.0.6-r42h57805ef_0.conda#c12524190662098e2e8a245a3d1bc7dc +https://conda.anaconda.org/conda-forge/linux-64/r-farver-2.1.2-r42ha18555a_0.conda#475d7bcc6de3c5851b112675eb55f497 +https://conda.anaconda.org/conda-forge/noarch/r-functional-0.6-r42ha770c72_1004.conda#9e27c34589b883accd340d651bdeaa02 +https://conda.anaconda.org/conda-forge/noarch/r-generics-0.1.3-r42hc72bb7e_2.conda#c492355d73e184353c82b62f5087a601 +https://conda.anaconda.org/conda-forge/noarch/r-geomapdata-2.0_2-r42hc72bb7e_0.conda#799a671bad7a89ac1d9da5cb98f75367 +https://conda.anaconda.org/conda-forge/linux-64/r-git2r-0.33.0-r42hbae1c7c_0.conda#2cdc8746b3283f02e5ba387bcfc51aa1 +https://conda.anaconda.org/conda-forge/linux-64/r-glue-1.7.0-r42h57805ef_0.conda#eab803a28d66337ae3732b04c5f5604f +https://conda.anaconda.org/conda-forge/linux-64/r-goftest-1.2_3-r42h57805ef_2.conda#4210e40893bbac7533714429ac4d0fe9 +https://conda.anaconda.org/conda-forge/linux-64/r-isoband-0.2.7-r42ha503ecb_2.conda#44979df954a15195470f336cd18b5eb6 +https://conda.anaconda.org/conda-forge/noarch/r-iterators-1.0.14-r42hc72bb7e_2.conda#616ab7b008326d3d76d59ba35b3fb592 +https://conda.anaconda.org/conda-forge/linux-64/r-jsonlite-1.8.8-r42h57805ef_0.conda#d0b27ba963de139270a7b53f897afdf6 +https://conda.anaconda.org/conda-forge/linux-64/r-kernsmooth-2.23_24-r42hc2011d3_0.conda#aac4c7efaa5f2f7013cff5dabe0255eb +https://conda.anaconda.org/conda-forge/noarch/r-labeling-0.4.3-r42hc72bb7e_0.conda#b9b940011dd81d8b60859fcd0d9775f4 +https://conda.anaconda.org/conda-forge/linux-64/r-lattice-0.22_6-r42h57805ef_0.conda#93cee3961cc5277443a3e437f6991010 +https://conda.anaconda.org/conda-forge/linux-64/r-lazyeval-0.2.2-r42h57805ef_4.conda#109112b1c26d932414daa139a45d3a69 +https://conda.anaconda.org/conda-forge/linux-64/r-lmom-3.0-r42h61816a4_0.conda#0cffcf07f72a3be278b236e3b2f451c9 +https://conda.anaconda.org/conda-forge/noarch/r-logging-0.10_108-r42ha770c72_4.conda#d9980750f18496909aa8327037a43f8b +https://conda.anaconda.org/conda-forge/linux-64/r-magrittr-2.0.3-r42h57805ef_2.conda#ea3b13247660dd534a745a26f8d02365 +https://conda.anaconda.org/conda-forge/linux-64/r-maps-3.4.2-r42h57805ef_0.conda#a0367e4720045d5d17cb841a415ada1e +https://conda.anaconda.org/conda-forge/linux-64/r-mass-7.3_60.0.1-r42h57805ef_0.conda#0427fa6c4da6a4b2e43d8dfd022e933b +https://conda.anaconda.org/conda-forge/linux-64/r-mba-0.1_0-r42ha503ecb_1.conda#ab0ffee07ebd556b0e0119017439218a +https://conda.anaconda.org/conda-forge/noarch/r-nbclust-3.0.1-r42hc72bb7e_2.conda#fffd3a5ced3a6949fe7a20af1ff4b2c6 +https://conda.anaconda.org/conda-forge/linux-64/r-ncdf4-1.22-r42h5647f33_0.conda#d23e6cd8fe41079eb1421b6a6d1f1c67 +https://conda.anaconda.org/conda-forge/linux-64/r-pcict-0.5_4.4-r42h57805ef_1.conda#6e5770da5c174a2617096cbc2b8d96f4 +https://conda.anaconda.org/conda-forge/noarch/r-pkgconfig-2.0.3-r42hc72bb7e_3.conda#469b66f84a5d234689b423c9821b188c +https://conda.anaconda.org/conda-forge/linux-64/r-proxy-0.4_27-r42h57805ef_2.conda#1d2ea39d52acbcc9d7db8a0abe5fdf7b +https://conda.anaconda.org/conda-forge/linux-64/r-ps-1.7.6-r42h57805ef_0.conda#3a592c79e0fade3a0c3574696fa143a3 +https://conda.anaconda.org/conda-forge/noarch/r-r.methodss3-1.8.2-r42hc72bb7e_2.conda#305fe9f97f7598d9722c76d6be7bf794 +https://conda.anaconda.org/conda-forge/noarch/r-r6-2.5.1-r42hc72bb7e_2.conda#1473a12b55128f8ac776ae5595a4d0cb +https://conda.anaconda.org/conda-forge/noarch/r-rcolorbrewer-1.1_3-r42h785f33e_2.conda#b7b475c73493f70cbbb9d7213b94aed1 +https://conda.anaconda.org/conda-forge/linux-64/r-rcpp-1.0.12-r42h7df8631_0.conda#096448d673973c0e45b9d803da251971 +https://conda.anaconda.org/conda-forge/noarch/r-remotes-2.5.0-r42hc72bb7e_0.conda#c595028f27588c6ff242fcb0dab79363 +https://conda.anaconda.org/conda-forge/linux-64/r-rlang-1.1.4-r42ha18555a_0.conda#ab6364a17b32268b82c46f09695a9cc9 +https://conda.anaconda.org/conda-forge/noarch/r-rpmg-2.2_7-r42hc72bb7e_0.conda#9e34ca8c73b895781e13b1d399105f35 +https://conda.anaconda.org/conda-forge/noarch/r-rprojroot-2.0.4-r42hc72bb7e_0.conda#c2bb0aa15018f8d9a4bc7b9e459dc94f +https://conda.anaconda.org/conda-forge/noarch/r-snow-0.4_4-r42hc72bb7e_2.conda#97cc50b630391cbc89ea70425ebb6ade +https://conda.anaconda.org/conda-forge/linux-64/r-udunits2-0.13.2.1-r42h57805ef_3.conda#56d551dc25582293fed533026356a79e +https://conda.anaconda.org/conda-forge/linux-64/r-utf8-1.2.4-r42h57805ef_0.conda#1da2e3bcbf75c6ddc3466941d88ff93f +https://conda.anaconda.org/conda-forge/linux-64/r-uuid-1.2_0-r42h57805ef_0.conda#f7585e68687b274880bbd68f34c0524d +https://conda.anaconda.org/conda-forge/noarch/r-viridislite-0.4.2-r42hc72bb7e_1.conda#e7a6483f639fb958747100bd17550ed6 +https://conda.anaconda.org/conda-forge/noarch/r-withr-3.0.0-r42hc72bb7e_0.conda#972eaab581c25fff9ea6986aa6ab281a +https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.45-r42ha18555a_0.conda#9e13c392bfcee4a261e4b513d6d862e7 +https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r42hc72bb7e_2.conda#2f3614450b54f222c1eff786ec2a45ec +https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda#97f60a93ca12f4fdd5f44049dcee4345 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e -https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.5-pyhd8ed1ab_0.conda#0f74ff434e03fa89315ec45ec1bc4284 +https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.6-pyhd8ed1ab_0.conda#3f906da34e3cb6e7260a9fcd0e9ee7e8 https://conda.anaconda.org/conda-forge/noarch/xgboost-2.0.3-cuda120_pyh68bd8d9_4.conda#aaaadc3a408067943ebc10299393a7c3 +https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.0-pyhd8ed1ab_0.conda#f7433e3bd2749b934ddf81451a45967d +https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_19-pl5321h7e74ff9_0.conda#a4a0ce7caba20cae61aac9aeacbd76c2 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-hac33072_2_cpu.conda#48c711b4e07664ec7b245a9664be60a1 https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-15.0.2-h9241762_2_cpu.conda#97e46f0f20157e19487ca3e65100247a -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_0.conda#391934bd1a79990c23df1d1809ddc821 -https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py311h38be061_1.conda#d7901c26884613539e958c10e9973413 https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.4.0-py311h38be061_3.conda#6f7871722c07922028043144e8873b37 +https://conda.anaconda.org/conda-forge/linux-64/pydot-2.0.0-py311h38be061_0.conda#cdfd23a54a18f3c8d5320d7717f4ed52 https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 -https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_3.4-r43h61816a4_2.conda#3864b228566ce025f29d1ef672139c07 -https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.6-r43hc72bb7e_0.conda#5f01d28492d5ca80b54fdba4510a653f -https://conda.anaconda.org/conda-forge/noarch/r-doparallel-1.0.17-r43hc72bb7e_2.conda#5eb327ee913c177e3c02278e5103f9a1 -https://conda.anaconda.org/conda-forge/linux-64/r-e1071-1.7_14-r43ha503ecb_0.conda#99f29679579f01d7ffdf0a6d47495eb2 -https://conda.anaconda.org/conda-forge/noarch/r-gtable-0.3.5-r43hc72bb7e_0.conda#4afa6b3bc18ef585bac26420528ed1de -https://conda.anaconda.org/conda-forge/noarch/r-hypergeo-1.2_13-r43hc72bb7e_1004.conda#960f0770e69b4d8e154e9b751763b672 -https://conda.anaconda.org/conda-forge/noarch/r-knitr-1.47-r43hc72bb7e_0.conda#0310660d998a5933bb4545a312ed7385 -https://conda.anaconda.org/conda-forge/linux-64/r-lmoments-1.3_1-r43h7ce84a7_5.conda#24bcd1ee177f4e977657f5560fdf6616 -https://conda.anaconda.org/conda-forge/linux-64/r-lubridate-1.9.3-r43h57805ef_0.conda#48f220862d7b0ac7d1397f8c6601fb70 -https://conda.anaconda.org/conda-forge/linux-64/r-mgcv-1.9_1-r43h316c678_0.conda#c73d9ed0dc98182d712cbea33a3e5d59 -https://conda.anaconda.org/conda-forge/noarch/r-r.utils-2.12.3-r43hc72bb7e_0.conda#5ea010c037dd64b6d6a4de2c06059231 -https://conda.anaconda.org/conda-forge/linux-64/r-reshape-0.8.9-r43hc72bb7e_2.conda#e24945cba9c156cf4e7154b3857f416d -https://conda.anaconda.org/conda-forge/linux-64/r-s2-1.1.6-r43h5eac2b3_0.conda#8295dd173068e7ca92a742ebcc72d75a -https://conda.anaconda.org/conda-forge/noarch/r-scales-1.3.0-r43hc72bb7e_0.conda#508360956e18c2b0cc18968cdb786c78 -https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r43ha503ecb_3.conda#e9e632dc89a5235a6a44b42f23b497d8 -https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.5-r43ha503ecb_0.conda#e398bd0451e6350a876a8561f8e90682 +https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r42ha503ecb_0.conda#12b6fa8fe80a6494a948c6ea2f34340d +https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r42h57805ef_0.conda#9febce7369c72d991e2399d7d28f3390 +https://conda.anaconda.org/conda-forge/linux-64/r-class-7.3_22-r42h57805ef_1.conda#97476afece904fbbe73762b9cf8c4d83 +https://conda.anaconda.org/conda-forge/linux-64/r-climdex.pcic-1.1_11-r42ha503ecb_2.conda#cff1d95fe315f109a1f01a7ef112fdd6 +https://conda.anaconda.org/conda-forge/noarch/r-desc-1.4.3-r42hc72bb7e_0.conda#8c535581a9a3a1e2a0f5ef6d7e4d6a7f +https://conda.anaconda.org/conda-forge/linux-64/r-ellipsis-0.3.2-r42h57805ef_2.conda#1673236a1895ca5cce15c888435ad2f9 +https://conda.anaconda.org/conda-forge/noarch/r-elliptic-1.4_0-r42hc72bb7e_4.conda#8388c500125813b91332f9d3720f3471 +https://conda.anaconda.org/conda-forge/noarch/r-foreach-1.5.2-r42hc72bb7e_2.conda#16f5453742f10816f2964a2b05bc20d3 +https://conda.anaconda.org/conda-forge/noarch/r-highr-0.11-r42hc72bb7e_0.conda#2edda9394885683f7cad76673eeb2025 +https://conda.anaconda.org/conda-forge/noarch/r-lifecycle-1.0.4-r42hc72bb7e_0.conda#7d00a412d44005a8714c192589143b81 +https://conda.anaconda.org/conda-forge/linux-64/r-mapproj-1.2.11-r42h57805ef_1.conda#af943f7f8db88fddf340980fa53ed3e5 +https://conda.anaconda.org/conda-forge/linux-64/r-matrix-1.6_5-r42h316c678_0.conda#4f52f9c56146c8692503a7d2057ba7ba +https://conda.anaconda.org/conda-forge/noarch/r-munsell-0.5.1-r42hc72bb7e_0.conda#e7036a0b18f2ee6b108fe12b908b18f3 +https://conda.anaconda.org/conda-forge/noarch/r-ncdf4.helpers-0.3_6-r42hc72bb7e_2.conda#c7180e87be344175853f1ebfcdce04d0 +https://conda.anaconda.org/conda-forge/linux-64/r-nlme-3.1_165-r42hbcb9c34_0.conda#a83fa459c53c4674ee394b80b7b2fbd5 +https://conda.anaconda.org/conda-forge/linux-64/r-plyr-1.8.9-r42ha503ecb_0.conda#9b63113ec0c6f1a69c53f77d8f8fa4dc +https://conda.anaconda.org/conda-forge/linux-64/r-processx-3.8.4-r42h57805ef_0.conda#97f10f23ade292cb369d5635b119befa +https://conda.anaconda.org/conda-forge/noarch/r-r.oo-1.26.0-r42hc72bb7e_0.conda#8d5929eebbe7d431fa3f989874b090eb +https://conda.anaconda.org/conda-forge/linux-64/r-rcpparmadillo-0.12.8.4.0-r42h58a4165_0.conda#49973fea110c814e316d8277bb08e516 +https://conda.anaconda.org/conda-forge/noarch/r-rex-1.2.1-r42hc72bb7e_2.conda#b45f1b94fd106c19eb79303b24dc9a7c +https://conda.anaconda.org/conda-forge/linux-64/r-sp-2.1_4-r42hb1dbf0f_0.conda#681bb0a7290d86f9f8bf8dc816f114c0 +https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.10_0-r42h9f9f741_0.conda#159d8ab59a2777a26a739f8090b5a80c +https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.3.0-r42ha503ecb_0.conda#3d62906e9c1fecf61370a3ad6e808e5e +https://conda.anaconda.org/conda-forge/linux-64/r-units-0.8_5-r42ha503ecb_0.conda#90b4c99051df9db2f825d6259dcf12cd +https://conda.anaconda.org/conda-forge/linux-64/r-wk-0.9.1-r42ha503ecb_0.conda#3c5ea742d2069f956ea6ff02a2aadce1 +https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.6-r42hbfba7a4_1.conda#5c3d7a89a2d5e1c0885f92d1aa6fde30 +https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r42h57805ef_1.conda#5367d265c0c9c151dea85f1ccb515ec1 https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-15.0.2-h9241762_2_cpu.conda#c18bbb60ed10774dbf9ea86484728a74 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.4-hd8ed1ab_0.conda#c9d64b8a7ee8e6bdbf0e7d8aa7f39601 -https://conda.anaconda.org/conda-forge/linux-64/r-classint-0.4_10-r43h61816a4_0.conda#3cd17c77cac1801072c599c7cddff7f2 -https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.1-r43hc72bb7e_0.conda#5287430003206a614ae64a91c8490e3c -https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r43hc72bb7e_1005.conda#15f718c5ad9c479dc80f1812cc787c27 -https://conda.anaconda.org/conda-forge/noarch/r-lmomco-2.5.1-r43hc72bb7e_0.conda#3eff921d171972770deabc2cfff9fcd2 -https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r43hc72bb7e_1.conda#72783cf9e09eeb47114fc506de126613 -https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r43hc72bb7e_1.conda#7cff01456566a69381d3907d520c10b2 -https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r43h57805ef_0.conda#713053b11419075641f09df086ef58d9 -https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r43hc72bb7e_2.conda#fa01685a9c07191e186357c001b19ece +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.4-hd8ed1ab_1.conda#ab83e3b9ca2b111d8f332e9dc8b2170f +https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 +https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_3.4-r42h61816a4_2.conda#8536251313f441c4d70ff11ad976d294 +https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.6-r42hc72bb7e_0.conda#4fb1765d6dc531936db81af3f6be316a +https://conda.anaconda.org/conda-forge/noarch/r-doparallel-1.0.17-r42hc72bb7e_2.conda#1cddfbaade4416f0234670391bb31ba2 +https://conda.anaconda.org/conda-forge/linux-64/r-e1071-1.7_14-r42ha503ecb_0.conda#6e147da5592263573409bce2e9c39b3c +https://conda.anaconda.org/conda-forge/noarch/r-gtable-0.3.5-r42hc72bb7e_0.conda#b5cff9c0564c9fcd8b62632430a0cee5 +https://conda.anaconda.org/conda-forge/noarch/r-hypergeo-1.2_13-r42hc72bb7e_1004.conda#7a207a992c606168044d13dcffd80ad4 +https://conda.anaconda.org/conda-forge/noarch/r-knitr-1.47-r42hc72bb7e_0.conda#0a20a2f6546bc0cde246c53a92a7964d +https://conda.anaconda.org/conda-forge/linux-64/r-lmoments-1.3_1-r42h7ce84a7_5.conda#e727f948785d9aad6426e912e135f935 +https://conda.anaconda.org/conda-forge/linux-64/r-lubridate-1.9.3-r42h57805ef_0.conda#01fd816e4231ae7cf2833e5661a92611 +https://conda.anaconda.org/conda-forge/linux-64/r-mgcv-1.9_1-r42h316c678_0.conda#5c3d738118f5948f6cc29ccb63d6e2ff +https://conda.anaconda.org/conda-forge/noarch/r-r.utils-2.12.3-r42hc72bb7e_0.conda#81f505dec8850e227d9b2a7e88fa505f +https://conda.anaconda.org/conda-forge/linux-64/r-reshape-0.8.9-r42hc72bb7e_2.conda#17e75917161bf824248cc54a412b4394 +https://conda.anaconda.org/conda-forge/linux-64/r-s2-1.1.6-r42h5eac2b3_0.conda#c3835d051156c3eacce21caec8061594 +https://conda.anaconda.org/conda-forge/noarch/r-scales-1.3.0-r42hc72bb7e_0.conda#0af4021fe6d0047bbf7a34bf21c50bdd +https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r42h7525677_2.tar.bz2#1521b8a303852af0496245e368d3c61c +https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.5-r42ha503ecb_0.conda#5689030c60302fb5bb7a48b54c11dbe8 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-15.0.2-py311h78dcc79_2_cpu.conda#6f20003320c613f2505cf248bfce48f6 -https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r43hc72bb7e_0.conda#5b6f07861439a584c942ec0c3967660f -https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r43hc72bb7e_0.conda#d2b855cb2d8c0c5c870fe61d0f7e0d0c -https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_14-r43h85a8d9e_1.conda#a2ea960cebc252c3e10c5fb9fb4dfefc -https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r43h57805ef_2.conda#afa7d3f21fbc5a2fbaa48cb9bacb7bce -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.2-pyhd8ed1ab_0.conda#34db694d2afc672094f1a74af51cb44e +https://conda.anaconda.org/conda-forge/linux-64/r-classint-0.4_10-r42h61816a4_0.conda#668a2f3e36b373878e698b1387bea45b +https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.1-r42hc72bb7e_0.conda#6bd41a85dc43541400311eca03d4e2d4 +https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r42hc72bb7e_1005.conda#da116b29105a8d48571975a185e9bb94 +https://conda.anaconda.org/conda-forge/noarch/r-lmomco-2.5.1-r42hc72bb7e_0.conda#6efbdfe5d41b3ef5652be1ea2e0a6e3c +https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r42hc72bb7e_1.conda#7aa5a8ca336904418caeb7395fd867e6 +https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r42hc72bb7e_1.conda#07d5ce8e710897745f14c951ff947cdd +https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.conda#7985dada48799b7814ca069794d0b1a3 +https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.6-pyhd8ed1ab_0.conda#77ed2262e85230e5b870f505ed4922c8 https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda -https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r43hc72bb7e_0.conda#efb6b27dba202d74e5f182faae28794a -https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r43hc72bb7e_3.conda#d1f849bc6b24f93c392f4177f65578b4 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.5.2-pyhd8ed1ab_0.conda#6bb2c18b838161e550a30de0fdff6993 -https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.3-r43hc72bb7e_0.conda#de41a01071ff652806dd79cd7ddaf239 -https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r43ha503ecb_1.conda#cc23eacc44f680ecc36222de5a1c6694 -https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.5-r43hc72bb7e_0.conda#327e96357f5ba37795f2e292e29091c7 +https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 +https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 +https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_14-r42h85a8d9e_1.conda#ad59b523759f3e8acc6fd623cfbfb5a9 +https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 +https://conda.anaconda.org/conda-forge/noarch/dask-2024.6.2-pyhd8ed1ab_0.conda#0af43d16240caf6aedefd7a4041ae64c +https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 +https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.10.0-pyhd8ed1ab_0.conda#a5ccce1a87da81d6c690cd11ae0687a2 -https://conda.anaconda.org/conda-forge/linux-64/r-fields-15.2-r43h61816a4_0.conda#9e320d2aa158a698f8ba09b3176607ea -https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r43hc72bb7e_1.conda#3be1d0c7f8edcd4e7e8a64596020b90f +https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.3-r42hc72bb7e_0.conda#1b2b8fa85a9d0556773abac4763d8ef9 +https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r42ha503ecb_1.conda#6aa1414e06dfffc39d3b5ca78b60b377 +https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.5-r42hc72bb7e_0.conda#959f69b6dfd4b620a15489975fa27670 https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.10.0-pyhd8ed1ab_0.conda#18bc5ed0e0583cb0b212927795debea7 -https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_5-r43h57805ef_0.conda#dc942c6f2062894f7baf00fc6b907a79 -https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r43hc72bb7e_2.conda#13f4b1126272c8f195fc6ef38cc19d31 +https://conda.anaconda.org/conda-forge/linux-64/r-fields-15.2-r42h61816a4_0.conda#d84fe2f9e893e92089370b195e2263a0 +https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r42hc72bb7e_1.conda#7fe060235dac0fc0b3d387f98e79d128 +https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_5-r42h57805ef_0.conda#e58ccf961b56e57d7c1e50995005b0bd +https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r42hc72bb7e_2.conda#8079a86a913155fe2589ec0b76dc9f5e https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.6-pyhd8ed1ab_0.tar.bz2#4409dd7e06a62c3b2aa9e96782c49c6d https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.4-pyhd8ed1ab_0.conda#9dc80eaeff56fb67dbf4f871b81bc13a -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 From 321d3d6ad80d57b8f844a7837267b1956f4295ce Mon Sep 17 00:00:00 2001 From: Emma Hogan Date: Wed, 3 Jul 2024 14:58:47 +0100 Subject: [PATCH 13/87] Update AERONET data version (#3692) --- esmvaltool/cmorizers/data/cmor_config/AERONET.yml | 2 +- esmvaltool/cmorizers/data/datasets.yml | 2 +- esmvaltool/cmorizers/data/formatters/datasets/aeronet.py | 2 +- esmvaltool/recipes/recipe_aod_aeronet_assess.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/esmvaltool/cmorizers/data/cmor_config/AERONET.yml b/esmvaltool/cmorizers/data/cmor_config/AERONET.yml index 33ae35879d..0e6ebf2934 100644 --- a/esmvaltool/cmorizers/data/cmor_config/AERONET.yml +++ b/esmvaltool/cmorizers/data/cmor_config/AERONET.yml @@ -5,7 +5,7 @@ filename: 'AOD_Level20_Monthly_V3.tar.gz' # Common global attributes for Cmorizer output attributes: dataset_id: AERONET - version: 20230610 + version: 20240406 tier: 3 modeling_realm: atmos project_id: OBS6 diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index 759dc6177e..2ed387f55c 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -4,7 +4,7 @@ datasets: AERONET: tier: 3 source: "https://aeronet.gsfc.nasa.gov/" - last_access: 2023-06-13 + last_access: 2024-04-06 info: | Aerosol Optical Depth information from a worldwide network of stations. diff --git a/esmvaltool/cmorizers/data/formatters/datasets/aeronet.py b/esmvaltool/cmorizers/data/formatters/datasets/aeronet.py index 215c67d7a8..e3b5c968d8 100755 --- a/esmvaltool/cmorizers/data/formatters/datasets/aeronet.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/aeronet.py @@ -7,7 +7,7 @@ https://aeronet.gsfc.nasa.gov/ Last access - 20230613 + 20240406 Download and processing instructions Download the following file: diff --git a/esmvaltool/recipes/recipe_aod_aeronet_assess.yml b/esmvaltool/recipes/recipe_aod_aeronet_assess.yml index 0fc82ec864..51cb14759b 100644 --- a/esmvaltool/recipes/recipe_aod_aeronet_assess.yml +++ b/esmvaltool/recipes/recipe_aod_aeronet_assess.yml @@ -44,7 +44,7 @@ diagnostics: start_year: 1994 end_year: 2014 additional_datasets: - - {dataset: AERONET, project: OBS6, mip: AERmon, tier: 3, type: atmos, version: 20231021} + - {dataset: AERONET, project: OBS6, mip: AERmon, tier: 3, type: atmos, version: 20240406} od440aer_season: <<: *var_od440aer From 9ea18591cebeec9df19e8c47d317dd469b9b7ba2 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Wed, 3 Jul 2024 16:28:18 +0200 Subject: [PATCH 14/87] Update the list of datasets used in `recipe_easy_ipcc.yml` (#3710) --- esmvaltool/recipes/examples/recipe_easy_ipcc.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esmvaltool/recipes/examples/recipe_easy_ipcc.yml b/esmvaltool/recipes/examples/recipe_easy_ipcc.yml index 40040e2835..af5d711fa8 100644 --- a/esmvaltool/recipes/examples/recipe_easy_ipcc.yml +++ b/esmvaltool/recipes/examples/recipe_easy_ipcc.yml @@ -63,7 +63,7 @@ diagnostics: script: examples/make_plot.py datasets: - - {dataset: ACCESS-CM2, ensemble: 'r(1:5)i1p1f1', grid: gn} + - {dataset: ACCESS-CM2, ensemble: 'r(1:10)i1p1f1', grid: gn} - {dataset: ACCESS-ESM1-5, ensemble: 'r(1:40)i1p1f1', grid: gn} - {dataset: AWI-CM-1-1-MR, ensemble: r1i1p1f1, grid: gn} - {dataset: BCC-CSM2-MR, ensemble: r1i1p1f1, grid: gn} @@ -118,11 +118,11 @@ datasets: - {dataset: MIROC6, ensemble: 'r(1:50)i1p1f1', grid: gn} - {dataset: MPI-ESM1-2-HR, ensemble: 'r1i1p1f1', grid: gn} # - {dataset: MPI-ESM1-2-HR, ensemble: 'r(1:2)i1p1f1', grid: gn} # second ensemble member causes warnings about large graphs in `concatenate` preprocessor step - - {dataset: MPI-ESM1-2-LR, ensemble: 'r(1:30)i1p1f1', grid: gn} + - {dataset: MPI-ESM1-2-LR, ensemble: 'r(1:50)i1p1f1', grid: gn} - {dataset: MRI-ESM2-0, ensemble: 'r(1:5)i1p1f1', grid: gn} # - {dataset: NESM3, ensemble: 'r(1:2)i1p1f1', grid: gn} # cannot be used due to https://github.com/ESMValGroup/ESMValCore/issues/2101 # - {dataset: NorESM2-LM, ensemble: r1i1p1f1, grid: gn} # duplicated areacello file with wrong name - {dataset: NorESM2-MM, ensemble: r1i1p1f1, grid: gn} - - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} + # - {dataset: TaiESM1, ensemble: r1i1p1f1, grid: gn} # download failure of ssp585 - {dataset: UKESM1-0-LL, ensemble: 'r(1:4)i1p1f2', grid: gn} - {dataset: UKESM1-0-LL, ensemble: r8i1p1f2, grid: gn} From 2e9288abd798cbb19da62f77c12113233708fb28 Mon Sep 17 00:00:00 2001 From: Emma Hogan Date: Wed, 3 Jul 2024 18:23:38 +0100 Subject: [PATCH 15/87] Update the list of broken recipes for `v2.11.0` (#3706) Co-authored-by: Bouwe Andela --- .../source/recipes/broken_recipe_list.rst | 43 +++++++++++++------ .../source/recipes/recipe_wenzel14jgr.rst | 2 + 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/doc/sphinx/source/recipes/broken_recipe_list.rst b/doc/sphinx/source/recipes/broken_recipe_list.rst index e2c5b874d8..78ef3e2e15 100644 --- a/doc/sphinx/source/recipes/broken_recipe_list.rst +++ b/doc/sphinx/source/recipes/broken_recipe_list.rst @@ -9,26 +9,41 @@ More details can be found in the :ref:`broken recipe policy `. .. list-table:: Broken recipes - :widths: 25 25 25 25 + :widths: 25 25 25 25 25 :header-rows: 1 * - Broken recipe - Affected diagnostics + - Broken since release - Problem - GitHub issue - * - `recipe_check_obs.yml` - - `ERA5_native6` - - Derivation of custom variables `rlus` and `rsus` - - `#1388 `_ * - :ref:`recipe_julia.yml ` - `example` - - fill values are not interpreted, resulting in an unusable plot + - v2.5.0 + - Fill values are not interpreted, resulting in an unusable plot - `#2595 `_ - * - :ref:`recipe_seaice_drift.yml ` - - `sea_ice_drift_SCICEX` - - ``shapely 2`` issue - - `#3243 `_ - * - :ref:`recipe_pysplot.yml ` - - `plot_map` - - ``shapely 2`` issue - - `#3483 `_ + * - :ref:`recipe_climwip_brunner2019_med.yml ` + - All (preprocessor issue) + - v2.11.0 + - Failed to run preprocessor function ``fix_metadata`` on the data: Unable to convert units + - `#3694 `_ + * - :ref:`recipe_ocean_amoc.yml ` + - ``diag_timeseries_amoc``, ``diag_transects`` + - v2.11.0 + - CESM1 CMIP5 Omon data no longer available + - `#3693 `_ + * - :ref:`recipe_preprocessor_derive_test.yml ` + - ``cmip6/toz`` + - v2.11.0 + - Failed to run preprocessor function ``derive`` on the data: Unable to convert units + - `#3709 `_ + * - :ref:`recipe_russell18jgr.yml ` + - ``Figure_4`` + - v2.11.0 + - CESM1 CMIP5 Omon data no longer available + - `#3693 `_ + * - :ref:`recipe_wenzel14jgr.yml ` + - ``diag_tsline_Fig2d`` + - v2.11.0 + - CESM1 CMIP5 Omon data no longer available + - `#3693 `_ diff --git a/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst b/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst index 7c07c6e1f5..3c7fa86a3a 100644 --- a/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst +++ b/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst @@ -1,3 +1,5 @@ +.. _recipe_wenzel14jgr: + Emergent constraints on carbon cycle feedbacks ============================================== From 64c371e88d79accb300574f04832e16127a1d9df Mon Sep 17 00:00:00 2001 From: Emma Hogan Date: Thu, 4 Jul 2024 11:39:20 +0100 Subject: [PATCH 16/87] Update the version number and release notes for v2.11.0 (#3695) --- .zenodo.json | 9 +- CITATION.cff | 4 +- doc/sphinx/source/changelog.rst | 129 ++++++++++++++++++ .../release_strategy/release_strategy.rst | 11 +- environment.yml | 2 +- environment_osx.yml | 2 +- 6 files changed, 146 insertions(+), 11 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index 89a81326cb..c087c4ae21 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -171,6 +171,11 @@ "name": "Hagemann, Stefan", "orcid": "0000-0001-5444-2945" }, + { + "affiliation": "University of Canterbury, New Zealand", + "name": "Hardacre, Catherine", + "orcid": "0000-0001-9093-4656" + }, { "affiliation": "ISAC-CNR, Italy", "name": "von Hardenberg, Jost", @@ -391,9 +396,9 @@ "license": { "id": "Apache-2.0" }, - "publication_date": "2023-07-06", + "publication_date": "2024-07-04", "title": "ESMValTool", - "version": "v2.9.0", + "version": "v2.11.0", "communities": [ { "identifier": "is-enes3" diff --git a/CITATION.cff b/CITATION.cff index 7ed624d1d7..22eb3c500e 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -398,11 +398,11 @@ authors: orcid: "https://orcid.org/0000-0003-4750-9923" cff-version: 1.2.0 -date-released: 2023-12-20 +date-released: 2024-07-04 doi: "10.5281/zenodo.3401363" license: "Apache-2.0" message: "If you use this software, please cite it using these metadata." repository-code: "https://github.com/ESMValGroup/ESMValTool/" title: ESMValTool -version: "v2.10.0" +version: "v2.11.0" ... diff --git a/doc/sphinx/source/changelog.rst b/doc/sphinx/source/changelog.rst index d1180d3b8b..76c0a86da5 100644 --- a/doc/sphinx/source/changelog.rst +++ b/doc/sphinx/source/changelog.rst @@ -3,6 +3,135 @@ Changelog ========= +.. _changelog-v2-11-0: + +v2.11.0 +------- +Highlights + +- Two new recipes have been added: + + - Recipe :ref:`recipe_aod_aeronet_assess.yml ` + evaluates model aerosol optical depth (AOD) climatologies against ground + based observations from the AeroNET measurement network. + - Recipe :ref:`recipe_climate_patterns.yml ` + generates climate patterns from CMIP6 model datasets. + +- The ESACCI-WATERVAPOUR CMORizer now includes daily data and uses the + officially released CDR2 data. +- Support for 5 new datasets have been added: + + - AeroNET + - ANU Climate 2.0 Australian data + - Australian Gridded Climate Data(AGCD) precipitation + - NOAA-ERSST + - NSIDC-G02202-sh sea ice fraction + +- NEW TREND: First time release manager shout-outs! + + - This is the first ESMValTool release managed by the Met Office! We want to + shout this out - and for all future first time release managers to + shout-out - to celebrate the growing, thriving ESMValTool community. + +This release includes + +Bug fixes +~~~~~~~~~ + +- Recipe_ocean_quadmap: Update ATSR to match ESGF name (:pull:`3443`) by :user:`rbeucher` +- Fix recipe_bock20jgr_fig_8-10.yml (:pull:`3665`) by :user:`LisaBock` +- Update the list of datasets used in ``recipe_easy_ipcc.yml`` (:pull:`3710`) by :user:`bouweandela` + +Documentation +~~~~~~~~~~~~~ + +- Improve release tools and documentation (:pull:`3462`) by :user:`bouweandela` +- Fix a typo in the references file (:pull:`3499`) by :user:`bouweandela` +- Fix recipe path in ``recipe_perfmetrics.rst`` (:pull:`3532`) by :user:`TomasTorsvik` +- Improved description of model evaluation recipes (:pull:`3541`) by :user:`schlunma` +- Remove double word in cmorizer documentation (:pull:`3553`) by :user:`bettina-gier` +- Fix Codacy badge (:pull:`3558`) by :user:`bouweandela` +- Update the release schedule for v2.11.0 (:pull:`3573`) by :user:`ehogan` +- Improve the formatting of the recipe documentation template (:pull:`3652`) by :user:`mo-gill` +- Add introduction material on the main documentation page (:pull:`3628`) by :user:`bouweandela` +- Avoid warning in documentation build (:pull:`3675`) by :user:`bouweandela` +- Update the list of broken recipes for ``v2.11.0`` (:pull:`3706`) by :user:`ehogan` + +Diagnostics +~~~~~~~~~~~ + +- ``monitor/multi_dataset.py`` improvements: allow data w/o ``timerange`` and improve text formatting (:pull:`3528`) by :user:`schlunma` +- Allow datasets without ``project`` in multi_datasets.py (:pull:`3552`) by :user:`schlunma` +- Prevent overlapping time axis tick labels in monitoring recipe (:pull:`3682`) by :user:`schlunma` + +New recipe +~~~~~~~~~~ + +- Add support for aerosol optical depth climatology metrics to the AutoAssess replacement (:pull:`3048`) by :user:`catherinehardacre` +- CMIP6 climate patterns (:pull:`2785`) by :user:`mo-gregmunday` + +Observational and re-analysis dataset support +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Add cmorizer scripts for NOAA-ERSST. (:pull:`1799`) by :user:`bjoernbroetz` +- Update OceanSODA-ETHZ CMORizer with new source file (:pull:`3535`) by :user:`TomasTorsvik` +- Add CMORizer script for NSIDC-G02202-sh sea ice fraction (:pull:`3512`) by :user:`flicj191` +- CMORizer Australian Gridded Climate Data(AGCD) precipitation (:pull:`3445`) by :user:`flicj191` +- Extend CMORizer NCEP-DOE-R2 (:pull:`3469`) by :user:`axel-lauer` +- Add comment to recipe_lauer13jclim regarding UWisc being superseded by MAC-LWP (:pull:`3537`) by :user:`rbeucher` +- Recipe_autoassess_landsurface_surfrad: Remove CERES-EBAF version to fix ESGF search (:pull:`3438`) by :user:`rbeucher` +- Updating ESACCI-WATERVAPOUR cmorizer (:pull:`3282`) by :user:`malininae` +- CMORiser for ANU Climate 2.0 Australian data (:pull:`3511`) by :user:`flicj191` +- Add AERONET cmorizer (:pull:`3227`) by :user:`zklaus` +- Update CRU CMORizer (:pull:`3381`) by :user:`lukruh` +- Fix recipe_check_obs to be aligned with DKRZ (:pull:`3673`) by :user:`LisaBock` +- Update AERONET data version (:pull:`3692`) by :user:`ehogan` + +Automatic testing +~~~~~~~~~~~~~~~~~ + +- Move code into function in batch job generation script (:pull:`3491`) by :user:`bouweandela` +- Fix sklearn tests (:pull:`3506`) by :user:`schlunma` +- Pinned sklearn>=1.4.0 (:pull:`3508`) by :user:`schlunma` +- Update sklearn tests to be compatible with current pytest version (pytest >=8.0.0) (:pull:`3517`) by :user:`schlunma` +- Update sklearn tests to be compatible with current pytest version (pytest >=8.0.0) Part 2 (:pull:`3518`) by :user:`schlunma` +- [Circle/CI]Fix `test_installation_from_conda` Circle CI tests (:pull:`3538`) by :user:`valeriupredoi` +- [Github Actions] install git in OSX and add environment inspection (:pull:`3581`) by :user:`valeriupredoi` +- [CI Github Actions] Update (outdated) actions versions that produce Node.js warnings (:pull:`3586`) by :user:`valeriupredoi` +- Fix ``flake8==7`` linting issues (:pull:`3634`) by :user:`valeriupredoi` +- Use ``importlib`` as the import mode for ``pytest`` (:pull:`3672`) by :user:`ehogan` + +Installation +~~~~~~~~~~~~ + +- Update dependencies (:pull:`3487`) by :user:`bouweandela` +- Merge v2.10.x into main (:pull:`3489`) by :user:`schlunma` +- Add imagehash package as an ESMValTool dependency (:pull:`3557`) by :user:`alistairsellar` +- Unpin ``r-akima`` (:pull:`3564`) by :user:`valeriupredoi` +- Adding pys2index dependency (:pull:`3577`) by :user:`ljoakim` +- Pin esmpy <8.6.0 (:pull:`3585`) by :user:`valeriupredoi` +- Pin R <4.3.0 (:pull:`3689`) by :user:`ehogan` +- Pin importlib_metadata <8 (:pull:`3700`) by :user:`ehogan` +- Pin matplotlib <3.9.0 on ESMValTool release branch (:pull:`3712`) by :user:`ehogan` + +Dependency updates +~~~~~~~~~~~~~~~~~~ + +- Fix for ``recipe_seaice_drift.yml``: fix CRS transformer for "North Pole Stereographic" (:pull:`3531`) by :user:`flicj191` +- Fixed attribute handling in austral_jet/main.ncl for iris>=3.8 (:pull:`3603`) by :user:`schlunma` +- Fixed attribute handling in emergent constraint diagnostic for iris>=3.8 (:pull:`3605`) by :user:`schlunma` +- Update the name of the remapcon2 operator in R recipes (:pull:`3611`) by :user:`ehogan` +- Use ``iris.FUTURE.save_split_attrs = True`` to remove iris warning in many diagnostics (:pull:`3651`) by :user:`schlunma` +- Avoid concatenation error in recipe_pcrglobwb.yml (:pull:`3645`) by :user:`bouweandela` +- Update `scipy.integrate.simps` import (:pull:`3704`) by :user:`ehogan` + +Improvements +~~~~~~~~~~~~ + +- Add native6, OBS6 and RAWOBS rootpaths to metoffice template in config-user-example.yml and remove temporary dir (:pull:`3613`) by :user:`alistairsellar` + +.. _changelog-v2-10-0: + v2.10.0 ------- Highlights diff --git a/doc/sphinx/source/community/release_strategy/release_strategy.rst b/doc/sphinx/source/community/release_strategy/release_strategy.rst index cae1c43807..b95bab67b1 100644 --- a/doc/sphinx/source/community/release_strategy/release_strategy.rst +++ b/doc/sphinx/source/community/release_strategy/release_strategy.rst @@ -53,6 +53,10 @@ With the following release schedule, we strive to have three releases per year a Upcoming releases ^^^^^^^^^^^^^^^^^ +- 2.12.0 (TBD) + +Past releases +^^^^^^^^^^^^^ - 2.11.0 (Release Manager: Met Office: `Emma Hogan`_, `Chris Billows`_, `Ed Gillett`_) @@ -61,16 +65,13 @@ Upcoming releases +============+============+========================================+=====================================+ | 2024-04-22 | | ESMValCore `Feature Freeze`_ | | +------------+------------+----------------------------------------+-------------------------------------+ -| 2023-05-03 | | ESMValCore released | | +| 2023-05-03 | 2024-07-03 | :esmvalcore-release:`v2.11.0` released | :ref:`esmvalcore:changelog-v2-11-0` | +------------+------------+----------------------------------------+-------------------------------------+ | 2023-05-06 | | ESMValTool `Feature Freeze`_ | | +------------+------------+----------------------------------------+-------------------------------------+ -| 2023-05-17 | | ESMValTool released | | +| 2023-05-17 | 2024-07-04 | :release:`v2.11.0` released | :ref:`changelog-v2-11-0` | +------------+------------+----------------------------------------+-------------------------------------+ -Past releases -^^^^^^^^^^^^^ - - 2.10.0 (Release Manager: `Klaus Zimmermann`_) +------------+------------+----------------------------------------+-------------------------------------+ diff --git a/environment.yml b/environment.yml index 0d9d82a5c9..edb2ec0254 100644 --- a/environment.yml +++ b/environment.yml @@ -22,7 +22,7 @@ dependencies: - ecmwf-api-client - eofs - esmpy >=8.6.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - - esmvalcore 2.10.* + - esmvalcore 2.11.* - fiona - fire - fsspec diff --git a/environment_osx.yml b/environment_osx.yml index 049017a30c..69bf06e8f0 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -22,7 +22,7 @@ dependencies: - ecmwf-api-client - eofs - esmpy >=8.6.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - - esmvalcore 2.10.* + - esmvalcore 2.11.* - fiona - fire - fsspec From 9633fbe31791b5ecc0d0ce0ae5c0e2b8b1ad9f5c Mon Sep 17 00:00:00 2001 From: Diego Cammarano Date: Tue, 9 Jul 2024 13:44:58 +0200 Subject: [PATCH 17/87] Update esacci-soilmoisture(v08.1) downloader and CMORizer (Python version) (#3676) Co-authored-by: Manuel Schlund <32543114+schlunma@users.noreply.github.com> --- doc/sphinx/source/input.rst | 2 +- .../data/cmor_config/ESACCI-SOILMOISTURE.yml | 21 +++ esmvaltool/cmorizers/data/datasets.yml | 6 +- .../datasets/esacci_soilmoisture.py | 8 +- .../datasets/esacci_soilmoisture.ncl | 174 ------------------ .../datasets/esacci_soilmoisture.py | 149 +++++++++++++++ esmvaltool/cmorizers/data/utilities.py | 17 +- .../recipes/examples/recipe_check_obs.yml | 18 +- .../references/esacci-soilmoisture.bibtex | 124 +++++++++++-- 9 files changed, 312 insertions(+), 207 deletions(-) create mode 100644 esmvaltool/cmorizers/data/cmor_config/ESACCI-SOILMOISTURE.yml delete mode 100644 esmvaltool/cmorizers/data/formatters/datasets/esacci_soilmoisture.ncl create mode 100644 esmvaltool/cmorizers/data/formatters/datasets/esacci_soilmoisture.py diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index 20a417cfc6..798b2ceb27 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -308,7 +308,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESACCI-SEA-SURFACE-SALINITY | sos (Omon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| ESACCI-SOILMOISTURE | dos, dosStderr, sm, smStderr (Lmon) | 2 | NCL | +| ESACCI-SOILMOISTURE | sm (Eday, Lmon), smStderr (Eday) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESACCI-SST | ts, tsStderr (Amon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ diff --git a/esmvaltool/cmorizers/data/cmor_config/ESACCI-SOILMOISTURE.yml b/esmvaltool/cmorizers/data/cmor_config/ESACCI-SOILMOISTURE.yml new file mode 100644 index 0000000000..f2b7a1053d --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/ESACCI-SOILMOISTURE.yml @@ -0,0 +1,21 @@ +attributes: + project_id: 'OBS' + dataset_id: 'ESACCI-SOILMOISTURE' + tier: 2 + modeling_realm: sat + institution: 'TU Wien (AUT); VanderSat B.V. (NL); Planet Labs (NL); CESBIO (FR), EODC Gmbh (AUT)' + reference: 'esacci-soilmoisture' + source: 'ftp://anon-ftp.ceda.ac.uk/neodc/esacci/soil_moisture/data/' + title: 'ESA CCI Soil Moisture' + version: 'L3S-SSMV-COMBINED-v08.1' + comment: '' +variables: + sm: + mip: Eday + raw: sm + filename: ESACCI-SOILMOISTURE-L3S-SSMV-COMBINED-{year}????000000-fv08.1.nc + smStderr: + mip: Eday + raw: sm_uncertainty + filename: ESACCI-SOILMOISTURE-L3S-SSMV-COMBINED-{year}????000000-fv08.1.nc + \ No newline at end of file diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index 2ed387f55c..dabe314025 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -531,11 +531,11 @@ datasets: ESACCI-SOILMOISTURE: tier: 2 source: ftp://anon-ftp.ceda.ac.uk/neodc/esacci/soil_moisture/data/ - last_access: 2019-02-01 + last_access: 2024-06-19 info: | Download the data from: - daily_files/COMBINED/v04.2/ - ancillary/v04.2/ + daily_files/COMBINED/v08.1/ + ancillary/v08.1/ Put all files under a single directory (no subdirectories with years). ESACCI-SEA-SURFACE-SALINITY: diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/esacci_soilmoisture.py b/esmvaltool/cmorizers/data/downloaders/datasets/esacci_soilmoisture.py index d31f330497..0d29e96ff9 100644 --- a/esmvaltool/cmorizers/data/downloaders/datasets/esacci_soilmoisture.py +++ b/esmvaltool/cmorizers/data/downloaders/datasets/esacci_soilmoisture.py @@ -26,9 +26,9 @@ def download_dataset(config, dataset, dataset_info, start_date, end_date, Overwrite already downloaded files """ if start_date is None: - start_date = datetime(1979, 1, 1) + start_date = datetime(1978, 11, 1) if end_date is None: - end_date = datetime(2016, 1, 1) + end_date = datetime(2022, 12, 31) loop_date = start_date @@ -40,9 +40,9 @@ def download_dataset(config, dataset, dataset_info, start_date, end_date, ) downloader.ftp_name = 'soil_moisture' downloader.connect() - downloader.set_cwd('ancillary/v04.2/') + downloader.set_cwd('ancillary/v08.1/') downloader.download_folder('.') - downloader.set_cwd('daily_files/COMBINED/v04.2/') + downloader.set_cwd('daily_files/COMBINED/v08.1/') while loop_date <= end_date: year = loop_date.year downloader.download_year(f'{year}') diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esacci_soilmoisture.ncl b/esmvaltool/cmorizers/data/formatters/datasets/esacci_soilmoisture.ncl deleted file mode 100644 index 96ebe7f648..0000000000 --- a/esmvaltool/cmorizers/data/formatters/datasets/esacci_soilmoisture.ncl +++ /dev/null @@ -1,174 +0,0 @@ -; ############################################################################# -; ESMValTool CMORizer for ESACCI-SOILMOISTURE data -; ############################################################################# -; -; Tier -; Tier 2: other freely-available dataset. -; -; Source -; ftp://anon-ftp.ceda.ac.uk/neodc/esacci/soil_moisture/data/ -; -; Last access -; 20190201 -; -; Download and processing instructions -; Download the data from: -; daily_files/COMBINED/v04.2/ -; ancillary/v04.2/ -; Put all files under a single directory (no subdirectories with years). -; -; Modification history -; 20190201-righi_mattia: adapted to v2, use new input data version 4.2. -; 20160824-lauer_axel: added processing of volumetric soil moisture -; content (sm, smStderr). -; 20160721-lauer_axel: use daily files, added processing of uncertainty. -; 20150523-righi_mattia: written. -; -; ############################################################################# -loadscript(getenv("esmvaltool_root") + \ - "/data/formatters/interface.ncl") - -begin - - ; Script name (for logger) - DIAG_SCRIPT = "esacci_soilmoisture.ncl" - - ; Source name - OBSNAME = "ESACCI-SOILMOISTURE" - - ; Tier - TIER = 2 - - ; Period - YEAR1 = get_year(start_year, 1979) - YEAR2 = get_year(end_year, 2016) - - ; Selected variable (standard name) - VAR = (/"sm", "smStderr", "dos", "dosStderr"/) - - ; Name in the raw data - NAME = (/"sm", "sm_uncertainty", "sm", "sm_uncertainty"/) - - ; MIP - MIP = (/"Lmon", "Lmon", "Lmon", "Lmon"/) - - ; Frequency - FREQ = (/"mon", "mon", "mon", "mon"/) - - ; CMOR table - CMOR_TABLE = getenv("cmor_tables") + "/custom/CMOR_" + VAR + ".dat" - - ; Type - TYPE = "sat" - - ; Version - VERSION = "L3S-SSMV-COMBINED-v4.2" - - ; Global attributes - SOURCE = "ftp://anon-ftp.ceda.ac.uk/neodc/esacci/soil_moisture/data/" - REF = \ - "Liu et al., Hydrol. Earth Syst. Sci., doi:10.5194/hess-15-425-2011, 2011." - COMMENT = "" - -end - -begin - - do vv = 0, dimsizes(VAR) - 1 - - log_info("Processing " + VAR(vv) + " (" + MIP(vv) + ")") - - do yy = YEAR1, YEAR2 - - ; Set list of files - files = systemfunc("ls " + input_dir_path + \ - "ESACCI-SOILMOISTURE-L3S-SSMV-" + \ - "COMBINED-" + yy + "????000000-fv04.2.nc") - f = addfiles(files, "r") - delete(files) - - ; Read data - xx = f[:]->$NAME(vv)$ - if (isatt(xx, "scale_factor")) then - tmp = tofloat(xx * xx@scale_factor) - copy_VarAtts(xx, tmp) - copy_VarCoords(xx, tmp) - delete(xx) - xx = tmp - delete(tmp) - end if - delete(f) - - ; Derive dos using porosity - if (any(VAR(vv).eq.(/"dos", "dosStderr"/))) then - g = addfile(input_dir_path + \ - "/ESACCI-SOILMOISTURE-POROSITY_V01.1.nc", "r") - zz = g->porosity - xx = xx * 100. / conform(xx, zz, (/1, 2/)) - delete(zz) - end if - - ; Add a minor time shift for correct extraction of monthly mean below - xx&time = xx&time + 0.1 - - ; Calculate monthly means - if (isStrSubset(VAR(vv), "Stderr")) then - xx2 = xx - xx2 = xx ^ 2 ; save metadata - tmp = calculate_monthly_values(xx2, "avg", 0, False) - delete(xx) - delete(xx2) - xx = sqrt(tmp) - copy_VarAtts(tmp, xx) - copy_VarCoords(tmp, xx) - delete(tmp) - else - tmp = calculate_monthly_values(xx, "avg", 0, False) - delete(xx) - xx = tmp - delete(tmp) - end if - - ; Append to time-series - if (.not.isdefined("output")) then - output = xx - else - output := array_append_record(output, xx, 0) - end if - delete(xx) - - end do - - ; Format coordinates - output!0 = "time" - output!1 = "lat" - output!2 = "lon" - format_coords(output, YEAR1 + "0101", YEAR2 + "1231", FREQ(vv)) - - ; Set variable attributes - tmp = format_variable(output, VAR(vv), CMOR_TABLE(vv)) - delete(output) - output = tmp - delete(tmp) - - ; Calculate coordinate bounds - bounds = guess_coord_bounds(output, FREQ(vv)) - - ; Set global attributes - gAtt = set_global_atts(OBSNAME, TIER, SOURCE, REF, COMMENT) - - ; Output file - DATESTR = YEAR1 + "01-" + YEAR2 + "12" - fout = output_dir_path + \ - str_join((/"OBS", OBSNAME, TYPE, VERSION, \ - MIP(vv), VAR(vv), DATESTR/), "_") + ".nc" - - ; Write variable - write_nc(fout, VAR(vv), output, bounds, gAtt) - delete(gAtt) - delete(output) - delete(bounds) - - end do - -end diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esacci_soilmoisture.py b/esmvaltool/cmorizers/data/formatters/datasets/esacci_soilmoisture.py new file mode 100644 index 0000000000..66859b420b --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/esacci_soilmoisture.py @@ -0,0 +1,149 @@ +"""ESMValTool CMORizer for ESACCI-SOILMOISTURE data. + +Tier + Tier 2: other freely-available dataset. + +Source + ftp://anon-ftp.ceda.ac.uk/neodc/esacci/soil_moisture/data/ + +Last access + 20240626 + +Download and processing instructions + Download the data from: + daily_files/COMBINED/v08.1/ + ancillary/v08.1/ + Put all files under a single directory (no subdirectories with years). + in ${RAWOBS}/Tier2/ESACCI-SOILMOISTURE + +""" + +import glob +import logging +import os +from datetime import datetime +import iris +from esmvalcore.preprocessor import concatenate, monthly_statistics +from cf_units import Unit + +from ...utilities import ( + fix_var_metadata, + fix_dim_coordnames, + fix_bounds, + save_variable, + set_global_atts +) + +logger = logging.getLogger(__name__) + + +def fix_coords(cube): + """Fix coordinates to CMOR standards. + + Fixes coordinates eg time to have correct units, bounds etc; + longitude to be CMOR-compliant 0-360deg; fixes some attributes + and bounds - the user can avert bounds fixing by using supplied + arguments; if bounds are None they will be fixed regardless. + + Parameters + ---------- + cube: iris.cube.Cube + data cube with coordinates to be fixed. + + + Returns + ------- + cube: iris.cube.Cube + data cube with fixed coordinates. + """ + # First fix any completely missing coord var names + fix_dim_coordnames(cube) + + # Convert longitude from -180...180 to 0...360 + cube = cube.intersection(longitude=(0.0, 360.0)) + + # Fix individual coords + for cube_coord in cube.coords(): + # Fix time + if cube_coord.var_name == 'time': + logger.info("Fixing time...") + cube.coord('time').convert_units( + Unit('days since 1970-01-01T00:00:00+00:00', + calendar='proleptic_gregorian')) + + # Fix latitude + if cube_coord.var_name == 'lat': + logger.info("Fixing latitude...") + cube = iris.util.reverse(cube, cube_coord) + + # Fix bounds of all coordinates + fix_bounds(cube, cube_coord) + + return cube + + +def extract_variable(raw_info): + """Extract variables.""" + rawvar = raw_info['name'] + constraint = iris.Constraint(name=rawvar) + if rawvar == 'sm_uncertainty': + sm_cube = iris.load_cube(raw_info['file'], + iris.NameConstraint(var_name='sm')) + ancillary_var = sm_cube.ancillary_variable( + 'Volumetric Soil Moisture Uncertainty' + ) + cube = sm_cube.copy(ancillary_var.core_data()) + else: + cube = iris.load_cube(raw_info['file'], constraint) + + # Remove dysfunctional ancillary data without standard names + for ancillary_variable in cube.ancillary_variables(): + cube.remove_ancillary_variable(ancillary_variable) + + return cube + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorize data.""" + glob_attrs = cfg['attributes'] + if not start_date: + start_date = datetime(1978, 1, 1) + if not end_date: + end_date = datetime(2022, 12, 31) + + # run the cmorization + for var_name, vals in cfg['variables'].items(): + all_data_cubes = [] + if not isinstance(vals, dict): # Ensure vals is a dictionary + raise ValueError( + f"Invalid format for variable {var_name}: {type(vals)}" + ) + var_info = cfg['cmor_table'].get_variable(vals['mip'], var_name) + glob_attrs['mip'] = vals['mip'] + raw_info = {'name': vals['raw']} + inpfile_pattern = os.path.join(in_dir, vals['filename']) + logger.info("CMORizing var %s from file type %s", + var_name, inpfile_pattern) + + for year in range(start_date.year, end_date.year + 1): + year_inpfile_pattern = inpfile_pattern.format(year=year) + inpfiles = sorted(glob.glob(year_inpfile_pattern)) + for inpfile in inpfiles: + raw_info['file'] = inpfile + cube = extract_variable(raw_info) + all_data_cubes.append(cube) + final_cube = concatenate(all_data_cubes) + fix_var_metadata(final_cube, var_info) + final_cube = fix_coords(final_cube) + set_global_atts(final_cube, glob_attrs) + + save_variable(final_cube, var_name, out_dir, glob_attrs, + unlimited_dimensions=['time']) + + # For sm, also save monthly means + if var_name == 'sm': + monthly_mean_cube = monthly_statistics(final_cube, 'mean') + glob_attrs['mip'] = 'Lmon' + monthly_mean_cube.attributes.update(glob_attrs) + save_variable(monthly_mean_cube, var_name, out_dir, glob_attrs, + unlimited_dimensions=['time']) diff --git a/esmvaltool/cmorizers/data/utilities.py b/esmvaltool/cmorizers/data/utilities.py index 3620cee30e..82da07c12e 100644 --- a/esmvaltool/cmorizers/data/utilities.py +++ b/esmvaltool/cmorizers/data/utilities.py @@ -359,7 +359,7 @@ def save_variable(cube, var, outdir, attrs, **kwargs): def extract_doi_value(tags): """Extract doi(s) from a bibtex entry.""" reference_doi = [] - pattern = r'doi\ = {(.*?)\},' + pattern = r'doi\s*=\s*{([^}]+)}' if not isinstance(tags, list): tags = [tags] @@ -368,17 +368,18 @@ def extract_doi_value(tags): bibtex_file = REFERENCES_PATH / f'{tag}.bibtex' if bibtex_file.is_file(): reference_entry = bibtex_file.read_text() - if re.search("doi", reference_entry): - reference_doi.append( - f'doi:{re.search(pattern, reference_entry).group(1)}') + dois = re.findall(pattern, reference_entry) + if dois: + for doi in dois: + reference_doi.append(f'doi:{doi}') else: reference_doi.append('doi not found') - logger.warning('The reference file %s does not have a doi.', - bibtex_file) + logger.warning( + 'The reference file %s does not have a doi.', bibtex_file) else: reference_doi.append('doi not found') - logger.warning('The reference file %s does not exist.', - bibtex_file) + logger.warning( + 'The reference file %s does not exist.', bibtex_file) return ', '.join(reference_doi) diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index 10504a3692..b3cca9e028 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -297,14 +297,20 @@ diagnostics: ESACCI-SOILMOISTURE: description: ESACCI-SOILMOISTURE check variables: - dos: - dosStderr: - sm: + sm_daily: + short_name: sm + mip: Eday + frequency: day + sm_monthly: + short_name: sm + mip: Lmon + frequency: mon smStderr: + mip: Eday + frequency: day additional_datasets: - - {dataset: ESACCI-SOILMOISTURE, project: OBS, mip: Lmon, tier: 2, - type: sat, version: L3S-SSMV-COMBINED-v4.2, - start_year: 2005, end_year: 2011} + - {dataset: ESACCI-SOILMOISTURE, project: OBS, tier: 2, + type: sat, version: L3S-SSMV-COMBINED-v08.1, start_year: 1978, end_year: 2022} scripts: null diff --git a/esmvaltool/references/esacci-soilmoisture.bibtex b/esmvaltool/references/esacci-soilmoisture.bibtex index 59e275d6c4..7e4404a8f4 100644 --- a/esmvaltool/references/esacci-soilmoisture.bibtex +++ b/esmvaltool/references/esacci-soilmoisture.bibtex @@ -1,13 +1,115 @@ @article{esacci-soilmoisture, - doi = {10.5194/hess-15-425-2011}, - url = {https://doi.org/10.5194%2Fhess-15-425-2011}, - year = 2011, - month = {feb}, - publisher = {Copernicus {GmbH}}, - volume = {15}, - number = {2}, - pages = {425--436}, - author = {Y. Y. Liu and R. M. Parinussa and W. A. Dorigo and R. A. M. De Jeu and W. Wagner and A. I. J. M. van Dijk and M. F. McCabe and J. P. Evans}, - title = {Developing an improved soil moisture dataset by blending passive and active microwave satellite-based retrievals}, - journal = {Hydrology and Earth System Sciences} + doi = {10.5194/essd-11-717-2019}, + title = {Evolution of the {ESA} {CCI} Soil Moisture climate data records + and their underlying merging methodology}, + author = {Gruber, Alexander and Scanlon, Tracy and van der Schalie, Robin + and Wagner, Wolfgang and Dorigo, Wouter}, + abstract = {The European Space Agency's Climate Change Initiative + for Soil Moisture (ESA CCI SM) merging algorithm generates + consistent quality-controlled long-term (1978--2018) climate + data records for soil moisture, which serves thousands of + scientists and data users worldwide. It harmonises and merges + soil moisture retrievals from multiple satellites into (i) an + active-microwave-based-only product, (ii) a + passive-microwave-based-only product and (iii) a combined + active--passive product, which are sampled to daily global + images on a 0.25∘ regular grid. Since its first release in 2012 + the algorithm has undergone substantial improvements which have + so far not been thoroughly reported in the scientific + literature. This paper fills this gap by reviewing and + discussing the science behind the three major ESA CCI SM merging + algorithms, versions 2 + (https://doi.org/10.5285/3729b3fbbb434930bf65d82f9b00111c; + Wagner et al., 2018), 3 + (https://doi.org/10.5285/b810601740bd4848b0d7965e6d83d26c; + Dorigo et al., 2018) and 4 + (https://doi.org/10.5285/dce27a397eaf47e797050c220972ca0e; + Dorigo et al., 2019), and provides an outlook on the expected + improvements planned for the next algorithm, version 5.}, + journal = {Earth Syst. Sci. Data}, + publisher = {Copernicus GmbH}, + volume = {11}, + number = {2}, + pages = {717--739}, + month = {may}, + year = 2019 } + +@article{esacci-soilmoisture, + doi = {10.1016/j.rse.2017.07.001}, + title = {{ESA} {CCI} Soil Moisture for improved Earth system + understanding: State-of-the art and future directions}, + author = {Dorigo, Wouter and Wagner, Wolfgang and Albergel, Clement and + Albrecht, Franziska and Balsamo, Gianpaolo and Brocca, Luca and + Chung, Daniel and Ertl, Martin and Forkel, Matthias and Gruber, + Alexander and Haas, Eva and Hamer, Paul D and Hirschi, Martin + and Ikonen, Jaakko and de Jeu, Richard and Kidd, Richard and + Lahoz, William and Liu, Yi Y and Miralles, Diego and + Mistelbauer, Thomas and Nicolai-Shaw, Nadine and Parinussa, + Robert and Pratola, Chiara and Reimer, Christoph and van der + Schalie, Robin and Seneviratne, Sonia I and Smolander, Tuomo and + Lecomte, Pascal}, + abstract = {Climate Data Records of soil moisture are fundamental for + improving our understanding of long-term dynamics in the coupled + water, energy, and carbon cycles over land. To respond to this + need, in 2012 the European Space Agency (ESA) released the first + multi-decadal, global satellite-observed soil moisture (SM) + dataset as part of its Climate Change Initiative (CCI) program. + This product, named ESA CCI SM, combines various single-sensor + active and passive microwave soil moisture products into three + harmonised products: a merged ACTIVE, a merged PASSIVE, and a + COMBINED active + passive microwave product. Compared to the + first product release, the latest version of ESA CCI SM includes + a large number of enhancements, incorporates various new + satellite sensors, and extends its temporal coverage to the + period 1978--2015. In this study, we first provide a + comprehensive overview of the characteristics, evolution, and + performance of the ESA CCI SM products. Based on original + research and a review of existing literature we show that the + product quality has steadily increased with each successive + release and that the merged products generally outperform the + single-sensor input products. Although ESA CCI SM generally + agrees well with the spatial and temporal patterns estimated by + land surface models and observed in-situ, we identify surface + conditions (e.g., dense vegetation, organic soils) for which it + still has large uncertainties. Second, capitalising on the + results of > 100 research studies that made use of the ESA CCI + SM data we provide a synopsis of how it has contributed to + improved process understanding in the following Earth system + domains: climate variability and change, land-atmosphere + interactions, global biogeochemical cycles and ecology, + hydrological and land surface modelling, drought applications, + and meteorology. While in some disciplines the use of ESA CCI SM + is already widespread (e.g. in the evaluation of model soil + moisture states) in others (e.g. in numerical weather prediction + or flood forecasting) it is still in its infancy. The latter is + partly related to current shortcomings of the product, e.g., the + lack of near-real-time availability and data gaps in time and + space. This study discloses the discrepancies between current + ESA CCI SM product characteristics and the preferred + characteristics of long-term satellite soil moisture products as + outlined by the Global Climate Observing System (GCOS), and + provides important directions for future ESA CCI SM product + improvements to bridge these gaps.}, + journal = {Remote Sens. Environ.}, + publisher = {Elsevier BV", + volume = {203}, + pages = {185--215}, + month = {dec}, + year = 2017 +} + +@article{esacci-soilmoisture, + doi = {10.1109/TGRS.2020.3012896}, + title = {Homogenization of structural breaks in the global {ESA} {CCI} + soil moisture multisatellite climate data record}, + author = {Preimesberger, Wolfgang and Scanlon, Tracy and Su, Chun-Hsu and + Gruber, Alexander and Dorigo, Wouter}, + journal = {IEEE Trans. Geosci. Remote Sens.}, + publisher = {Institute of Electrical and Electronics Engineers (IEEE)}, + volume = {159}, + number = {14}, + pages = {12845--2862}, + month = {apr}, + year = 2021 +} \ No newline at end of file From e83ba663dd64857cfe3cd594a9d51c12bfca064e Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Wed, 10 Jul 2024 11:49:26 +0100 Subject: [PATCH 18/87] [Merge after v2.11.0 Release] Retire support for Python 3.9 (#3683) --- .github/workflows/install-from-conda.yml | 4 +- .../workflows/install-from-condalock-file.yml | 2 +- .github/workflows/install-from-source.yml | 4 +- .github/workflows/run-tests-monitor.yml | 4 +- .github/workflows/test-development.yml | 2 +- .github/workflows/test.yml | 4 +- doc/sphinx/source/quickstart/installation.rst | 40 ++----------------- environment.yml | 2 +- environment_osx.yml | 2 +- setup.py | 1 - 10 files changed, 15 insertions(+), 50 deletions(-) diff --git a/.github/workflows/install-from-conda.yml b/.github/workflows/install-from-conda.yml index 862fd0aad6..b08390040d 100644 --- a/.github/workflows/install-from-conda.yml +++ b/.github/workflows/install-from-conda.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11"] name: Linux Python ${{ matrix.python-version }} steps: - uses: conda-incubator/setup-miniconda@v3 @@ -56,7 +56,7 @@ jobs: # runs-on: "macos-latest" # strategy: # matrix: -# python-version: ["3.9", "3.10", "3.11"] +# python-version: ["3.10", "3.11"] # fail-fast: false # name: OSX Python ${{ matrix.python-version }} # steps: diff --git a/.github/workflows/install-from-condalock-file.yml b/.github/workflows/install-from-condalock-file.yml index ef19a4cb15..a03e297a80 100644 --- a/.github/workflows/install-from-condalock-file.yml +++ b/.github/workflows/install-from-condalock-file.yml @@ -30,7 +30,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11"] fail-fast: false name: Linux Python ${{ matrix.python-version }} steps: diff --git a/.github/workflows/install-from-source.yml b/.github/workflows/install-from-source.yml index 6e9c1de19a..3d7456337b 100644 --- a/.github/workflows/install-from-source.yml +++ b/.github/workflows/install-from-source.yml @@ -19,7 +19,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11"] fail-fast: false name: Linux Python ${{ matrix.python-version }} steps: @@ -59,7 +59,7 @@ jobs: # runs-on: "macos-latest" # strategy: # matrix: -# python-version: ["3.9", "3.10", "3.11"] +# python-version: ["3.10", "3.11"] # fail-fast: false # name: OSX Python ${{ matrix.python-version }} # steps: diff --git a/.github/workflows/run-tests-monitor.yml b/.github/workflows/run-tests-monitor.yml index 52cc282235..168d8940e5 100644 --- a/.github/workflows/run-tests-monitor.yml +++ b/.github/workflows/run-tests-monitor.yml @@ -23,7 +23,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11"] name: Linux Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v4 @@ -67,7 +67,7 @@ jobs: runs-on: "macos-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11"] architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} diff --git a/.github/workflows/test-development.yml b/.github/workflows/test-development.yml index c75cd23cb8..2dba36577d 100644 --- a/.github/workflows/test-development.yml +++ b/.github/workflows/test-development.yml @@ -26,7 +26,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11"] name: Linux Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 49f1a14003..f3822e5449 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11"] name: Linux Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v4 @@ -72,7 +72,7 @@ jobs: runs-on: "macos-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11"] architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} diff --git a/doc/sphinx/source/quickstart/installation.rst b/doc/sphinx/source/quickstart/installation.rst index a4f9f2a64c..4fb75b2f4f 100644 --- a/doc/sphinx/source/quickstart/installation.rst +++ b/doc/sphinx/source/quickstart/installation.rst @@ -8,7 +8,7 @@ Installation ESMValTool now uses `mamba` instead of `conda` for the recommended installation. For more information about the change, have a look at :ref:`Move to Mamba`. -ESMValTool supports Python 3.9 and later and requires Linux or MacOS. +ESMValTool supports Python 3.10 and later and requires Linux or MacOS. Successful usage on Windows has been reported by following the Linux installation instructions with `WSL `__. @@ -489,7 +489,7 @@ To check that the installation was successful, run this should show the directory of the source code that you just downloaded. If the command above shows a directory inside your conda environment instead, -e.g. ``~/mambaforge/envs/esmvaltool/lib/python3.9/site-packages/esmvalcore``, +e.g. ``~/mambaforge/envs/esmvaltool/lib/python3.11/site-packages/esmvalcore``, you may need to manually remove that directory and run ``pip install --editable '.[develop]'`` again. @@ -684,40 +684,6 @@ repository, a direct download link can be found `here =3.9, asking for an older Python version, e.g. `python=3.7`, in -this way, it will result in installation failure. - Problems with proxies --------------------- If you are installing ESMValTool from source from behind a proxy that does not @@ -778,7 +744,7 @@ Problems when updating the conda environment -------------------------------------------- Usually mamba is much better at solving new environments than updating older environments, so it is often a good idea to create a new environment if updating -does not work. See also `Mamba fails to solve the environment`_. +does not work. Do not run ``mamba update --update-all`` in the ``esmvaltool`` environment since that will update some packages that are pinned to diff --git a/environment.yml b/environment.yml index edb2ec0254..7b74955350 100644 --- a/environment.yml +++ b/environment.yml @@ -51,7 +51,7 @@ dependencies: - psy-simple - pyproj >=2.1 - pys2index # only from conda-forge - - python >=3.9 + - python >=3.10 - python-cdo - python-dateutil - pyyaml diff --git a/environment_osx.yml b/environment_osx.yml index 69bf06e8f0..46a418c2fa 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -51,7 +51,7 @@ dependencies: - psy-simple - pyproj >=2.1 - pys2index # only from conda-forge - - python >=3.9 + - python >=3.10 - python-cdo - python-dateutil - pyyaml diff --git a/setup.py b/setup.py index 5cb030b8a4..e97f0d1dfb 100755 --- a/setup.py +++ b/setup.py @@ -221,7 +221,6 @@ def read_description(filename): 'Natural Language :: English', 'Operating System :: POSIX :: Linux', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Topic :: Scientific/Engineering', From d35ecb7d522abc32b63541a3b2511105982673af Mon Sep 17 00:00:00 2001 From: Liza Malinina <66973360+malininae@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:06:03 -0700 Subject: [PATCH 19/87] Update ERA5 renaming script for hourly (#3630) Co-authored-by: Elizaveta Malinina --- esmvaltool/diag_scripts/cmorizers/era5.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/esmvaltool/diag_scripts/cmorizers/era5.py b/esmvaltool/diag_scripts/cmorizers/era5.py index 28c3d4ca3a..97f410d54c 100644 --- a/esmvaltool/diag_scripts/cmorizers/era5.py +++ b/esmvaltool/diag_scripts/cmorizers/era5.py @@ -26,6 +26,11 @@ def main(cfg): if CMOR_TABLES['CMIP6'].get_variable(mip, info['short_name']): basename = basename.replace('E1hr', mip) basename = basename.replace('E1hr', 'day') + elif info['diagnostic'] == '3hourly': + for mip in ['3hr', 'E3hr', 'CF3hr']: + if CMOR_TABLES['CMIP6'].get_variable(mip, info['short_name']): + basename = basename.replace('E1hr', mip) + basename = basename.replace('E1hr', '3hr') cube = iris.load_cube(file) try: @@ -36,6 +41,9 @@ def main(cfg): if info['diagnostic'] == "monthly": start = time.cell(0).point.strftime("%Y%m") end = time.cell(-1).point.strftime("%Y%m") + elif "hourly" in info['diagnostic']: + start = time.cell(0).point.strftime("%Y%m%d%H%M") + end = time.cell(-1).point.strftime("%Y%m%d%H%M") else: start = time.cell(0).point.strftime("%Y%m%d") end = time.cell(-1).point.strftime("%Y%m%d") From 3a11aded0231d32ee743c6a4c4d20a6928f12262 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jul 2024 13:34:09 +0100 Subject: [PATCH 20/87] [Condalock] Update Linux condalock file (#3715) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 79 +++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 200d0023c2..41d450d253 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,32 +1,32 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 754e4bbbc79880492aef3ffa7778e09114b9822be948dbbc8a449432b636e284 +# input_hash: 36668538d8f30c23fdf0e91b7497e55784df63e5591265ce76dbb5a72232e8e6 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/_py-xgboost-mutex-2.0-gpu_0.tar.bz2#7702188077361f43a4d61e64c694f850 https://conda.anaconda.org/conda-forge/noarch/_r-mutex-1.0.1-anacondar_1.tar.bz2#19f9db5f4f1b7f5ef5f6d67207f25f38 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/noarch/_sysroot_linux-64_curr_repodata_hack-3-h69a702a_16.conda#1c005af0c6ff22814b7c52ee448d4bea +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda#670f0e1593b8c1d84f57ad5fe5256799 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f -https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_17.conda#d731b543793afc0433c4fd593e693fce https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 -https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.85.0-ha770c72_2.conda#a685407e4876ad2327fcfc0024b5e204 https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.2.1-ha770c72_0.conda#b39b12d3809e4042f832b76192e0e7e8 https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.7-0.tar.bz2#23acfc5a339a6a34cc2241f64e4111be https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 +https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-h4a8ded7_16.conda#ff7f38675b226cfb855aebfc32a13e31 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.1.0-h5d3d1c9_100.conda#6d4f65dc440f7b3422113b135be19703 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.1.0-h5d3d1c9_100.conda#cedc62fd8c4cf28f23d3cd5db7839e99 -https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.12-he073ed8_17.conda#595db67e32b276298ff3d94d07d47fbf https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_7.conda#3f840c7ed70a96b5ebde8044b2f36f32 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab +https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_16.conda#223fe8a3ff6d5e78484a9d58eb34d055 +https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_7.conda#3f840c7ed70a96b5ebde8044b2f36f32 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.15-hd590300_0.conda#ad8955a300fd09e97e76c38638ac7157 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.b https://conda.anaconda.org/conda-forge/linux-64/ghostscript-10.03.1-h59595ed_0.conda#be973b4541601270b77232bc46249a3a https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c -https://conda.anaconda.org/conda-forge/linux-64/gtest-1.14.0-h00ab1b0_1.conda#d362a81b815334cc921b9362782881f3 +https://conda.anaconda.org/conda-forge/linux-64/gtest-1.14.0-h434a139_2.conda#89971b339bb4dfbf3759f1f2528d81b1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f @@ -127,11 +127,12 @@ https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_3.conda#9f0934861973a17e96b1e609dbb0d1cd https://conda.anaconda.org/conda-forge/linux-64/rdma-core-52.0-he02047a_0.conda#b607b8e2361ead79785d77eb4b21e8cc https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.12-h06160fa_0.conda#bf1899cfd6dea061a220fa7e96a1f4bd https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1 -https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.0-hac33072_0.conda#2a08edb7cd75e56623f2712292a97325 +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.2-hac33072_0.conda#06c5dec4ebb47213b648a6c4dc8400d6 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 @@ -152,11 +153,11 @@ https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff86 https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hebf79cf_1003.conda#23bb57b64a629bc3b33379beece7f0d7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 -https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.0.4-hd2f8ffe_4.conda#cb911b3e0d863ca9caafd767525f7cac +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.0.4-h9b56c87_5.conda#fc2577679cbe608fa0e17d049d1733d0 https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.7.1-hca3a8ce_0.conda#6af97ac284ffaf76d8f63cc1f9d64f7a -https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda#3eb5f16bcc8a02892199aa63555c731f -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.27-pthreads_h384dd9e_0.conda#025629e15edccee84df4713ce69192e5 +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1019.conda#d0c709fb86b5836c7c26d4c4b984402f +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.27-pthreads_h0afdb33_1.conda#b8df7702cfffde88587fa022a2fa0e66 https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.conda#264f9a3a4ea52c8f4d3e8ae1213a3335 @@ -166,7 +167,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.0.3-cuda118_h09a87b https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_1.conda#8083b20f566639c22f78bcd6ca35b276 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.101-h593d115_0.conda#b24ab6abea1bdc28d646336a03d15392 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.102-h593d115_0.conda#40e5e48c55a45621c4399ca9236406b7 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 @@ -184,7 +185,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-hdb68c23_10.con https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py311h38be061_8.conda#5384590f14dfe6ccd02811236afc9f8e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca @@ -229,7 +230,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab7 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h5622ce7_1001.conda#fc2d5b79c2d3f8568fbab31db7ae02f3 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.0-default_h5622ce7_1000.conda#695ee1e435b873780efccc64362cda89 https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-hdffd6e0_0.conda#a8661c87c873d8c8f90479318ebf0a17 @@ -247,7 +248,7 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhd8ed1ab_0.conda#70959cd1db3cf77b2a27a0836cfd08a7 https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda#d335fd5704b46f4efb89a6774e81aef0 -https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.27-pthreads_h3d04fff_0.conda#15e92dc6a755173a10d993b92d700e70 +https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.27-pthreads_h3d04fff_1.conda#28fbd591e65453a85152d57c92afb990 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.0-h1e5e2c1_0.conda#53e8f030579d34e1a36a735d527c021f https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db @@ -270,11 +271,11 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7e https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.1-py311h5ecf98a_0.conda#9ce82e95681cb5c5e4bd872ed0a7aceb +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.19.0-py311hb3a8bbb_0.conda#c724ab184763ae3168331e1c467d887e https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py311h459d7ec_0.conda#7865c897d89a39abc0056d89e37bd9e9 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.1-pyhd8ed1ab_0.conda#985e9e86e1b0fc75a74a9bfab9309ef7 +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.2.0-pyhd8ed1ab_0.conda#10170a48c48cfe65eab923f76f982087 https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.2-py311h459d7ec_0.conda#d6478cbce002db6303f0d749860f3e22 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 @@ -284,17 +285,17 @@ https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.0-pyhd8ed1ab_0.conda#4dd428bd295ba44babd13050f2bcc622 https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f -https://conda.anaconda.org/conda-forge/noarch/tenacity-8.4.2-pyhd8ed1ab_0.conda#325a80d37b5233230906a77115e00f37 +https://conda.anaconda.org/conda-forge/noarch/tenacity-8.5.0-pyhd8ed1ab_0.conda#354cbc1244395cabbaec2617906d3a27 https://conda.anaconda.org/conda-forge/noarch/termcolor-2.4.0-pyhd8ed1ab_0.conda#a5033708ad9283907c3b1bc1f90d0d0d https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.16.3-hf0b6e87_3.conda#1e28da846782f91a696af3952a2472f9 https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda#e5dde5caf905e9d95895e05f94967e14 +https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.0-pyha770c72_0.conda#810ba6f354ddef812d0ddc4669cc8de6 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h331c9d8_0.conda#e29e451c96bf8e81a5760b7565c6ed2c https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.5.22-pyhd8ed1ab_0.conda#a887538e7f6697ed52a487dbaa0ebff5 +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.7.2-pyhd8ed1ab_0.conda#2b9f52c7ecb8d017e50f91852aead307 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py311h4332511_0.conda#442a260df22ffad7f666c7e3f119b5ab https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-py_0.tar.bz2#1447ead40f2a01733a9c8dfc32988375 @@ -308,6 +309,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hd590300_1.conda#ae92aab42726eb29d16488924f7312cb https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.6.0-pyhd8ed1ab_0.conda#de631703d59e40af41c56c4b4e2928ab +https://conda.anaconda.org/conda-forge/noarch/yapf-0.32.0-pyhd8ed1ab_0.tar.bz2#177cba0b4bdfacad5c5fbb0ed31504c4 https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 @@ -331,7 +333,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.c https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a https://conda.anaconda.org/conda-forge/noarch/fire-0.6.0-pyhd8ed1ab_0.conda#e9ed10aa8fa1dd6782940b95c942a6ae -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py311h331c9d8_0.conda#2daef6c4ce74840c8d7a431498be83e9 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h61187de_0.conda#bcbe6c9db1c25900c3808b8974e1bb90 https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 @@ -371,7 +373,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.3-py311h08a0b41_0.con https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-py_2.tar.bz2#a11f356d6f93b74b4a84e9501afd48b4 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py311h459d7ec_0.conda#4dccc0bc3bb4d6e5c30bccbd053c4f90 -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h297d8ca_1.conda#3ff978d8994f591818a506640c6a7071 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_2.conda#9e78ded802220ee1f67c908cb2ef188f https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda#e74cd796e70a4261f86699ee0a3a7a24 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 @@ -391,7 +393,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.7-hb7bd14b_1.conda# https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.3-pyhd8ed1ab_0.conda#91fc4700dcce4a46d439900a132fe4e5 https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.8-py311h4a61cc7_0.conda#962bcc96f59a31b62c43ac2b306812af -https://conda.anaconda.org/conda-forge/noarch/django-5.0.6-pyhd8ed1ab_0.conda#8451875d7b41dbab4d282f02719f3d6d +https://conda.anaconda.org/conda-forge/noarch/django-5.0.7-pyhd8ed1ab_0.conda#95de162ce2ced652551ead41982f5000 https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 @@ -425,21 +427,20 @@ https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.2.2-pyhd8e https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h5a4f163_3.conda#f363554b9084fb9d5e3366fbbc0d18e0 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e -https://conda.anaconda.org/conda-forge/noarch/yapf-0.40.1-pyhd8ed1ab_0.conda#f269942e802d5e148632143d4c37acc9 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py311hb6f056b_1.conda#72e84ef20a510ab5fca1f3d80a16e9e2 https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.6-hf567797_4.conda#ffb662b31aef333e68a00dd17fda2027 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.9.18-py311h9b38416_0.conda#67bed2bd92ffa76b20506d83427706ae https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.2-pyh12aca89_0.conda#97ad994fae55dce96bd397054b32e41a https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.22.0-pyhd8ed1ab_0.conda#b9661a4b1200d6bc7d8a4cdafdc91468 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 https://conda.anaconda.org/conda-forge/linux-64/julia-1.9.3-h06b7c97_0.conda#6214d0563598ae0cc9b954344b9f9c10 https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.22.0-hc7a4891_1.conda#7811f043944e010e54640918ea82cecd @@ -455,20 +456,20 @@ https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.0.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py311h92ebd52_0.conda#ee757dff4cdb96bb972200c85b37f9e8 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py311h18e1886_0.conda#f43c7f60c7b1e7a7cc4234d28520b06a -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h517d4fd_0.conda#92bf19ecf13e70907ae8c301de32ed10 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h517d4fd_1.conda#481fd009b2d863f526f60ca19cb7880b https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-py_0.tar.bz2#cb83a3d6ecf73f50117635192414426a https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-hbf3e495_6.conda#a6caf5a0d9ca940d95f21d40afe8f857 -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.2-pyhd8ed1ab_0.conda#e704d0474c0155db9632bd740b6c9d17 +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.0-pyhd8ed1ab_0.conda#e49dc1da9805d8953e1326e58127c7bf https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.6.2-pyhd8ed1ab_0.conda#eecb4c188864376d2b45a5afc4bcb2fa +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.7.0-pyhd8ed1ab_0.conda#2ae917b0098f286f63f69ec9365fb0b1 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h0a5817f_2.conda#e23c62f75f67166cf4ca137fc8bcdce7 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6238fc3_5.conda#2fef4283b2bb45a66f8b81099d36721e -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda#0848e2084cbb57014f232f48568561af +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py311hffb96ce_0.conda#990bc73fa802e6387f683d0fbc6b7bd4 https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 @@ -480,15 +481,15 @@ https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.t https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h18e1886_2.conda#b1e90d33ae504ac06a3928a2dc5654ba https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.0-py311he08f58d_1.conda#d55e4dde3b30272090f33ddd367c580b +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.1-py311hd632256_0.conda#f3928b428ad924ecb8f0e9b71124ed7f https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyhd8ed1ab_0.conda#846d12530687ba836791dd54db1f45c5 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py311h18e1886_0.conda#82c29bf38b3fb66da09736106609b5fe -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.6.18-pyhd8ed1ab_0.conda#7c3077529bfe3b86f9425d526d73bd24 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.7.2-pyhd8ed1ab_0.conda#67bdbdca78327a94e91969df173dbdb7 https://conda.anaconda.org/conda-forge/noarch/xarray-2024.6.0-pyhd8ed1ab_1.conda#a6775bba72ade3fd777ccac04902202c https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.2-pyhd8ed1ab_0.conda#02f53038910b6fbc9d36bd5f663318e8 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.2-pyhd8ed1ab_0.conda#395b23e1e49b582952a9f2f65a8d6f70 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.3-pyhd8ed1ab_0.conda#054936470636849427f181fc52903474 https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.5-pyhd8ed1ab_0.conda#abfb434fb6654f83d740428863ec85a8 @@ -513,7 +514,7 @@ https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.c https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py311h14de704_1.conda#873580dfb41f82fe67dcd525bd243027 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 -https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.0.3-pyhd8ed1ab_0.conda#46b7eb9d2f3ca144f3195dc6aa7bdf93 +https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.1.0-pyhd8ed1ab_0.conda#359cef1ddbdaffbaeb283274f971ac7f https://conda.anaconda.org/conda-forge/linux-64/cdo-2.3.0-h24bcfa3_0.conda#238311a432a8e49943d3348e279af714 https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda#786d3808394b1bdfd3f41f2e2c67279e @@ -654,20 +655,20 @@ https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r42hc72bb7e_1.c https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r42hc72bb7e_1.conda#07d5ce8e710897745f14c951ff947cdd https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.conda#7985dada48799b7814ca069794d0b1a3 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.6-pyhd8ed1ab_0.conda#77ed2262e85230e5b870f505ed4922c8 +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.7-pyhd8ed1ab_0.conda#412b700b5a88f167078cd7b839881086 https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_14-r42h85a8d9e_1.conda#ad59b523759f3e8acc6fd623cfbfb5a9 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.6.2-pyhd8ed1ab_0.conda#0af43d16240caf6aedefd7a4041ae64c +https://conda.anaconda.org/conda-forge/noarch/dask-2024.7.0-pyhd8ed1ab_0.conda#f0647685bcd2c8d78b6e8177d6735edb https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.10.0-pyhd8ed1ab_0.conda#a5ccce1a87da81d6c690cd11ae0687a2 https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.3-r42hc72bb7e_0.conda#1b2b8fa85a9d0556773abac4763d8ef9 https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r42ha503ecb_1.conda#6aa1414e06dfffc39d3b5ca78b60b377 https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.5-r42hc72bb7e_0.conda#959f69b6dfd4b620a15489975fa27670 -https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.10.0-pyhd8ed1ab_0.conda#18bc5ed0e0583cb0b212927795debea7 +https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.11.0-pyhd8ed1ab_0.conda#ae2c9a927475f5519d0164c542cde378 https://conda.anaconda.org/conda-forge/linux-64/r-fields-15.2-r42h61816a4_0.conda#d84fe2f9e893e92089370b195e2263a0 https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r42hc72bb7e_1.conda#7fe060235dac0fc0b3d387f98e79d128 https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_5-r42h57805ef_0.conda#e58ccf961b56e57d7c1e50995005b0bd From cf6428bc8123e37ecee825cf0cf24eae9b7fdced Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Wed, 17 Jul 2024 08:51:40 +0100 Subject: [PATCH 21/87] Ignore autosummary warning in documentation build (#3718) --- doc/sphinx/source/conf.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/sphinx/source/conf.py b/doc/sphinx/source/conf.py index 600eaa8253..1af560b576 100644 --- a/doc/sphinx/source/conf.py +++ b/doc/sphinx/source/conf.py @@ -82,6 +82,11 @@ 'autosummary': True, } +# See https://github.com/sphinx-doc/sphinx/issues/12589 +suppress_warnings = [ + 'autosummary.import_cycle', +] + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] From d0b7a93b5ee92e3ac58af14509a1b0185dfab45b Mon Sep 17 00:00:00 2001 From: Lisa Bock Date: Wed, 17 Jul 2024 14:39:09 +0200 Subject: [PATCH 22/87] Fix for setting global attributes in cmorizers (#3717) Co-authored-by: Valeriu Predoi --- esmvaltool/cmorizers/data/utilities.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esmvaltool/cmorizers/data/utilities.py b/esmvaltool/cmorizers/data/utilities.py index 82da07c12e..853ebd8526 100644 --- a/esmvaltool/cmorizers/data/utilities.py +++ b/esmvaltool/cmorizers/data/utilities.py @@ -425,7 +425,7 @@ def set_global_atts(cube, attrs): # Additional attributes glob_dict.update(attrs) - cube.attributes = glob_dict + cube.attributes.globals = glob_dict def fix_bounds(cube, dim_coord): From 49d9067be7f9cf63ba1c5498954f8d83f67a01ad Mon Sep 17 00:00:00 2001 From: Emma Hogan Date: Thu, 18 Jul 2024 16:18:08 +0100 Subject: [PATCH 23/87] Remove `recipe_preprocessor_derive_test.yml` from the list of broken recipes (#3722) --- doc/sphinx/source/recipes/broken_recipe_list.rst | 5 ----- 1 file changed, 5 deletions(-) diff --git a/doc/sphinx/source/recipes/broken_recipe_list.rst b/doc/sphinx/source/recipes/broken_recipe_list.rst index 78ef3e2e15..f2c25623ac 100644 --- a/doc/sphinx/source/recipes/broken_recipe_list.rst +++ b/doc/sphinx/source/recipes/broken_recipe_list.rst @@ -32,11 +32,6 @@ More details can be found in the :ref:`broken recipe policy - v2.11.0 - CESM1 CMIP5 Omon data no longer available - `#3693 `_ - * - :ref:`recipe_preprocessor_derive_test.yml ` - - ``cmip6/toz`` - - v2.11.0 - - Failed to run preprocessor function ``derive`` on the data: Unable to convert units - - `#3709 `_ * - :ref:`recipe_russell18jgr.yml ` - ``Figure_4`` - v2.11.0 From 351c4d3f75fbdc0d59d4b1442d1a84108e5082bd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 13:13:15 +0100 Subject: [PATCH 24/87] [Condalock] Update Linux condalock file (#3725) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 66 ++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 41d450d253..5ad04f2a40 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -29,14 +29,14 @@ https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_16. https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_7.conda#3f840c7ed70a96b5ebde8044b2f36f32 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.15-hd590300_0.conda#ad8955a300fd09e97e76c38638ac7157 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf -https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h7ab15ed_0.conda#9961b1f100c3b6852bd97c9233d06979 +https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h1220068_1.conda#f8f0f0c4338bad5c34a4e9e11460481d https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 @@ -48,7 +48,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.c https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 -https://conda.anaconda.org/conda-forge/linux-64/libnl-3.9.0-hd590300_0.conda#d27c451db4f1d3c983c78167d2fdabc2 +https://conda.anaconda.org/conda-forge/linux-64/libnl-3.10.0-h4bc722e_0.conda#6221e705f55cf0533f0777ae54ad86c6 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libopenlibm4-0.8.1-hd590300_1.conda#e6af610e01d04927a5060c95ce4e0875 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d @@ -63,8 +63,8 @@ https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7 https://conda.anaconda.org/conda-forge/linux-64/make-4.3-hd18ef5c_1.tar.bz2#4049ebfd3190b580dffe76daed26155a https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda#40ccb8318df2500f83bd868dd8fcd201 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_1.conda#b1e9d076f14e8d776213fd5047b4c3d9 -https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h36c2ea0_1008.tar.bz2#fbef41ff6a4c8140c30057466a1cdd47 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 +https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda#1bee70681f504ea424fb07cdb090c001 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 @@ -97,7 +97,7 @@ https://conda.anaconda.org/conda-forge/linux-64/gtest-1.14.0-h434a139_2.conda#89 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_h59595ed_0.conda#682bdbe046a68f749769b492f3625c5c +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda#c48fc56ec03229f294176923c3265c05 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f @@ -127,7 +127,7 @@ https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 -https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_3.conda#9f0934861973a17e96b1e609dbb0d1cd +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/rdma-core-52.0-he02047a_0.conda#b607b8e2361ead79785d77eb4b21e8cc https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.12-h06160fa_0.conda#bf1899cfd6dea061a220fa7e96a1f4bd @@ -153,9 +153,9 @@ https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff86 https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hebf79cf_1003.conda#23bb57b64a629bc3b33379beece7f0d7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 -https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.0.4-h9b56c87_5.conda#fc2577679cbe608fa0e17d049d1733d0 +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.0-h9b56c87_0.conda#ab39000b12375e3a30ee79fea996e3c5 https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.7.1-hca3a8ce_0.conda#6af97ac284ffaf76d8f63cc1f9d64f7a -https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1019.conda#d0c709fb86b5836c7c26d4c4b984402f +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1020.conda#6d76c5822cb38bc1ab5a06565c6cf626 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.27-pthreads_h0afdb33_1.conda#b8df7702cfffde88587fa022a2fa0e66 https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 @@ -164,7 +164,7 @@ https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.cond https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.0.3-cuda118_h09a87be_4.conda#bfaf927bc7665d327ff5b8e5b8dbf2df -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_1.conda#8083b20f566639c22f78bcd6ca35b276 https://conda.anaconda.org/conda-forge/linux-64/nss-3.102-h593d115_0.conda#40e5e48c55a45621c4399ca9236406b7 @@ -204,7 +204,7 @@ https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073 https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_0.tar.bz2#15621abf59053e184114d3e1d4f9d01e https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-1.1.0-pyhd8ed1ab_0.conda#a2f2138597905eaa72e561d8efb42cf3 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 @@ -230,7 +230,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab7 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.0-default_h5622ce7_1000.conda#695ee1e435b873780efccc64362cda89 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-hdffd6e0_0.conda#a8661c87c873d8c8f90479318ebf0a17 @@ -275,7 +275,7 @@ https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.19.0-py311hb3a8bbb_0.c https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py311h459d7ec_0.conda#7865c897d89a39abc0056d89e37bd9e9 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.2.0-pyhd8ed1ab_0.conda#10170a48c48cfe65eab923f76f982087 +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.4-pyhd8ed1ab_0.conda#ee78ac9c720d0d02fcfd420866b82ab1 https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.2-py311h459d7ec_0.conda#d6478cbce002db6303f0d749860f3e22 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 @@ -283,7 +283,7 @@ https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 -https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.0-pyhd8ed1ab_0.conda#4dd428bd295ba44babd13050f2bcc622 +https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.1-pyhd8ed1ab_0.conda#e8af29e73e8b5906d8882c1f67222d34 https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f https://conda.anaconda.org/conda-forge/noarch/tenacity-8.5.0-pyhd8ed1ab_0.conda#354cbc1244395cabbaec2617906d3a27 https://conda.anaconda.org/conda-forge/noarch/termcolor-2.4.0-pyhd8ed1ab_0.conda#a5033708ad9283907c3b1bc1f90d0d0d @@ -327,7 +327,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.cond https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.3.0-hbdc6101_0.conda#797554b8b7603011e8677884381fbcc5 https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.4-py311h331c9d8_0.conda#5c93ea564766cd29c0864436ca9f247e +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py311h61187de_0.conda#88eac8e0e69d850b235824f87e5cfd1b https://conda.anaconda.org/conda-forge/linux-64/curl-8.8.0-he654da7_1.conda#78678b2ddfd9bd7c7861b8d2e3b7473b https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 @@ -366,14 +366,14 @@ https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.1.0-pyhd8ed1ab_0.conda#03736d8ced74deece64e54be348ddd3e -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.1-pyhd8ed1ab_0.conda#b6a3ab8559a42070c6b6c3063faea1ed https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.2-pyhd8ed1ab_0.conda#89703b4f38bd1c0353881f085bc8fdaa https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.3-py311h08a0b41_0.conda#8bef21c0a0160e7369fc2f494acf85d0 https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-py_2.tar.bz2#a11f356d6f93b74b4a84e9501afd48b4 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py311h459d7ec_0.conda#4dccc0bc3bb4d6e5c30bccbd053c4f90 -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_2.conda#9e78ded802220ee1f67c908cb2ef188f +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_3.conda#c667c11d1e488a38220ede8a34441bff https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda#e74cd796e70a4261f86699ee0a3a7a24 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 @@ -427,12 +427,12 @@ https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.2.2-pyhd8e https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h5a4f163_3.conda#f363554b9084fb9d5e3366fbbc0d18e0 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py311hb6f056b_1.conda#72e84ef20a510ab5fca1f3d80a16e9e2 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h5cd10c7_0.conda#8efe4fe2396281627b3450af8357b190 https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.6-hf567797_4.conda#ffb662b31aef333e68a00dd17fda2027 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.1-pyhd8ed1ab_0.conda#80f7ce024289c333fdc5ad54a194fc86 https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 @@ -452,7 +452,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py311h320fe9a_0.con https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 https://conda.anaconda.org/conda-forge/linux-64/poppler-23.08.0-hf2349cb_2.conda#fb75401ae7e2e3f354dff72e9da95cae https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.0.0-pyhd8ed1ab_0.conda#b50aec2c744a5c493c09cce9e2e7533e +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_0.conda#3af1942211bc9c25d0160a8975203254 https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py311h92ebd52_0.conda#ee757dff4cdb96bb972200c85b37f9e8 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py311h18e1886_0.conda#f43c7f60c7b1e7a7cc4234d28520b06a @@ -464,7 +464,7 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-hbf3e495_6.conda#a6caf5a0d9ca940d95f21d40afe8f857 https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.0-pyhd8ed1ab_0.conda#e49dc1da9805d8953e1326e58127c7bf https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.7.0-pyhd8ed1ab_0.conda#2ae917b0098f286f63f69ec9365fb0b1 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.7.1-pyhd8ed1ab_0.conda#0a8e18bb76f2dd6ce7e9b1fb9dbba78a https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h0a5817f_2.conda#e23c62f75f67166cf4ca137fc8bcdce7 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a @@ -489,7 +489,7 @@ https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.7.2-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/xarray-2024.6.0-pyhd8ed1ab_1.conda#a6775bba72ade3fd777ccac04902202c https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.2-pyhd8ed1ab_0.conda#02f53038910b6fbc9d36bd5f663318e8 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.3-pyhd8ed1ab_0.conda#054936470636849427f181fc52903474 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.4-pyhd8ed1ab_0.conda#c8b6a3126f659e311d3b5c61be254d95 https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.5-pyhd8ed1ab_0.conda#abfb434fb6654f83d740428863ec85a8 @@ -506,7 +506,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-he3b17a9_50.conda#a37f https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.6-hc167251_0.conda#fad6bcd027d55d5e1b925cf2d7ceb4f2 https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 -https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.0-py311h38be061_1.conda#e172dce6d5f3dbf0c8dfc537c8146be3 +https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py311h38be061_0.conda#b980793f61c0dc532b62faa0a0f0a271 https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.0.3-cuda120_pyh3ef1b53_4.conda#101b6519015db5451632163bc6fed36a https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h0887e52_8.conda#34cb3750c8a6da10a490e470f87e670b @@ -527,7 +527,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libparquet-15.0.2-h6a7eafb_2_cpu https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.0-py311h38be061_1.conda#0c795bac4990aec7adabb34caa9d3873 +https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.1-py311h38be061_0.conda#65a408ecf84afc51b1d437f888d8e80f https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.8.0-pyhd8ed1ab_0.conda#fba377622e74ee0bbeb8ccae9fa593d3 https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r42hc72bb7e_1005.conda#f2744985b083b1bbffd4df19437cf1e8 https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.5.0-r42hb1dbf0f_0.conda#d879e1fbd80113312364a5db3682c789 @@ -589,7 +589,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.45-r42ha18555a_0.conda# https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r42hc72bb7e_2.conda#2f3614450b54f222c1eff786ec2a45ec https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda#97f60a93ca12f4fdd5f44049dcee4345 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e -https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.6-pyhd8ed1ab_0.conda#3f906da34e3cb6e7260a9fcd0e9ee7e8 +https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c https://conda.anaconda.org/conda-forge/noarch/xgboost-2.0.3-cuda120_pyh68bd8d9_4.conda#aaaadc3a408067943ebc10299393a7c3 https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.0-pyhd8ed1ab_0.conda#f7433e3bd2749b934ddf81451a45967d https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_19-pl5321h7e74ff9_0.conda#a4a0ce7caba20cae61aac9aeacbd76c2 @@ -597,8 +597,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-hac33072 https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-15.0.2-h9241762_2_cpu.conda#97e46f0f20157e19487ca3e65100247a https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py311h38be061_1.conda#d7901c26884613539e958c10e9973413 -https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.4.0-py311h38be061_3.conda#6f7871722c07922028043144e8873b37 -https://conda.anaconda.org/conda-forge/linux-64/pydot-2.0.0-py311h38be061_0.conda#cdfd23a54a18f3c8d5320d7717f4ed52 +https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py311h38be061_0.conda#9ff6fd130fe274b762b4b21f5454e821 +https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.1-py311h38be061_0.conda#036ce626484c4458cc99b6d55bb036eb https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r42ha503ecb_0.conda#12b6fa8fe80a6494a948c6ea2f34340d https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r42h57805ef_0.conda#9febce7369c72d991e2399d7d28f3390 @@ -655,13 +655,13 @@ https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r42hc72bb7e_1.c https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r42hc72bb7e_1.conda#07d5ce8e710897745f14c951ff947cdd https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.conda#7985dada48799b7814ca069794d0b1a3 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.7-pyhd8ed1ab_0.conda#412b700b5a88f167078cd7b839881086 +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.9-pyhd8ed1ab_0.conda#1fdd81b57dd1e4a38b6e57f1138f4e61 https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_14-r42h85a8d9e_1.conda#ad59b523759f3e8acc6fd623cfbfb5a9 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.7.0-pyhd8ed1ab_0.conda#f0647685bcd2c8d78b6e8177d6735edb +https://conda.anaconda.org/conda-forge/noarch/dask-2024.7.1-pyhd8ed1ab_0.conda#fa1908a0e13396792ff849a34171d90e https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.10.0-pyhd8ed1ab_0.conda#a5ccce1a87da81d6c690cd11ae0687a2 @@ -678,7 +678,7 @@ https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.4-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.6-pyhd8ed1ab_0.conda#d6f4b617daa8c677f60c06a3a61e2743 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.8-pyhd8ed1ab_0.conda#179912c661d6aa9fe794e81c854f8d9f +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e From fa8e655eff3b33864edc8210b9487960dc3df58f Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Wed, 24 Jul 2024 16:00:32 +0200 Subject: [PATCH 25/87] More flexible file loading in `monitor/multi_datasets.py` (#3728) --- .../diag_scripts/monitor/multi_datasets.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index c87fd26cac..9d5fbdaf8f 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -612,6 +612,7 @@ from iris.analysis.cartography import area_weights from iris.coord_categorisation import add_year from iris.coords import AuxCoord +from iris.exceptions import ConstraintMismatchError from matplotlib.colors import CenteredNorm from matplotlib.gridspec import GridSpec from matplotlib.ticker import ( @@ -1107,7 +1108,22 @@ def _load_and_preprocess_data(self): for dataset in input_data: filename = dataset['filename'] logger.info("Loading %s", filename) - cube = iris.load_cube(filename) + cubes = iris.load(filename) + if len(cubes) == 1: + cube = cubes[0] + else: + var_name = dataset['short_name'] + try: + cube = cubes.extract_cube(iris.NameConstraint( + var_name=var_name + )) + except ConstraintMismatchError as exc: + var_names = [c.var_name for c in cubes] + raise ValueError( + f"Cannot load data: multiple variables ({var_names}) " + f"are available in file {filename}, but not the " + f"requested '{var_name}'" + ) from exc # Fix time coordinate if present if cube.coords('time', dim_coords=True): From a5a10ee78bd2a7f728cc3c09a1737c87b9de5314 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 14:48:58 +0100 Subject: [PATCH 26/87] [Condalock] Update Linux condalock file (#3730) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 60 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 5ad04f2a40..01057e2838 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -13,7 +13,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 -https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.2.1-ha770c72_0.conda#b39b12d3809e4042f832b76192e0e7e8 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.3-ha770c72_0.conda#0a3af8b93ba501c6ba020deacc9df841 https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha19 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.15-hd590300_0.conda#ad8955a300fd09e97e76c38638ac7157 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 @@ -120,7 +120,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#a https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h59595ed_0.conda#a7b444a6e008b804b35521895e3440e2 -https://conda.anaconda.org/conda-forge/linux-64/nccl-2.22.3.1-hee583db_0.conda#5d4192971be1643f333582dc79a29393 +https://conda.anaconda.org/conda-forge/linux-64/nccl-2.22.3.1-hee583db_1.conda#f6ec6886214a80beace66f0b9fdf7e4b https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.8.1-hd590300_1.conda#6eba22eb06d69e53d0ca01eef42bc675 https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f @@ -163,10 +163,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2. https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.conda#264f9a3a4ea52c8f4d3e8ae1213a3335 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.0.3-cuda118_h09a87be_4.conda#bfaf927bc7665d327ff5b8e5b8dbf2df +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.1-cuda118_h09a87be_0.conda#1ef9f569ec737645f69f04289690de6a https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 -https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_1.conda#8083b20f566639c22f78bcd6ca35b276 +https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h38ae2d0_2.conda#168e18a2bba4f8520e6c5e38982f5847 https://conda.anaconda.org/conda-forge/linux-64/nss-3.102-h593d115_0.conda#40e5e48c55a45621c4399ca9236406b7 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 @@ -176,7 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-ha691c75_8.conda#3f9b https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_0.conda#ae5f4ad87126c55ba3f690ef07f81d64 -https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb +https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda#7d78a232029458d0077ede6cda30ed0c https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa @@ -228,8 +228,8 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1 https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.10.0-py311h459d7ec_0.conda#d39020c78fd00ed774ff9c876e8aba07 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.0-hdb1bdb2_0.conda#5badfbdb2688d8aaca7bd3c98d557b97 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e @@ -271,7 +271,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7e https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.19.0-py311hb3a8bbb_0.conda#c724ab184763ae3168331e1c467d887e +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.19.1-py311hb3a8bbb_0.conda#c367477dd99f87997d08fde1c154d339 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py311h459d7ec_0.conda#7865c897d89a39abc0056d89e37bd9e9 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df @@ -285,7 +285,7 @@ https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.1-pyhd8ed1ab_0.conda#e8af29e73e8b5906d8882c1f67222d34 https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f -https://conda.anaconda.org/conda-forge/noarch/tenacity-8.5.0-pyhd8ed1ab_0.conda#354cbc1244395cabbaec2617906d3a27 +https://conda.anaconda.org/conda-forge/noarch/tenacity-9.0.0-pyhd8ed1ab_0.conda#42af51ad3b654ece73572628ad2882ae https://conda.anaconda.org/conda-forge/noarch/termcolor-2.4.0-pyhd8ed1ab_0.conda#a5033708ad9283907c3b1bc1f90d0d0d https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.16.3-hf0b6e87_3.conda#1e28da846782f91a696af3952a2472f9 @@ -328,7 +328,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.3.0-hbdc6101_0.conda#7 https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py311h61187de_0.conda#88eac8e0e69d850b235824f87e5cfd1b -https://conda.anaconda.org/conda-forge/linux-64/curl-8.8.0-he654da7_1.conda#78678b2ddfd9bd7c7861b8d2e3b7473b +https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.0-h18eb788_0.conda#cb385c8a955ad49c3342b23cd1a26c11 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a @@ -338,7 +338,7 @@ https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358 https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.2.0-pyha770c72_0.conda#c261d14fc7f49cdd403868998a18c318 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 @@ -347,12 +347,12 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25 https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py311h38be061_0.conda#f85e78497dfed6f6a4b865191f42de2e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-he9388d3_8.conda#f3abc6e6ab60fa404c23094f5a03ec9b https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.1-hebfc3b9_0.conda#ddd09e8904fde46b85f41896621803e6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b https://conda.anaconda.org/conda-forge/linux-64/lxml-5.2.2-py311hc0a218f_0.conda#5a9c71f5cbdf3c5b1ad2504e13792629 https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 @@ -361,17 +361,17 @@ https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.4-py311h459d7ec_0.c https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/noarch/plotly-5.22.0-pyhd8ed1ab_0.conda#5b409a5f738e7d76c2b426eddb7e9956 +https://conda.anaconda.org/conda-forge/noarch/plotly-5.23.0-pyhd8ed1ab_0.conda#41e535b9e479c72a6bffc69a4c85837c https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda#e4d52462da124ed3792472f95a36fc2a https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.1.0-pyhd8ed1ab_0.conda#03736d8ced74deece64e54be348ddd3e -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.1-pyhd8ed1ab_0.conda#b6a3ab8559a42070c6b6c3063faea1ed +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.2-pyhd8ed1ab_0.conda#89703b4f38bd1c0353881f085bc8fdaa https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.3-py311h08a0b41_0.conda#8bef21c0a0160e7369fc2f494acf85d0 https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-py_2.tar.bz2#a11f356d6f93b74b4a84e9501afd48b4 +https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-pyhd8ed1ab_3.conda#1f7482562f2082f1b2abf8a3e2a41b63 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py311h459d7ec_0.conda#4dccc0bc3bb4d6e5c30bccbd053c4f90 https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_3.conda#c667c11d1e488a38220ede8a34441bff https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac @@ -380,7 +380,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-hac6953d_0.conda#63b80ca78d29380fe69e69412dcbe4ac -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.1.3-h4ab18f5_1.conda#4d6c9925cdcda27e9d022e40eb3eac05 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hd590300_0.conda#12bf78e12f71405775e1c092902959d3 https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c089f90a086b6214c5606368d0d3bad0 @@ -404,7 +404,7 @@ https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hf1a501a_15.conda#d2e16a32f41d67c7d280da11b2846328 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_0.conda#a284ff318fbdb0dd83928275b4b6087c @@ -462,7 +462,7 @@ https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-py_0.tar.bz2#cb83a3d6 https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-hbf3e495_6.conda#a6caf5a0d9ca940d95f21d40afe8f857 -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.0-pyhd8ed1ab_0.conda#e49dc1da9805d8953e1326e58127c7bf +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.1-pyhd8ed1ab_0.conda#d1e7e496405a75fd48ea94f2560c6843 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa https://conda.anaconda.org/conda-forge/noarch/distributed-2024.7.1-pyhd8ed1ab_0.conda#0a8e18bb76f2dd6ce7e9b1fb9dbba78a https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d @@ -485,8 +485,8 @@ https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.1-py311hd632256 https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyhd8ed1ab_0.conda#846d12530687ba836791dd54db1f45c5 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py311h18e1886_0.conda#82c29bf38b3fb66da09736106609b5fe -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.7.2-pyhd8ed1ab_0.conda#67bdbdca78327a94e91969df173dbdb7 -https://conda.anaconda.org/conda-forge/noarch/xarray-2024.6.0-pyhd8ed1ab_1.conda#a6775bba72ade3fd777ccac04902202c +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.7.24-pyhd8ed1ab_0.conda#5e59c23bd7626e83acf61657cf0512e9 +https://conda.anaconda.org/conda-forge/noarch/xarray-2024.7.0-pyhd8ed1ab_0.conda#a7d4ff4bf1502eaba3fbbaeba66969ec https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.2-pyhd8ed1ab_0.conda#02f53038910b6fbc9d36bd5f663318e8 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.4-pyhd8ed1ab_0.conda#c8b6a3126f659e311d3b5c61be254d95 @@ -503,11 +503,11 @@ https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.1-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-he3b17a9_50.conda#a37fcb5a2da31cfebe6734b0fda20bd5 -https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.6-hc167251_0.conda#fad6bcd027d55d5e1b925cf2d7ceb4f2 +https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.7-h57a25ff_0.conda#3bbcb2c36dc92bc70621d2625fcbf631 https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py311h38be061_0.conda#b980793f61c0dc532b62faa0a0f0a271 -https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.0.3-cuda120_pyh3ef1b53_4.conda#101b6519015db5451632163bc6fed36a +https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.1-cuda118_pyhf54b869_0.conda#aee5ad2934864efe70229584d8b3a18d https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h0887e52_8.conda#34cb3750c8a6da10a490e470f87e670b https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.conda#dcee6ba4d1ac6af18827d0941b6a1b42 @@ -590,7 +590,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r42hc72bb7e_2 https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda#97f60a93ca12f4fdd5f44049dcee4345 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c -https://conda.anaconda.org/conda-forge/noarch/xgboost-2.0.3-cuda120_pyh68bd8d9_4.conda#aaaadc3a408067943ebc10299393a7c3 +https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.1-cuda118_pyh98e67c5_0.conda#c2c7612c1d8be7244a59476e390b27a8 https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.0-pyhd8ed1ab_0.conda#f7433e3bd2749b934ddf81451a45967d https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_19-pl5321h7e74ff9_0.conda#a4a0ce7caba20cae61aac9aeacbd76c2 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-hac33072_2_cpu.conda#48c711b4e07664ec7b245a9664be60a1 @@ -676,9 +676,9 @@ https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r42hc72bb https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.6-pyhd8ed1ab_0.tar.bz2#4409dd7e06a62c3b2aa9e96782c49c6d https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.4-pyhd8ed1ab_0.conda#9dc80eaeff56fb67dbf4f871b81bc13a https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.6-pyhd8ed1ab_0.conda#d6f4b617daa8c677f60c06a3a61e2743 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.8-pyhd8ed1ab_0.conda#179912c661d6aa9fe794e81c854f8d9f -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.0.2-pyhd8ed1ab_0.conda#625004bdab1b171dfd1e29ebb30c40dd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e From c3b951e6d303ccf77a326d27a4d0b91513299486 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 14:23:29 +0100 Subject: [PATCH 27/87] [Condalock] Update Linux condalock file (#3731) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 01057e2838..766a536ea8 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -153,7 +153,7 @@ https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff86 https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hebf79cf_1003.conda#23bb57b64a629bc3b33379beece7f0d7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 -https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.0-h9b56c87_0.conda#ab39000b12375e3a30ee79fea996e3c5 +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h9b56c87_0.conda#cb7355212240e92dcf9c73cb1f10e4a9 https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.7.1-hca3a8ce_0.conda#6af97ac284ffaf76d8f63cc1f9d64f7a https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1020.conda#6d76c5822cb38bc1ab5a06565c6cf626 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec @@ -163,7 +163,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2. https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.conda#264f9a3a4ea52c8f4d3e8ae1213a3335 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.1-cuda118_h09a87be_0.conda#1ef9f569ec737645f69f04289690de6a +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.1-cuda118_h09a87be_1.conda#3dce0e18491c192bc8adb511f42dde8c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h38ae2d0_2.conda#168e18a2bba4f8520e6c5e38982f5847 @@ -229,7 +229,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.10.0-py311h4 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.0-hdb1bdb2_0.conda#5badfbdb2688d8aaca7bd3c98d557b97 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e @@ -328,7 +328,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.3.0-hbdc6101_0.conda#7 https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py311h61187de_0.conda#88eac8e0e69d850b235824f87e5cfd1b -https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.0-h18eb788_0.conda#cb385c8a955ad49c3342b23cd1a26c11 +https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.1-h18eb788_0.conda#2e7dedf73dfbfcee662e2a0f6175e4bb https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a @@ -360,7 +360,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#d https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.4-py311h459d7ec_0.conda#ce8c8565ab28dc02587e3c4014186e06 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 https://conda.anaconda.org/conda-forge/noarch/plotly-5.23.0-pyhd8ed1ab_0.conda#41e535b9e479c72a6bffc69a4c85837c https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda#e4d52462da124ed3792472f95a36fc2a https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece @@ -507,7 +507,7 @@ https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.7-h57a25ff_0.conda#3bbcb https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py311h38be061_0.conda#b980793f61c0dc532b62faa0a0f0a271 -https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.1-cuda118_pyhf54b869_0.conda#aee5ad2934864efe70229584d8b3a18d +https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.1-cuda118_pyhf54b869_1.conda#8c7b38167179a58a944471b5ad798822 https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h0887e52_8.conda#34cb3750c8a6da10a490e470f87e670b https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.conda#dcee6ba4d1ac6af18827d0941b6a1b42 @@ -590,7 +590,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r42hc72bb7e_2 https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda#97f60a93ca12f4fdd5f44049dcee4345 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c -https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.1-cuda118_pyh98e67c5_0.conda#c2c7612c1d8be7244a59476e390b27a8 +https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.1-cuda118_pyh98e67c5_1.conda#b0f361dd5da1239f504facde3661575f https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.0-pyhd8ed1ab_0.conda#f7433e3bd2749b934ddf81451a45967d https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_19-pl5321h7e74ff9_0.conda#a4a0ce7caba20cae61aac9aeacbd76c2 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-hac33072_2_cpu.conda#48c711b4e07664ec7b245a9664be60a1 @@ -664,7 +664,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.con https://conda.anaconda.org/conda-forge/noarch/dask-2024.7.1-pyhd8ed1ab_0.conda#fa1908a0e13396792ff849a34171d90e https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc -https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.10.0-pyhd8ed1ab_0.conda#a5ccce1a87da81d6c690cd11ae0687a2 +https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_0.conda#b30cbc09f81d9dbaf8b74f2c8eacddc5 https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.3-r42hc72bb7e_0.conda#1b2b8fa85a9d0556773abac4763d8ef9 https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r42ha503ecb_1.conda#6aa1414e06dfffc39d3b5ca78b60b377 https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.5-r42hc72bb7e_0.conda#959f69b6dfd4b620a15489975fa27670 From f8546fd8d32376c2e6546e942862fce77d807ddc Mon Sep 17 00:00:00 2001 From: FranziskaWinterstein <119339136+FranziskaWinterstein@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:41:35 +0200 Subject: [PATCH 28/87] Add option to plot time on x-axis in monitoring Hovmoeller plots (#3732) Co-authored-by: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Co-authored-by: Manuel Schlund --- .../diag_scripts/monitor/multi_datasets.py | 70 +++++++++++++------ 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index 9d5fbdaf8f..879346954c 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -583,6 +583,11 @@ :func:`~datetime.datetime.strftime` format string that is used to format the time axis using :class:`matplotlib.dates.DateFormatter`. If ``None``, use the default formatting imposed by the iris plotting function. +time_on: str, optional (default: y-axis) + Optional switch to change the orientation of the plot so that time is on + the x-axis ``time_on: x-axis``. Default orientation is time on y-axis and + lat/lon on x-axis. + .. hint:: @@ -851,6 +856,7 @@ def __init__(self, config): 'show_x_minor_ticks', True ) self.plots[plot_type].setdefault('time_format', None) + self.plots[plot_type].setdefault('time_on', 'y-axis') # Check that facet_used_for_labels is present for every dataset for dataset in self.input_data: @@ -1650,6 +1656,10 @@ def _plot_hovmoeller_time_vs_lat_or_lon_with_ref(self, plot_func, dataset, ref_cube = ref_dataset['cube'] dim_coords_dat = self._check_cube_dimensions(cube, plot_type) self._check_cube_dimensions(ref_cube, plot_type) + if 'latitude' in dim_coords_dat: + non_time_label = 'latitude [°N]' + else: + non_time_label = 'longitude [°E]' # Create single figure with multiple axes with mpl.rc_context(self._get_custom_mpl_rc_params(plot_type)): @@ -1664,16 +1674,23 @@ def _plot_hovmoeller_time_vs_lat_or_lon_with_ref(self, plot_func, dataset, # Plot dataset (top left) axes_data = fig.add_subplot(gridspec[0:2, 0:2]) plot_kwargs['axes'] = axes_data - coord_names = [coord[0].name() for coord in cube.dim_coords] - if coord_names[0] == "time": - coord_names.reverse() - plot_kwargs['coords'] = coord_names + if self.plots[plot_type]['time_on'] == 'x-axis': + plot_kwargs['coords'] = list(dim_coords_dat) + x_label = 'time' + y_label = non_time_label + time_axis = axes_data.get_xaxis() + else: + plot_kwargs['coords'] = list(reversed(dim_coords_dat)) + x_label = non_time_label + y_label = 'time' + time_axis = axes_data.get_yaxis() plot_data = plot_func(cube, **plot_kwargs) axes_data.set_title(self._get_label(dataset), pad=3.0) - axes_data.set_ylabel('time') + axes_data.set_ylabel(y_label) if self.plots[plot_type]['time_format'] is not None: - axes_data.get_yaxis().set_major_formatter(mdates.DateFormatter( - self.plots[plot_type]['time_format'])) + time_axis.set_major_formatter(mdates.DateFormatter( + self.plots[plot_type]['time_format'] + )) if self.plots[plot_type]['show_y_minor_ticks']: axes_data.get_yaxis().set_minor_locator(AutoMinorLocator()) if self.plots[plot_type]['show_x_minor_ticks']: @@ -1705,17 +1722,14 @@ def _plot_hovmoeller_time_vs_lat_or_lon_with_ref(self, plot_func, dataset, plot_kwargs_bias = self._get_plot_kwargs(plot_type, dataset, bias=True) plot_kwargs_bias['axes'] = axes_bias - plot_kwargs_bias['coords'] = coord_names + plot_kwargs_bias['coords'] = plot_kwargs['coords'] plot_bias = plot_func(bias_cube, **plot_kwargs_bias) axes_bias.set_title( f"{self._get_label(dataset)} - {self._get_label(ref_dataset)}", pad=3.0, ) - axes_bias.set_ylabel('time') - if 'latitude' in dim_coords_dat: - axes_bias.set_xlabel('latitude [°N]') - elif 'longitude' in dim_coords_dat: - axes_bias.set_xlabel('longitude [°E]') + axes_bias.set_xlabel(x_label) + axes_bias.set_ylabel(y_label) cbar_kwargs_bias = self._get_cbar_kwargs(plot_type, bias=True) cbar_bias = fig.colorbar(plot_bias, ax=axes_bias, **cbar_kwargs_bias) @@ -1756,6 +1770,10 @@ def _plot_hovmoeller_time_vs_lat_or_lon_without_ref(self, plot_func, # Make sure that the data has the correct dimensions cube = dataset['cube'] dim_coords_dat = self._check_cube_dimensions(cube, plot_type) + if 'latitude' in dim_coords_dat: + non_time_label = 'latitude [°N]' + else: + non_time_label = 'longitude [°E]' # Create plot with desired settings with mpl.rc_context(self._get_custom_mpl_rc_params(plot_type)): @@ -1764,8 +1782,17 @@ def _plot_hovmoeller_time_vs_lat_or_lon_without_ref(self, plot_func, plot_kwargs = self._get_plot_kwargs(plot_type, dataset) plot_kwargs['axes'] = axes - # Make sure time is on y-axis - plot_kwargs['coords'] = list(reversed(dim_coords_dat)) + # Put time on desired axis + if self.plots[plot_type]['time_on'] == 'x-axis': + plot_kwargs['coords'] = list(dim_coords_dat) + x_label = 'time' + y_label = non_time_label + time_axis = axes.get_xaxis() + else: + plot_kwargs['coords'] = list(reversed(dim_coords_dat)) + x_label = non_time_label + y_label = 'time' + time_axis = axes.get_yaxis() plot_hovmoeller = plot_func(cube, **plot_kwargs) # Setup colorbar @@ -1779,15 +1806,12 @@ def _plot_hovmoeller_time_vs_lat_or_lon_without_ref(self, plot_func, # Customize plot axes.set_title(self._get_label(dataset)) fig.suptitle(dataset['long_name']) - if 'latitude' in dim_coords_dat: - axes.set_xlabel('latitude [°N]') - elif 'longitude' in dim_coords_dat: - axes.set_xlabel('longitude [°E]') - axes.set_ylabel('time') + axes.set_xlabel(x_label) + axes.set_ylabel(y_label) if self.plots[plot_type]['time_format'] is not None: - axes.get_yaxis().set_major_formatter(mdates.DateFormatter( - self.plots[plot_type]['time_format']) - ) + time_axis.set_major_formatter(mdates.DateFormatter( + self.plots[plot_type]['time_format'] + )) if self.plots[plot_type]['show_y_minor_ticks']: axes.get_yaxis().set_minor_locator(AutoMinorLocator()) if self.plots[plot_type]['show_x_minor_ticks']: From 1cc5f8b3ca21f6bc26f519e8e9047d84148ef223 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 13:53:27 +0100 Subject: [PATCH 29/87] [Condalock] Update Linux condalock file (#3735) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 61 +++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 766a536ea8..dec75c8d8a 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -128,7 +128,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#6 https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/rdma-core-52.0-he02047a_0.conda#b607b8e2361ead79785d77eb4b21e8cc +https://conda.anaconda.org/conda-forge/linux-64/rdma-core-53.0-he02047a_0.conda#d60e9a23682287a041a4428927ea7aa5 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.12-h06160fa_0.conda#bf1899cfd6dea061a220fa7e96a1f4bd https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1 @@ -167,7 +167,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.1-cuda118_h09a87b https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h38ae2d0_2.conda#168e18a2bba4f8520e6c5e38982f5847 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.102-h593d115_0.conda#40e5e48c55a45621c4399ca9236406b7 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.103-h593d115_0.conda#233bfe41968d6fb04eba9258bb5061ad https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 @@ -176,10 +176,11 @@ https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-ha691c75_8.conda#3f9b https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_0.conda#ae5f4ad87126c55ba3f690ef07f81d64 +https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.3.5-pyhd8ed1ab_0.conda#d904abda207d2dba054fd820d34bbaee https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda#7d78a232029458d0077ede6cda30ed0c https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 -https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa +https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h01f5eca_8.conda#afb85fc0f01032d115c57c961950e7d8 https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-hdb68c23_10.conda#cb6065938167da2d2f078c2f08473b84 https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py311h38be061_8.conda#5384590f14dfe6ccd02811236afc9f8e @@ -195,7 +196,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda#0d07dc29b1c1cc973f76b74beb44915f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py311hb755f60_0.conda#f3a8a500a2e743ff92f418f0eaf9bf71 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py311hf86e51f_0.conda#9f66da0a75608eeeaaa5dc07b8162c68 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda#78745f157d56877a2c6e7b386f66f3e2 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 @@ -216,7 +217,7 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_0.tar.bz2#6b1f32359fc5d2ab7b491d0029bfffeb https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.1.0-he4a1faa_0.conda#a9ce7cd0848a93a8df88c1fc0ac84d9d -https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.1.0-h2879b86_0.conda#47d6de998d7a285b98b60bce2fecb54b +https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.1.0-h8d00ecb_0.conda#dacdca4eeb41f72d5df4511a2c06b992 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd8ed1ab_6.conda#2ed1fe4b9079da97c44cfe9c2e5078fd https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 @@ -232,7 +233,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openbla https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h482b261_0.conda#0f74c5581623f860e7baca042d9d7139 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-hdffd6e0_0.conda#a8661c87c873d8c8f90479318ebf0a17 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py311hbde99c3_0.conda#4c60dfcba06b363be954401addee8800 @@ -269,13 +270,13 @@ https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h61187de_0.conda#76439451605390254b85d8da6f8d962a https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.19.1-py311hb3a8bbb_0.conda#c367477dd99f87997d08fde1c154d339 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py311hb3a8bbb_0.conda#db475e65fb621c2ec1dcdcc4e170b6f1 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py311h459d7ec_0.conda#7865c897d89a39abc0056d89e37bd9e9 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.4-pyhd8ed1ab_0.conda#ee78ac9c720d0d02fcfd420866b82ab1 +https://conda.anaconda.org/conda-forge/noarch/setuptools-72.1.0-pyhd8ed1ab_0.conda#e06d4c26df4f958a8d38696f2c344d15 https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.2-py311h459d7ec_0.conda#d6478cbce002db6303f0d749860f3e22 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 @@ -301,9 +302,9 @@ https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py311h4332511_0.con https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-py_0.tar.bz2#1447ead40f2a01733a9c8dfc32988375 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 https://conda.anaconda.org/conda-forge/noarch/webob-1.8.7-pyhd8ed1ab_0.tar.bz2#a8192f3585f341ea66c60c189580ac67 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py311h459d7ec_0.conda#6669b5529d206c1f880b642cdd17ae05 -https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.1.9-pyhd8ed1ab_0.conda#70e533db62a710ae216fdaccc4a983c8 +https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.2.0-pyhd8ed1ab_0.conda#a1f7264726115a2f8eac9773b1f27eba https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 @@ -323,11 +324,11 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#96 https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py311ha8e6434_0.conda#32259cd17741b52be10cd23a26cca23a https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.3.0-hbdc6101_0.conda#797554b8b7603011e8677884381fbcc5 https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py311h61187de_0.conda#88eac8e0e69d850b235824f87e5cfd1b +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h61187de_0.conda#1a4c475c89ad142967256d0c7237f298 https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.1-h18eb788_0.conda#2e7dedf73dfbfcee662e2a0f6175e4bb https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 @@ -362,20 +363,20 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 https://conda.anaconda.org/conda-forge/noarch/plotly-5.23.0-pyhd8ed1ab_0.conda#41e535b9e479c72a6bffc69a4c85837c -https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda#e4d52462da124ed3792472f95a36fc2a +https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.4-ha8faf9a_0.conda#58af4d5fc019a678745f6bff7ddee225 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.1.0-pyhd8ed1ab_0.conda#03736d8ced74deece64e54be348ddd3e https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.2-pyhd8ed1ab_0.conda#89703b4f38bd1c0353881f085bc8fdaa -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.3-py311h08a0b41_0.conda#8bef21c0a0160e7369fc2f494acf85d0 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.1.0-py311h759c1eb_0.conda#cb593185b7ad0343158081c2da456bfc https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-pyhd8ed1ab_3.conda#1f7482562f2082f1b2abf8a3e2a41b63 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py311h459d7ec_0.conda#4dccc0bc3bb4d6e5c30bccbd053c4f90 https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_3.conda#c667c11d1e488a38220ede8a34441bff https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda#e74cd796e70a4261f86699ee0a3a7a24 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda#c6e94fc2b2ec71ea33fe7c7da259acb4 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 @@ -386,14 +387,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hd590300_0.co https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c089f90a086b6214c5606368d0d3bad0 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda#a1240b99a7ccd953879dc63111823986 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h459d7ec_0.conda#fff0f2058e9d86c8bf5848ee93917a8d -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.5-py311h459d7ec_0.conda#0175d2636cc41dc019b51462c13ce225 +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.3-py311h61187de_0.conda#b3b58253d1691fafecc512f7a995e12b https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.7-hb7bd14b_1.conda#82bd3d7da86d969c62ff541bab19526a https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.3-pyhd8ed1ab_0.conda#91fc4700dcce4a46d439900a132fe4e5 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.8-py311h4a61cc7_0.conda#962bcc96f59a31b62c43ac2b306812af -https://conda.anaconda.org/conda-forge/noarch/django-5.0.7-pyhd8ed1ab_0.conda#95de162ce2ced652551ead41982f5000 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.0-py311hc6616f6_0.conda#f392b3f7a26db16f37cf82996dcfc84d +https://conda.anaconda.org/conda-forge/noarch/django-5.1-pyhd8ed1ab_0.conda#6b249ed894a6b9094e4a0073e315c423 https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 @@ -432,7 +433,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.6-hf567797_4.co https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.1-pyhd8ed1ab_0.conda#80f7ce024289c333fdc5ad54a194fc86 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.0-pyhd8ed1ab_0.conda#bf68bf9ff9a18f1b17aa8c817225aee0 https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 @@ -452,30 +453,30 @@ https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py311h320fe9a_0.con https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 https://conda.anaconda.org/conda-forge/linux-64/poppler-23.08.0-hf2349cb_2.conda#fb75401ae7e2e3f354dff72e9da95cae https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_0.conda#3af1942211bc9c25d0160a8975203254 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py311h92ebd52_0.conda#ee757dff4cdb96bb972200c85b37f9e8 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py311h18e1886_0.conda#f43c7f60c7b1e7a7cc4234d28520b06a https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h517d4fd_1.conda#481fd009b2d863f526f60ca19cb7880b https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 -https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-py_0.tar.bz2#cb83a3d6ecf73f50117635192414426a +https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_1.conda#5abeaa41ec50d4d1421a8bc8fbc93054 https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-hbf3e495_6.conda#a6caf5a0d9ca940d95f21d40afe8f857 https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.1-pyhd8ed1ab_0.conda#d1e7e496405a75fd48ea94f2560c6843 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.7.1-pyhd8ed1ab_0.conda#0a8e18bb76f2dd6ce7e9b1fb9dbba78a +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.8.0-pyhd8ed1ab_0.conda#f9a7fbaeb79d4b57d1ed742930b4eec4 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h0a5817f_2.conda#e23c62f75f67166cf4ca137fc8bcdce7 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6238fc3_5.conda#2fef4283b2bb45a66f8b81099d36721e -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py311hffb96ce_0.conda#990bc73fa802e6387f683d0fbc6b7bd4 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py311h74b4f7c_2.conda#e4a26e6bd32d4af38492ba68caaa16d1 https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.tar.bz2#00d8853fb1f87195722ea6a582cc9b56 https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b @@ -514,7 +515,7 @@ https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.c https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py311h14de704_1.conda#873580dfb41f82fe67dcd525bd243027 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 -https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.1.0-pyhd8ed1ab_0.conda#359cef1ddbdaffbaeb283274f971ac7f +https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.2.0-pyhd8ed1ab_0.conda#951fd1e2d64ce5790c9fc011445090ce https://conda.anaconda.org/conda-forge/linux-64/cdo-2.3.0-h24bcfa3_0.conda#238311a432a8e49943d3348e279af714 https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda#786d3808394b1bdfd3f41f2e2c67279e @@ -597,7 +598,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-hac33072 https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-15.0.2-h9241762_2_cpu.conda#97e46f0f20157e19487ca3e65100247a https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py311h38be061_1.conda#d7901c26884613539e958c10e9973413 -https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py311h38be061_0.conda#9ff6fd130fe274b762b4b21f5454e821 +https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py311h38be061_1.conda#1077e7fc4aa594c5896cf8b8fa672f88 https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.1-py311h38be061_0.conda#036ce626484c4458cc99b6d55bb036eb https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r42ha503ecb_0.conda#12b6fa8fe80a6494a948c6ea2f34340d @@ -655,13 +656,13 @@ https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r42hc72bb7e_1.c https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r42hc72bb7e_1.conda#07d5ce8e710897745f14c951ff947cdd https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.conda#7985dada48799b7814ca069794d0b1a3 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.9-pyhd8ed1ab_0.conda#1fdd81b57dd1e4a38b6e57f1138f4e61 +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.10-pyhd8ed1ab_0.conda#88efd31bf04d9f7a2ac7d02ab568d37d https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_14-r42h85a8d9e_1.conda#ad59b523759f3e8acc6fd623cfbfb5a9 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.7.1-pyhd8ed1ab_0.conda#fa1908a0e13396792ff849a34171d90e +https://conda.anaconda.org/conda-forge/noarch/dask-2024.8.0-pyhd8ed1ab_0.conda#795f3557b117402208fe1e0e20d943ed https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_0.conda#b30cbc09f81d9dbaf8b74f2c8eacddc5 @@ -673,7 +674,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-fields-15.2-r42h61816a4_0.cond https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r42hc72bb7e_1.conda#7fe060235dac0fc0b3d387f98e79d128 https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_5-r42h57805ef_0.conda#e58ccf961b56e57d7c1e50995005b0bd https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r42hc72bb7e_2.conda#8079a86a913155fe2589ec0b76dc9f5e -https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.6-pyhd8ed1ab_0.tar.bz2#4409dd7e06a62c3b2aa9e96782c49c6d +https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.13-pyhd8ed1ab_0.conda#b2f4f2f3923646802215b040e63d042e https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.4-pyhd8ed1ab_0.conda#9dc80eaeff56fb67dbf4f871b81bc13a https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 From 8df585a48e4af8e309e3e4fbe0b036dc1b90a486 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Tue, 13 Aug 2024 17:50:13 +0200 Subject: [PATCH 30/87] Avoid masking issues in Dask 2024.8.0 (#3736) --- environment.yml | 2 +- environment_osx.yml | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/environment.yml b/environment.yml index 7b74955350..54aa73bcf0 100644 --- a/environment.yml +++ b/environment.yml @@ -17,7 +17,7 @@ dependencies: - cftime - cmocean - cython - - dask + - dask !=2024.8.0 # https://github.com/dask/dask/issues/11296 - distributed - ecmwf-api-client - eofs diff --git a/environment_osx.yml b/environment_osx.yml index 46a418c2fa..d89556b593 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -17,7 +17,7 @@ dependencies: - cftime - cmocean - cython - - dask + - dask !=2024.8.0 # https://github.com/dask/dask/issues/11296 - distributed - ecmwf-api-client - eofs diff --git a/setup.py b/setup.py index e97f0d1dfb..df8477d27f 100755 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ 'cf-units', 'cftime', 'cmocean', - 'dask', + 'dask!=2024.8.0', # https://github.com/dask/dask/issues/11296 'distributed', 'ecmwf-api-client', 'eofs', From 45e52179188bd0f7191a66b6778d5cdcfe8ba4a6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 14:57:57 +0100 Subject: [PATCH 31/87] [Condalock] Update Linux condalock file (#3740) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 81 +++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index dec75c8d8a..4f526a49c0 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 36668538d8f30c23fdf0e91b7497e55784df63e5591265ce76dbb5a72232e8e6 +# input_hash: 6e839dcc54104cc7c8d7d0b0165df84d0b927a0baf129e4169a57ac283fe3f98 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/_py-xgboost-mutex-2.0-gpu_0.tar.bz2#7702188077361f43a4d61e64c694f850 @@ -15,7 +15,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.co https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.3-ha770c72_0.conda#0a3af8b93ba501c6ba020deacc9df841 https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.7-0.tar.bz2#23acfc5a339a6a34cc2241f64e4111be https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 @@ -30,10 +30,10 @@ https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha19 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.15-hd590300_0.conda#ad8955a300fd09e97e76c38638ac7157 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.0-ha66036c_0.conda#b6927f788e85267beef6cbb292aaebdd https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 -https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 +https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-he02047a_3.conda#fcd2016d1d299f654f81021e27496818 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h1220068_1.conda#f8f0f0c4338bad5c34a4e9e11460481d @@ -44,7 +44,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda#172bcc51059416e7ce99e7b528cede83 +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-he02047a_3.conda#efab66b82ec976930b96d62a976de8e7 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 @@ -99,13 +99,13 @@ https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda#c48fc56ec03229f294176923c3265c05 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda#4fab9799da9571266d05ca5503330655 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d -https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda#b63d9b6da3653179a278077f0de20014 +https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-he02047a_3.conda#9aba7960731e6b4547b3a52f812ed801 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda#73301c133ded2bf71906aa2104edae8b https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a @@ -152,12 +152,12 @@ https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.1.0-h3c94d9 https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hebf79cf_1003.conda#23bb57b64a629bc3b33379beece7f0d7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h9b56c87_0.conda#cb7355212240e92dcf9c73cb1f10e4a9 https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.7.1-hca3a8ce_0.conda#6af97ac284ffaf76d8f63cc1f9d64f7a https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1020.conda#6d76c5822cb38bc1ab5a06565c6cf626 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.27-pthreads_h0afdb33_1.conda#b8df7702cfffde88587fa022a2fa0e66 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.28-pthreads_h3e26593_0.conda#2bd7dc48907a3b6bf766ed87867f3459 https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.conda#264f9a3a4ea52c8f4d3e8ae1213a3335 @@ -176,7 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-ha691c75_8.conda#3f9b https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_0.conda#ae5f4ad87126c55ba3f690ef07f81d64 -https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.3.5-pyhd8ed1ab_0.conda#d904abda207d2dba054fd820d34bbaee +https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.0-pyhd8ed1ab_0.conda#0482cd2217e27b3ce47676d570ac3d45 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda#7d78a232029458d0077ede6cda30ed0c https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 @@ -215,7 +215,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h743c826_0.conda#12 https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h459d7ec_0.conda#b267e553a337e1878512621e374845c5 https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_0.tar.bz2#6b1f32359fc5d2ab7b491d0029bfffeb -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.1.0-he4a1faa_0.conda#a9ce7cd0848a93a8df88c1fc0ac84d9d https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.1.0-h8d00ecb_0.conda#dacdca4eeb41f72d5df4511a2c06b992 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 @@ -249,7 +249,7 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhd8ed1ab_0.conda#70959cd1db3cf77b2a27a0836cfd08a7 https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda#d335fd5704b46f4efb89a6774e81aef0 -https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.27-pthreads_h3d04fff_1.conda#28fbd591e65453a85152d57c92afb990 +https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.28-pthreads_h3d04fff_0.conda#eb2736b14329cf5650917caa43a549c6 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.0-h1e5e2c1_0.conda#53e8f030579d34e1a36a735d527c021f https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db @@ -268,7 +268,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h61187de_0.conda#44bac99d0125c748894b9ffb6ce97811 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h61187de_0.conda#76439451605390254b85d8da6f8d962a https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda @@ -276,8 +276,8 @@ https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py311hb3a8bbb_0.c https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py311h459d7ec_0.conda#7865c897d89a39abc0056d89e37bd9e9 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.1.0-pyhd8ed1ab_0.conda#e06d4c26df4f958a8d38696f2c344d15 -https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.2-py311h459d7ec_0.conda#d6478cbce002db6303f0d749860f3e22 +https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 +https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.3-py311h61187de_0.conda#1d639b30c50f420f2d17b4ad4935d7c1 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -292,14 +292,14 @@ https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.c https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.16.3-hf0b6e87_3.conda#1e28da846782f91a696af3952a2472f9 https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.0-pyha770c72_0.conda#810ba6f354ddef812d0ddc4669cc8de6 +https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda#0062a5f3347733f67b0f33ca48cc21dd https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h331c9d8_0.conda#e29e451c96bf8e81a5760b7565c6ed2c https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.7.2-pyhd8ed1ab_0.conda#2b9f52c7ecb8d017e50f91852aead307 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py311h4332511_0.conda#442a260df22ffad7f666c7e3f119b5ab -https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-py_0.tar.bz2#1447ead40f2a01733a9c8dfc32988375 +https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_1.conda#6042b782b893029aa40335782584a092 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 https://conda.anaconda.org/conda-forge/noarch/webob-1.8.7-pyhd8ed1ab_0.tar.bz2#a8192f3585f341ea66c60c189580ac67 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 @@ -313,7 +313,7 @@ https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.6.0-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/noarch/yapf-0.32.0-pyhd8ed1ab_0.tar.bz2#177cba0b4bdfacad5c5fbb0ed31504c4 https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.0-pyhd8ed1ab_0.conda#05b6bcb391b5be17374f7ad0aeedc479 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/asgiref-3.8.1-pyhd8ed1ab_0.conda#b5c2e1034ccc76fb14031637924880eb @@ -339,8 +339,8 @@ https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358 https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.2.0-pyha770c72_0.conda#c261d14fc7f49cdd403868998a18c318 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.3-pyhd8ed1ab_0.conda#82b36c572ecc0d42c612203769e19de5 https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 @@ -355,10 +355,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b -https://conda.anaconda.org/conda-forge/linux-64/lxml-5.2.2-py311hc0a218f_0.conda#5a9c71f5cbdf3c5b1ad2504e13792629 +https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py311h6d46414_0.conda#7dedf22b491b66f848718d498e60fabf https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 -https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.4-py311h459d7ec_0.conda#ce8c8565ab28dc02587e3c4014186e06 +https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py311h459d7ec_0.conda#b635b3b6a2dcab441c2ef474a3da9e67 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 @@ -370,7 +370,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.1.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.2-pyhd8ed1ab_0.conda#89703b4f38bd1c0353881f085bc8fdaa -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.1.0-py311h759c1eb_0.conda#cb593185b7ad0343158081c2da456bfc +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.1.1-py311h759c1eb_0.conda#f8e69933c5cb408b79e97de35601fb85 https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-pyhd8ed1ab_3.conda#1f7482562f2082f1b2abf8a3e2a41b63 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py311h459d7ec_0.conda#4dccc0bc3bb4d6e5c30bccbd053c4f90 @@ -387,7 +387,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hd590300_0.co https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c089f90a086b6214c5606368d0d3bad0 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda#a1240b99a7ccd953879dc63111823986 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h459d7ec_0.conda#fff0f2058e9d86c8bf5848ee93917a8d -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.3-py311h61187de_0.conda#b3b58253d1691fafecc512f7a995e12b +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.5-py311h61187de_0.conda#4b255c4b54de2a41bc8dc63ee78098e4 https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.7-hb7bd14b_1.conda#82bd3d7da86d969c62ff541bab19526a @@ -405,10 +405,10 @@ https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hf1a501a_15.conda#d2e16a32f41d67c7d280da11b2846328 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 -https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_0.conda#a284ff318fbdb0dd83928275b4b6087c +https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_1.conda#4809b9f4c6ce106d443c3f90b8e10db2 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.22.0-h9be4e54_1.conda#4b4e36a91e7dabf7345b82d85767a7c3 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h090f1da_1.conda#9a2d6acaa8ce6d53a150248e7b11165e @@ -433,22 +433,23 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.6-hf567797_4.co https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.0-pyhd8ed1ab_0.conda#bf68bf9ff9a18f1b17aa8c817225aee0 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.1-pyhd8ed1ab_0.conda#8fe3858b19843234b331d8459db3a7a1 https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.9.18-py311h9b38416_0.conda#67bed2bd92ffa76b20506d83427706ae -https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.2-pyh12aca89_0.conda#97ad994fae55dce96bd397054b32e41a +https://conda.anaconda.org/conda-forge/noarch/imageio-2.35.1-pyh12aca89_0.conda#b03ff3631329c8ef17bae35d2bb216f7 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 https://conda.anaconda.org/conda-forge/linux-64/julia-1.9.3-h06b7c97_0.conda#6214d0563598ae0cc9b954344b9f9c10 https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 +https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.22.0-hc7a4891_1.conda#7811f043944e010e54640918ea82cecd https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h228c76a_104.conda#91bc3ac73308181d55a09d9e4aeb4496 https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py311h4bc866e_0.conda#e32a210e9caf97383c35685fd2343512 -https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.12.1-py311h4332511_1.conda#887aa6096851eab5c34fe95ed1641591 +https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.13.0-py311h044e617_0.conda#9d783b29b6fc53e4d9a94f5befdfd34b https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py311h320fe9a_0.conda#e44ccb61b6621bf3f8053ae66eba7397 https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 https://conda.anaconda.org/conda-forge/linux-64/poppler-23.08.0-hf2349cb_2.conda#fb75401ae7e2e3f354dff72e9da95cae @@ -456,8 +457,8 @@ https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py311h92ebd52_0.conda#ee757dff4cdb96bb972200c85b37f9e8 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py311h18e1886_0.conda#f43c7f60c7b1e7a7cc4234d28520b06a -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h517d4fd_1.conda#481fd009b2d863f526f60ca19cb7880b +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py311h07ce7c0_0.conda#73a9996e4b765455696b53bf74865b09 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h0a5b728_2.conda#9a1e580d3c39175925a652eda3bbccc8 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_1.conda#5abeaa41ec50d4d1421a8bc8fbc93054 https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 @@ -465,12 +466,12 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-hbf3e495_6.conda#a6caf5a0d9ca940d95f21d40afe8f857 https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.1-pyhd8ed1ab_0.conda#d1e7e496405a75fd48ea94f2560c6843 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.8.0-pyhd8ed1ab_0.conda#f9a7fbaeb79d4b57d1ed742930b4eec4 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.8.1-pyhd8ed1ab_0.conda#5e5a5b4d85a972250b52cb54452085fd https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h0a5817f_2.conda#e23c62f75f67166cf4ca137fc8bcdce7 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6238fc3_5.conda#2fef4283b2bb45a66f8b81099d36721e -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py311h74b4f7c_2.conda#e4a26e6bd32d4af38492ba68caaa16d1 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h74b4f7c_0.conda#de8e36c9792f14eed7e11e672f03fbf0 https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 @@ -486,7 +487,7 @@ https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.1-py311hd632256 https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyhd8ed1ab_0.conda#846d12530687ba836791dd54db1f45c5 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py311h18e1886_0.conda#82c29bf38b3fb66da09736106609b5fe -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.7.24-pyhd8ed1ab_0.conda#5e59c23bd7626e83acf61657cf0512e9 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.8.10-pyhd8ed1ab_0.conda#4299bb3917015d44536cd73001256b19 https://conda.anaconda.org/conda-forge/noarch/xarray-2024.7.0-pyhd8ed1ab_0.conda#a7d4ff4bf1502eaba3fbbaeba66969ec https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.2-pyhd8ed1ab_0.conda#02f53038910b6fbc9d36bd5f663318e8 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 @@ -513,14 +514,14 @@ https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2a https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h0887e52_8.conda#34cb3750c8a6da10a490e470f87e670b https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.conda#dcee6ba4d1ac6af18827d0941b6a1b42 https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py311h14de704_1.conda#873580dfb41f82fe67dcd525bd243027 +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py311h044e617_2.conda#5ea04101a9da03787ba90e9c741eb818 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.2.0-pyhd8ed1ab_0.conda#951fd1e2d64ce5790c9fc011445090ce https://conda.anaconda.org/conda-forge/linux-64/cdo-2.3.0-h24bcfa3_0.conda#238311a432a8e49943d3348e279af714 https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda#786d3808394b1bdfd3f41f2e2c67279e https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb -https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 +https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-15.0.2-hac33072_2_cpu.conda#12951edff85582aedcd2db0b79393102 https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-15.0.2-hd42f311_2_cpu.conda#dcc3a1e12157bbbbae96029d9d34fd0e https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-15.0.2-hd4ab825_2_cpu.conda#a4aa5cd69e0d1959f7c965437e7ac93d @@ -592,7 +593,7 @@ https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.1-cuda118_pyh98e67c5_1.conda#b0f361dd5da1239f504facde3661575f -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.0-pyhd8ed1ab_0.conda#f7433e3bd2749b934ddf81451a45967d +https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.1-pyhd8ed1ab_0.conda#a15ab5ec03073d687e31dd9792c19d64 https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_19-pl5321h7e74ff9_0.conda#a4a0ce7caba20cae61aac9aeacbd76c2 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-hac33072_2_cpu.conda#48c711b4e07664ec7b245a9664be60a1 https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-15.0.2-h9241762_2_cpu.conda#97e46f0f20157e19487ca3e65100247a @@ -656,13 +657,13 @@ https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r42hc72bb7e_1.c https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r42hc72bb7e_1.conda#07d5ce8e710897745f14c951ff947cdd https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.conda#7985dada48799b7814ca069794d0b1a3 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.10-pyhd8ed1ab_0.conda#88efd31bf04d9f7a2ac7d02ab568d37d +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.11-pyhd8ed1ab_0.conda#e66672d843c0bfc65f2e4f9badaf6ba9 https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_14-r42h85a8d9e_1.conda#ad59b523759f3e8acc6fd623cfbfb5a9 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.8.0-pyhd8ed1ab_0.conda#795f3557b117402208fe1e0e20d943ed +https://conda.anaconda.org/conda-forge/noarch/dask-2024.8.1-pyhd8ed1ab_0.conda#95277bf15c984015cb76f85a629d622e https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_0.conda#b30cbc09f81d9dbaf8b74f2c8eacddc5 @@ -675,7 +676,7 @@ https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r42hc72bb7e_1.conda#7 https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_5-r42h57805ef_0.conda#e58ccf961b56e57d7c1e50995005b0bd https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r42hc72bb7e_2.conda#8079a86a913155fe2589ec0b76dc9f5e https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.13-pyhd8ed1ab_0.conda#b2f4f2f3923646802215b040e63d042e -https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.4-pyhd8ed1ab_0.conda#9dc80eaeff56fb67dbf4f871b81bc13a +https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.5-pyhd8ed1ab_0.conda#b808b8a0494c5cca76200c73e260a060 https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 From 60938a68685420edc0c25ce9bc985dbef3252527 Mon Sep 17 00:00:00 2001 From: Felicity Chun <32269066+flicj191@users.noreply.github.com> Date: Sat, 7 Sep 2024 05:13:53 +1000 Subject: [PATCH 32/87] Update NSIDC_G02202_sh CMORiser to add bounds for lat,lon and time (#3744) --- .../formatters/datasets/nsidc_g02202_sh.py | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/nsidc_g02202_sh.py b/esmvaltool/cmorizers/data/formatters/datasets/nsidc_g02202_sh.py index c206f817cb..202e370043 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/nsidc_g02202_sh.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/nsidc_g02202_sh.py @@ -27,13 +27,15 @@ import re import numpy as np - import iris from cf_units import Unit from iris.coords import AuxCoord +from esmvalcore.cmor._fixes.common import OceanFixGrid +from esmvalcore.cmor.fixes import get_time_bounds from esmvaltool.cmorizers.data import utilities as utils + logger = logging.getLogger(__name__) @@ -71,7 +73,7 @@ def _create_coord(cubes, var_name, standard_name): standard_name=standard_name, long_name=cube.long_name, var_name=var_name, - units='degrees' # cube.units, + units='degrees' ) return coord @@ -85,24 +87,27 @@ def _extract_variable(raw_var, cmor_info, attrs, filepath, out_dir, latlon): cube = cubes.concatenate_cube() iris.util.promote_aux_coord_to_dim_coord(cube, 'projection_y_coordinate') iris.util.promote_aux_coord_to_dim_coord(cube, 'projection_x_coordinate') - cube.coord('projection_y_coordinate').rename('y') - cube.coord('projection_x_coordinate').rename('x') cube.add_aux_coord(latlon[0], (1, 2)) cube.add_aux_coord(latlon[1], (1, 2)) + # add coord typesi area_type = AuxCoord([1.0], standard_name='area_type', var_name='type', long_name='Sea Ice area type') cube.add_aux_coord(area_type) - # cube.convert_units(cmor_info.units) cube.units = '%' cube.data[cube.data > 100] = np.nan cube = cube * 100 - # utils.fix_coords(cube) #latlon multidimensional utils.fix_var_metadata(cube, cmor_info) utils.set_global_atts(cube, attrs) + # latlon are multidimensional, create bounds + siconc = OceanFixGrid(cmor_info) + cube = siconc.fix_metadata(cubes=[cube])[0] + # time bounds + cube.coord('time').bounds = get_time_bounds(cube.coord('time'), + cmor_info.frequency) utils.save_variable(cube, var, @@ -133,8 +138,9 @@ def _create_areacello(cfg, in_dir, sample_cube, glob_attrs, out_dir): long_name=var_info.long_name, var_name=var_info.short_name, units='m2', - dim_coords_and_dims=[(sample_cube.coord('y'), 0), - (sample_cube.coord('x'), 1)]) + # time is index 0, add cell index dim + dim_coords_and_dims=[(sample_cube.coords()[1], 0), + (sample_cube.coords()[2], 1)]) cube.add_aux_coord(lat_coord, (0, 1)) cube.add_aux_coord(sample_cube.coord('longitude'), (0, 1)) utils.fix_var_metadata(cube, var_info) @@ -152,15 +158,17 @@ def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): cubesaux = iris.load(os.path.join(in_dir, 'G02202-cdr-ancillary-sh.nc')) lat_coord = _create_coord(cubesaux, 'lat', 'latitude') lon_coord = _create_coord(cubesaux, 'lon', 'longitude') + year = 1978 # split by year.. sample_cube = None - while year <= 2022: + for year in range(1979, 2022, 1): filepaths = _get_filepaths(in_dir, cfg['filename'], year) if len(filepaths) > 0: - logger.info("Found %d files in '%s'", len(filepaths), in_dir) + logger.info("Year %d: Found %d files in '%s'", + year, len(filepaths), in_dir) for (var, var_info) in cfg['variables'].items(): logger.info("CMORizing variable '%s'", var) @@ -173,10 +181,8 @@ def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): lon_coord]) else: - logger.info("No files found ") - logger.info("year: %d basename: %s", year, cfg['filename']) - - year += 1 + logger.info("No files found year: %d basename: %s", + year, cfg['filename']) - if sample_cube is not None: - _create_areacello(cfg, in_dir, sample_cube, glob_attrs, out_dir) + if sample_cube is not None: + _create_areacello(cfg, in_dir, sample_cube, glob_attrs, out_dir) From 8d15ce24a762d5b39ecc1e72cfea66f4fe4beebd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2024 16:10:43 +0100 Subject: [PATCH 33/87] [Condalock] Update Linux condalock file (#3742) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 239 ++++++++++++++++++++++---------------------- 1 file changed, 121 insertions(+), 118 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 4f526a49c0..af2625f1b7 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -6,32 +6,41 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/linux-64/_py-xgboost-mutex-2.0-gpu_0.tar.bz2#7702188077361f43a4d61e64c694f850 https://conda.anaconda.org/conda-forge/noarch/_r-mutex-1.0.1-anacondar_1.tar.bz2#19f9db5f4f1b7f5ef5f6d67207f25f38 https://conda.anaconda.org/conda-forge/noarch/_sysroot_linux-64_curr_repodata_hack-3-h69a702a_16.conda#1c005af0c6ff22814b7c52ee448d4bea -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda#670f0e1593b8c1d84f57ad5fe5256799 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 -https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.3-ha770c72_0.conda#0a3af8b93ba501c6ba020deacc9df841 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.4-ha770c72_0.conda#61c94057aaa5ae6145137ce1fddb2c04 https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.7-0.tar.bz2#23acfc5a339a6a34cc2241f64e4111be https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-h4a8ded7_16.conda#ff7f38675b226cfb855aebfc32a13e31 -https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.1.0-h5d3d1c9_100.conda#6d4f65dc440f7b3422113b135be19703 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d -https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.1.0-h5d3d1c9_100.conda#cedc62fd8c4cf28f23d3cd5db7839e99 +https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.1.0-h5d3d1c9_101.conda#713834677de996ac1bc1b0b305ba46ba +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.1.0-h5d3d1c9_101.conda#e007246a554aaf42f73fbfd4be8db3e4 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_16.conda#223fe8a3ff6d5e78484a9d58eb34d055 https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_7.conda#3f840c7ed70a96b5ebde8044b2f36f32 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_1.conda#cd0fbfe1f70b630a94e40007dae3328d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024b-hb9d3cd8_0.conda#db124840386e1f842f93372897d1b857 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.15-hd590300_0.conda#ad8955a300fd09e97e76c38638ac7157 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.0-ha66036c_0.conda#b6927f788e85267beef6cbb292aaebdd +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-he02047a_3.conda#fcd2016d1d299f654f81021e27496818 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 @@ -39,36 +48,37 @@ https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1 https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h1220068_1.conda#f8f0f0c4338bad5c34a4e9e11460481d https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aeabe88534ea4169d4c49998f293d6c https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d +https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-he02047a_3.conda#efab66b82ec976930b96d62a976de8e7 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 https://conda.anaconda.org/conda-forge/linux-64/libnl-3.10.0-h4bc722e_0.conda#6221e705f55cf0533f0777ae54ad86c6 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libopenlibm4-0.8.1-hd590300_1.conda#e6af610e01d04927a5060c95ce4e0875 -https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 -https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 +https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.1.0-hcba0ae0_1.conda#b56e6664bb9a57a29fd91df582223409 +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.7-he02047a_1.conda#2ca22c3c01cf286675450d3c455c717e +https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2#ede4266dc02e875fe1ea77b25dd43747 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda#049b7df8bae5e184d1de42cdf64855f8 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 -https://conda.anaconda.org/conda-forge/linux-64/make-4.3-hd18ef5c_1.tar.bz2#4049ebfd3190b580dffe76daed26155a https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda#40ccb8318df2500f83bd868dd8fcd201 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda#1bee70681f504ea424fb07cdb090c001 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.12-h06160fa_0.conda#bf1899cfd6dea061a220fa7e96a1f4bd https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 -https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024a-h3f72095_0.conda#32146e34aaec3745a08b6f49af3f41b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 @@ -86,8 +96,9 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.11-heb1d5e4_0.cond https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-hce8ee76_3.conda#b19224a5179ecb512c4aac9f8a6d57a7 https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.15-hce8ee76_3.conda#0c4f0205a1ae4ca6c89af922ec54271c https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-hce8ee76_3.conda#9aa734a17b9b0b793c7696435fe7789a +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 +https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.1.0-h3c94d91_1.conda#4e32ec060bf4a30c6fff81a920dc0ec9 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2#cddaf2c63ea4a5901cf09524c490ecdc https://conda.anaconda.org/conda-forge/linux-64/ghostscript-10.03.1-h59595ed_0.conda#be973b4541601270b77232bc46249a3a @@ -100,20 +111,16 @@ https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76 https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda#c48fc56ec03229f294176923c3265c05 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda#4fab9799da9571266d05ca5503330655 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-he02047a_3.conda#9aba7960731e6b4547b3a52f812ed801 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda#73301c133ded2bf71906aa2104edae8b https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.1.0-hcba0ae0_0.conda#88343f89ea4280a79ddd9e755992743d -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 +https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2#a730b2badd586580c5752cc73842e068 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b @@ -130,10 +137,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#7 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/rdma-core-53.0-he02047a_0.conda#d60e9a23682287a041a4428927ea7aa5 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.12-h06160fa_0.conda#bf1899cfd6dea061a220fa7e96a1f4bd https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1 -https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.2-hac33072_0.conda#06c5dec4ebb47213b648a6c4dc8400d6 +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda#0d9c441855be3d8dfdb2e800fe755059 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 @@ -143,37 +150,36 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.7-hbfbeace_6.conda#d6382461de9a91a2665e964f92d8da0a https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/bwidget-1.9.14-ha770c72_1.tar.bz2#5746d6202ba2abad4a4707f2a2462795 https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.12.0-hb4ffafa_0.conda#1a9b16afb84d734a1bb2d196c308d477 https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda#ee3e687b78b778db7b304e5b00a4dca6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.1.0-h3c94d91_0.conda#b0dd0de49e0f3e34f3f636e5c7d149fe +https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.1.0-he4a1faa_1.conda#0ae35a9298e2475dc877da9adaa8e490 https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca +https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.1.0-h8d00ecb_1.conda#6ae4069622b29253444c3326613a8e1a https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hebf79cf_1003.conda#23bb57b64a629bc3b33379beece7f0d7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 -https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h9b56c87_0.conda#cb7355212240e92dcf9c73cb1f10e4a9 +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h104a339_1.conda#9ef052c2eee74c792833ac2e820e481e https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.7.1-hca3a8ce_0.conda#6af97ac284ffaf76d8f63cc1f9d64f7a -https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1020.conda#6d76c5822cb38bc1ab5a06565c6cf626 +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hf539b9f_1021.conda#e8c7620cc49de0c6a2349b6dd6e39beb https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.28-pthreads_h3e26593_0.conda#2bd7dc48907a3b6bf766ed87867f3459 https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.conda#264f9a3a4ea52c8f4d3e8ae1213a3335 -https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.1-cuda118_h09a87be_1.conda#3dce0e18491c192bc8adb511f42dde8c +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.1-cuda118_h09a87be_2.conda#1ef0261ebd8ecdab6ca149ef568ba0bf https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 -https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h38ae2d0_2.conda#168e18a2bba4f8520e6c5e38982f5847 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.103-h593d115_0.conda#233bfe41968d6fb04eba9258bb5061ad -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b +https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.104-hd34e28f_0.conda#0664e59f6937a660eba9f3d2f9123fa8 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_0_cpython.conda#43a02ff0a2dafe8a8a1b6a9eacdbd2cc https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h8bc8fbc_6.conda#dff3627fec2c0584ded391205295abf0 https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-ha691c75_8.conda#3f9bc6137b240642504a6c9b07a10c25 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_0.conda#ae5f4ad87126c55ba3f690ef07f81d64 https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.0-pyhd8ed1ab_0.conda#0482cd2217e27b3ce47676d570ac3d45 @@ -183,10 +189,10 @@ https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481 https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h01f5eca_8.conda#afb85fc0f01032d115c57c961950e7d8 https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-hdb68c23_10.conda#cb6065938167da2d2f078c2f08473b84 -https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py311h38be061_8.conda#5384590f14dfe6ccd02811236afc9f8e -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 +https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py311h38be061_9.conda#6ba5ba862ef1fa30e87292df09e6b73b +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 +https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca @@ -196,7 +202,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda#0d07dc29b1c1cc973f76b74beb44915f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py311hf86e51f_0.conda#9f66da0a75608eeeaaa5dc07b8162c68 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py311hfdbb021_2.conda#e0ee31128372cd4c6873372a756964bb https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda#78745f157d56877a2c6e7b386f66f3e2 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 @@ -208,24 +214,22 @@ https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-1.1.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.0-pyhd8ed1ab_0.conda#ec288789b07ae3be555046e099798a56 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h743c826_0.conda#12e6988845706b2cfbc3bc35c9a61a95 -https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h459d7ec_0.conda#b267e553a337e1878512621e374845c5 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h9ecbd09_1.conda#4605a44155b0c25da37e8f40318c78a4 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_0.tar.bz2#6b1f32359fc5d2ab7b491d0029bfffeb https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e -https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.1.0-he4a1faa_0.conda#a9ce7cd0848a93a8df88c1fc0ac84d9d -https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.1.0-h8d00ecb_0.conda#dacdca4eeb41f72d5df4511a2c06b992 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd8ed1ab_6.conda#2ed1fe4b9079da97c44cfe9c2e5078fd https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca +https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda#ff7ca04134ee8dde1d7cf491a78ef7c7 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.10.0-py311h459d7ec_0.conda#d39020c78fd00ed774ff9c876e8aba07 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 @@ -233,17 +237,17 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openbla https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h482b261_0.conda#0f74c5581623f860e7baca042d9d7139 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h2d7952a_1.conda#7e3173fd1299939a02ebf9ec32aa77c4 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-hdffd6e0_0.conda#a8661c87c873d8c8f90479318ebf0a17 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 -https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py311hbde99c3_0.conda#4c60dfcba06b363be954401addee8800 +https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py311h9c9ff8c_1.conda#9ab40f5700784bf16ff7cf8012a646e8 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py311h38e4bf4_0.conda#3910c815fc788621f88b2bdc0fa9f0a6 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 +https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py311h2cbdf9a_1.conda#867a4aa23ae6c0e9c84cf9aa4f2df0fe +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h9ecbd09_1.conda#c30e9e5aef9e9ff7fb593736ce2a4546 https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2#34fc335fc50eef0b5ea708f2b5f54e0c https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.8-py311h52f7536_0.conda#f33f59b8130753174992f409a41e112e -https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py311h459d7ec_0.conda#4288ea5cbe686d1b18fc3efb36c009a5 +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py311hd18a35c_0.conda#682f76920687f7d9283039eb542fdacf +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h9ecbd09_0.conda#afada76949d16eb7d7128ca1dc7d2f10 https://conda.anaconda.org/conda-forge/noarch/munch-4.0.0-pyhd8ed1ab_0.conda#376b32e8f9d3eacbd625f37d39bd507d https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 @@ -256,28 +260,28 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda#17064acba08d3686f1135b5ec1b32b12 https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.2-pyhd8ed1ab_0.conda#e1a2dfcd5695f0744f1bcd3bbfe02523 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h331c9d8_0.conda#f1cbef9236edde98a811ba5a98975f2e +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h9ecbd09_1.conda#493e283ab843404fa36add81fcc49f6c https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.9.1-pyhd8ed1ab_0.tar.bz2#0191dd7efe1a94262812770183b68892 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pyflakes-2.5.0-pyhd8ed1ab_0.tar.bz2#1b3bef4313288ae8d35b1dfba4cd84a3 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h61187de_0.conda#44bac99d0125c748894b9ffb6ce97811 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h61187de_0.conda#76439451605390254b85d8da6f8d962a +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda#abeb54d40f439b86f75ea57045ab8496 https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py311hb3a8bbb_0.conda#db475e65fb621c2ec1dcdcc4e170b6f1 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py311h9e33e62_1.conda#3989f9a93796221aff20be94300e3b93 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py311h459d7ec_0.conda#7865c897d89a39abc0056d89e37bd9e9 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 -https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.3-py311h61187de_0.conda#1d639b30c50f420f2d17b4ad4935d7c1 +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f +https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.3-py311h9ecbd09_1.conda#b208b9b6336362211c787547f92a5464 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -294,26 +298,26 @@ https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda#0062a5f3347733f67b0f33ca48cc21dd https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h331c9d8_0.conda#e29e451c96bf8e81a5760b7565c6ed2c +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h9ecbd09_1.conda#616fed0b6f5c925250be779b05d1d7f7 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.7.2-pyhd8ed1ab_0.conda#2b9f52c7ecb8d017e50f91852aead307 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py311h4332511_0.conda#442a260df22ffad7f666c7e3f119b5ab +https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py311hfdbb021_1.conda#273cf8bedf58f24aec8d960831f89c5a https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_1.conda#6042b782b893029aa40335782584a092 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/webob-1.8.7-pyhd8ed1ab_0.tar.bz2#a8192f3585f341ea66c60c189580ac67 +https://conda.anaconda.org/conda-forge/noarch/webob-1.8.8-pyhd8ed1ab_0.conda#ae69b699c308c3bd20388219764235b0 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py311h459d7ec_0.conda#6669b5529d206c1f880b642cdd17ae05 +https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py311h9ecbd09_1.conda#810ae646bcc50a017380336d874e4014 https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.2.0-pyhd8ed1ab_0.conda#a1f7264726115a2f8eac9773b1f27eba https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hd590300_1.conda#ae92aab42726eb29d16488924f7312cb -https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.6.0-pyhd8ed1ab_0.conda#de631703d59e40af41c56c4b4e2928ab +https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.9.0-pyhd8ed1ab_0.conda#156c91e778c1d4d57b709f8c5333fd06 https://conda.anaconda.org/conda-forge/noarch/yapf-0.32.0-pyhd8ed1ab_0.tar.bz2#177cba0b4bdfacad5c5fbb0ed31504c4 -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h75354e8_4.conda#03cc8d9838ad9dd0060ab532e81ccb21 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-ha4adb4c_5.conda#e8372041ebb377237db9d0d24c7b5962 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.0-pyhd8ed1ab_0.conda#05b6bcb391b5be17374f7ad0aeedc479 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/asgiref-3.8.1-pyhd8ed1ab_0.conda#b5c2e1034ccc76fb14031637924880eb @@ -323,24 +327,23 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.3-h50844eb_4.con https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e -https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py311ha8e6434_0.conda#32259cd17741b52be10cd23a26cca23a +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.3.0-hbdc6101_0.conda#797554b8b7603011e8677884381fbcc5 https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h61187de_0.conda#1a4c475c89ad142967256d0c7237f298 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h9ecbd09_1.conda#a36ccf0f3d2eb95a0ecc293f5f56e080 https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.1-h18eb788_0.conda#2e7dedf73dfbfcee662e2a0f6175e4bb https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a https://conda.anaconda.org/conda-forge/noarch/fire-0.6.0-pyhd8ed1ab_0.conda#e9ed10aa8fa1dd6782940b95c942a6ae -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h61187de_0.conda#bcbe6c9db1c25900c3808b8974e1bb90 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h9ecbd09_1.conda#89ed1820af1523df84171049199ed915 https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.3-pyhd8ed1ab_0.conda#82b36c572ecc0d42c612203769e19de5 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda#c808991d29b9838fb4d96ce8267ec9ec https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 @@ -355,46 +358,46 @@ https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b -https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py311h6d46414_0.conda#7dedf22b491b66f848718d498e60fabf +https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py311hcfaa980_1.conda#b76d6a1a47942ad2021a9d3d7fe527bd https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 -https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py311h459d7ec_0.conda#b635b3b6a2dcab441c2ef474a3da9e67 +https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py311h50c5138_1.conda#7d777fcd827bbd67fd1b8b01b7f8f333 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 -https://conda.anaconda.org/conda-forge/noarch/plotly-5.23.0-pyhd8ed1ab_0.conda#41e535b9e479c72a6bffc69a4c85837c -https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.4-ha8faf9a_0.conda#58af4d5fc019a678745f6bff7ddee225 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 +https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.0-pyhd8ed1ab_0.conda#80a4a0867ded2a66687e78bca0bc70fc +https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.4-hb2eb5c0_1.conda#1aaec5dbae29b3f0a2c20eeb84e9e38a https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.1.0-pyhd8ed1ab_0.conda#03736d8ced74deece64e54be348ddd3e -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.2-pyhd8ed1ab_0.conda#89703b4f38bd1c0353881f085bc8fdaa -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.1.1-py311h759c1eb_0.conda#f8e69933c5cb408b79e97de35601fb85 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py311h7deb3e3_2.conda#5d3fc8b5c5765e1f207c53554a713907 https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-pyhd8ed1ab_3.conda#1f7482562f2082f1b2abf8a3e2a41b63 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py311h459d7ec_0.conda#4dccc0bc3bb4d6e5c30bccbd053c4f90 -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_3.conda#c667c11d1e488a38220ede8a34441bff +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda#ee6f7fd1e76061ef1fa307d41fa86a96 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda#c6e94fc2b2ec71ea33fe7c7da259acb4 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.4-pyhd8ed1ab_0.conda#14c15fa7def506fe7d1a0e3abdc212d6 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-hac6953d_0.conda#63b80ca78d29380fe69e69412dcbe4ac https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.1.3-h4ab18f5_1.conda#4d6c9925cdcda27e9d022e40eb3eac05 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hd590300_0.conda#12bf78e12f71405775e1c092902959d3 https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c089f90a086b6214c5606368d0d3bad0 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda#a1240b99a7ccd953879dc63111823986 -https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h459d7ec_0.conda#fff0f2058e9d86c8bf5848ee93917a8d +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.11.1-py311h9ecbd09_0.conda#3dfc4a6fef3ef9683494e3266fca27ea https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.5-py311h61187de_0.conda#4b255c4b54de2a41bc8dc63ee78098e4 https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.7-hb7bd14b_1.conda#82bd3d7da86d969c62ff541bab19526a https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.3-pyhd8ed1ab_0.conda#91fc4700dcce4a46d439900a132fe4e5 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.0-py311hc6616f6_0.conda#f392b3f7a26db16f37cf82996dcfc84d -https://conda.anaconda.org/conda-forge/noarch/django-5.1-pyhd8ed1ab_0.conda#6b249ed894a6b9094e4a0073e315c423 +https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.0-pyhd8ed1ab_0.conda#1e5ac693650d3312e6421e766a5abadd +https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.1-py311hafd3f86_0.conda#2653b58a992032d6c3ff4d82fc1c6c82 +https://conda.anaconda.org/conda-forge/noarch/django-5.1.1-pyhd8ed1ab_0.conda#d1e2ab198eca6bf9fcd81f6fd790e2c5 https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 @@ -407,33 +410,33 @@ https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hf1a501a_15.conda#d2e16a32f41d67c7d280da11b2846328 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 -https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 +https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hf8d3e68_2.conda#ffe68c611ae0ccfda4e7a605195e22b3 https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_1.conda#4809b9f4c6ce106d443c3f90b8e10db2 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.22.0-h9be4e54_1.conda#4b4e36a91e7dabf7345b82d85767a7c3 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h090f1da_1.conda#9a2d6acaa8ce6d53a150248e7b11165e https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.4.2-pyhd8ed1ab_0.conda#aca82be28a1c676a3e0365e83892f412 +https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_0.conda#6f9eb38d0a87898cf5a7c91adaccd691 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_4.conda#75d504c6787edc377ebdba087a26a61b https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 -https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.3-pyhd8ed1ab_0.conda#1dbdf019d740419852c4a7803fff49d9 +https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.4-pyhd8ed1ab_0.conda#638cfd3bf6904125e868176d89c2ae0b https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_0.conda#52b91ecba854d55b28ad916a8b10da24 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 -https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.1-pyhd8ed1ab_0.conda#d657cde3b3943fcedf6038138eea84de +https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2-pyhd8ed1ab_0.conda#7309d5de1e4e866df29bcd8ea5550035 https://conda.anaconda.org/conda-forge/noarch/rdflib-7.0.0-pyhd8ed1ab_0.conda#44d14ef95495b3d4438f28998e0296a9 https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.2.2-pyhd8ed1ab_0.conda#6626918380d99292df110f3c91b6e5ec https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h5a4f163_3.conda#f363554b9084fb9d5e3366fbbc0d18e0 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h5cd10c7_0.conda#8efe4fe2396281627b3450af8357b190 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.6-hf567797_4.conda#ffb662b31aef333e68a00dd17fda2027 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.1-pyhd8ed1ab_0.conda#8fe3858b19843234b331d8459db3a7a1 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_1.conda#f709f23e2b1b93b3b6a20e9e7217a258 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 @@ -447,7 +450,7 @@ https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.22.0-hc7a4891_1.conda#7811f043944e010e54640918ea82cecd https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h228c76a_104.conda#91bc3ac73308181d55a09d9e4aeb4496 +https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h22f9119_106.conda#5b911bfe75855326bae6857451268e59 https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py311h4bc866e_0.conda#e32a210e9caf97383c35685fd2343512 https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.13.0-py311h044e617_0.conda#9d783b29b6fc53e4d9a94f5befdfd34b https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py311h320fe9a_0.conda#e44ccb61b6621bf3f8053ae66eba7397 @@ -458,43 +461,43 @@ https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.cond https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py311h92ebd52_0.conda#ee757dff4cdb96bb972200c85b37f9e8 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py311h07ce7c0_0.conda#73a9996e4b765455696b53bf74865b09 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h0a5b728_2.conda#9a1e580d3c39175925a652eda3bbccc8 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he1f765f_0.conda#eb7e2a849cd47483d7e9eeb728c7a8c5 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_1.conda#5abeaa41ec50d4d1421a8bc8fbc93054 https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-hbf3e495_6.conda#a6caf5a0d9ca940d95f21d40afe8f857 -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.1-pyhd8ed1ab_0.conda#d1e7e496405a75fd48ea94f2560c6843 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.8.1-pyhd8ed1ab_0.conda#5e5a5b4d85a972250b52cb54452085fd +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.2-pyhd8ed1ab_0.conda#38d785787ec83d0431b3855328395113 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h9f3472d_6.conda#ac7dc7f70f8d2c1d96ecb7e4cb196498 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.8.2-pyhd8ed1ab_0.conda#44d22b5d98a219a4c35cafe9bf3b9ce2 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h0a5817f_2.conda#e23c62f75f67166cf4ca137fc8bcdce7 +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h4441c20_3.conda#1afc1e85414e228916732df2b8c5d93b https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6238fc3_5.conda#2fef4283b2bb45a66f8b81099d36721e https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h74b4f7c_0.conda#de8e36c9792f14eed7e11e672f03fbf0 https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311hae66bec_102.conda#87b59caea7db5b79766e0776953d8c66 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_1.conda#004cff3a7f6fafb0a041fb575de85185 https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.tar.bz2#00d8853fb1f87195722ea6a582cc9b56 https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b -https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h18e1886_2.conda#b1e90d33ae504ac06a3928a2dc5654ba +https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h9f3472d_3.conda#a7c4169b1c920361597ddacb461350fd https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.1-py311hd632256_0.conda#f3928b428ad924ecb8f0e9b71124ed7f https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyhd8ed1ab_0.conda#846d12530687ba836791dd54db1f45c5 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py311h18e1886_0.conda#82c29bf38b3fb66da09736106609b5fe -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.8.10-pyhd8ed1ab_0.conda#4299bb3917015d44536cd73001256b19 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.8.30-pyhd8ed1ab_0.conda#330700f370f15c7c5660ef6865e9cc43 https://conda.anaconda.org/conda-forge/noarch/xarray-2024.7.0-pyhd8ed1ab_0.conda#a7d4ff4bf1502eaba3fbbaeba66969ec -https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.2-pyhd8ed1ab_0.conda#02f53038910b6fbc9d36bd5f663318e8 +https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda#41abde21508578e02e3fd492e82a05cd https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.4-pyhd8ed1ab_0.conda#c8b6a3126f659e311d3b5c61be254d95 https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b -https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.5-pyhd8ed1ab_0.conda#abfb434fb6654f83d740428863ec85a8 +https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda#a201de7d36907f2355426e019168d337 https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.2-py311h815a124_5.conda#84a14fd830b72b09ef886a23de557a16 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 @@ -505,18 +508,18 @@ https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.1-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-he3b17a9_50.conda#a37fcb5a2da31cfebe6734b0fda20bd5 -https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.7-h57a25ff_0.conda#3bbcb2c36dc92bc70621d2625fcbf631 +https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.8-hf7c1f58_0.conda#6cd18a9c6b8269b0cd101ba9cc3d02ab https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py311h38be061_0.conda#b980793f61c0dc532b62faa0a0f0a271 -https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.1-cuda118_pyhf54b869_1.conda#8c7b38167179a58a944471b5ad798822 +https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.1-cuda118_pyhf54b869_2.conda#35d99c71383da3c2f88a97d471f79e1f https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h0887e52_8.conda#34cb3750c8a6da10a490e470f87e670b https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.conda#dcee6ba4d1ac6af18827d0941b6a1b42 https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py311h044e617_2.conda#5ea04101a9da03787ba90e9c741eb818 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 -https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.2.0-pyhd8ed1ab_0.conda#951fd1e2d64ce5790c9fc011445090ce +https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.3.2-pyhd8ed1ab_0.conda#3d0aba33db35ed85eb23ee6948ff79a0 https://conda.anaconda.org/conda-forge/linux-64/cdo-2.3.0-h24bcfa3_0.conda#238311a432a8e49943d3348e279af714 https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda#786d3808394b1bdfd3f41f2e2c67279e @@ -592,8 +595,8 @@ https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r42hc72bb7e_2 https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda#97f60a93ca12f4fdd5f44049dcee4345 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c -https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.1-cuda118_pyh98e67c5_1.conda#b0f361dd5da1239f504facde3661575f -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.1-pyhd8ed1ab_0.conda#a15ab5ec03073d687e31dd9792c19d64 +https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.1-cuda118_pyh98e67c5_2.conda#8c61e30dd8325ea1598e9d0af3eb2582 +https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.2-pyhd8ed1ab_1.conda#0b896fef433a120a80f37e4ad57a3850 https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_19-pl5321h7e74ff9_0.conda#a4a0ce7caba20cae61aac9aeacbd76c2 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-hac33072_2_cpu.conda#48c711b4e07664ec7b245a9664be60a1 https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-15.0.2-h9241762_2_cpu.conda#97e46f0f20157e19487ca3e65100247a @@ -657,13 +660,13 @@ https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r42hc72bb7e_1.c https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r42hc72bb7e_1.conda#07d5ce8e710897745f14c951ff947cdd https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.conda#7985dada48799b7814ca069794d0b1a3 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.11-pyhd8ed1ab_0.conda#e66672d843c0bfc65f2e4f9badaf6ba9 +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.13-pyhd8ed1ab_0.conda#b77166a6032a2b8e52b3fee90d62ea4d https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_14-r42h85a8d9e_1.conda#ad59b523759f3e8acc6fd623cfbfb5a9 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.8.1-pyhd8ed1ab_0.conda#95277bf15c984015cb76f85a629d622e +https://conda.anaconda.org/conda-forge/noarch/dask-2024.8.2-pyhd8ed1ab_0.conda#3adbad9b363bd0163ef2ac59f095cc13 https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_0.conda#b30cbc09f81d9dbaf8b74f2c8eacddc5 From 44cf7bf8eff901a5a8dbb928b33ee8a41e71b14b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 13:52:05 +0100 Subject: [PATCH 34/87] [Condalock] Update Linux condalock file (#3754) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 98 ++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index af2625f1b7..4666bce730 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -35,7 +35,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.c https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_1.conda#cd0fbfe1f70b630a94e40007dae3328d https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024b-hb9d3cd8_0.conda#db124840386e1f842f93372897d1b857 +https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-hb9d3cd8_1003.conda#32623b33f2047dbc9ae2f2e8fd3880e9 +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-hb9d3cd8_1003.conda#e87bfacb110d85e1eb6099c9ed8e7236 +https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-hb9d3cd8_1003.conda#bf90782559bce8447609933a7d45995a +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-hb9d3cd8_1008.conda#a63f5b66876bb1ec734ab4bdc4d11e86 https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.15-hd590300_0.conda#ad8955a300fd09e97e76c38638ac7157 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb @@ -43,6 +49,8 @@ https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418 https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-he02047a_3.conda#fcd2016d1d299f654f81021e27496818 +https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881 +https://conda.anaconda.org/conda-forge/linux-64/ghostscript-10.04.0-h5888daf_0.conda#3b8d7a2df810ad5109a51472b23dbd8e https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h1220068_1.conda#f8f0f0c4338bad5c34a4e9e11460481d @@ -75,18 +83,13 @@ https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7 https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda#40ccb8318df2500f83bd868dd8fcd201 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda#1bee70681f504ea424fb07cdb090c001 -https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.12-h06160fa_0.conda#bf1899cfd6dea061a220fa7e96a1f4bd https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 -https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 -https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae @@ -100,8 +103,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.cond https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.1.0-h3c94d91_1.conda#4e32ec060bf4a30c6fff81a920dc0ec9 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 -https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2#cddaf2c63ea4a5901cf09524c490ecdc -https://conda.anaconda.org/conda-forge/linux-64/ghostscript-10.03.1-h59595ed_0.conda#be973b4541601270b77232bc46249a3a +https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/gtest-1.14.0-h434a139_2.conda#89971b339bb4dfbf3759f1f2528d81b1 @@ -117,13 +119,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-he0204 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda#73301c133ded2bf71906aa2104edae8b https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2#a730b2badd586580c5752cc73842e068 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h59595ed_0.conda#a7b444a6e008b804b35521895e3440e2 @@ -142,7 +144,6 @@ https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda#0 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 -https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 https://conda.anaconda.org/conda-forge/linux-64/xorg-makedepend-1.0.9-h59595ed_0.conda#71c756cfcc6649ed7614eb07712bfce0 https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-hac33072_1.conda#df96b7266e49529d82de467b23977452 @@ -156,7 +157,6 @@ https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.12.0-hb4ffafa_0.conda https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda#ee3e687b78b778db7b304e5b00a4dca6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.1.0-he4a1faa_1.conda#0ae35a9298e2475dc877da9adaa8e490 -https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.1.0-h8d00ecb_1.conda#6ae4069622b29253444c3326613a8e1a https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hebf79cf_1003.conda#23bb57b64a629bc3b33379beece7f0d7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 @@ -214,7 +214,7 @@ https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-1.1.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.0-pyhd8ed1ab_0.conda#ec288789b07ae3be555046e099798a56 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h743c826_0.conda#12e6988845706b2cfbc3bc35c9a61a95 @@ -225,7 +225,7 @@ https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda# https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd8ed1ab_6.conda#2ed1fe4b9079da97c44cfe9c2e5078fd https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda#ff7ca04134ee8dde1d7cf491a78ef7c7 @@ -233,8 +233,8 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0 https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.10.0-py311h459d7ec_0.conda#d39020c78fd00ed774ff9c876e8aba07 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda#80aea6603a6813b16ec119d00382b772 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h2d7952a_1.conda#7e3173fd1299939a02ebf9ec32aa77c4 @@ -260,7 +260,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda#17064acba08d3686f1135b5ec1b32b12 https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.2-pyhd8ed1ab_0.conda#e1a2dfcd5695f0744f1bcd3bbfe02523 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h9ecbd09_1.conda#493e283ab843404fa36add81fcc49f6c https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.9.1-pyhd8ed1ab_0.tar.bz2#0191dd7efe1a94262812770183b68892 @@ -280,7 +280,7 @@ https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py311h9e33e62_1.c https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py311h459d7ec_0.conda#7865c897d89a39abc0056d89e37bd9e9 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f +https://conda.anaconda.org/conda-forge/noarch/setuptools-74.1.2-pyhd8ed1ab_0.conda#56c9c11d004428e81d02eeb730fc6336 https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.3-py311h9ecbd09_1.conda#b208b9b6336362211c787547f92a5464 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 @@ -300,7 +300,7 @@ https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda# https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h9ecbd09_1.conda#616fed0b6f5c925250be779b05d1d7f7 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.7.2-pyhd8ed1ab_0.conda#2b9f52c7ecb8d017e50f91852aead307 +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.9.12-pyhd8ed1ab_0.conda#fc9f0a4706e95a21daa3c17287e93865 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py311hfdbb021_1.conda#273cf8bedf58f24aec8d960831f89c5a https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_1.conda#6042b782b893029aa40335782584a092 @@ -317,7 +317,7 @@ https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.9.0-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/noarch/yapf-0.32.0-pyhd8ed1ab_0.tar.bz2#177cba0b4bdfacad5c5fbb0ed31504c4 https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-ha4adb4c_5.conda#e8372041ebb377237db9d0d24c7b5962 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/asgiref-3.8.1-pyhd8ed1ab_0.conda#b5c2e1034ccc76fb14031637924880eb @@ -332,7 +332,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.3.0-hbdc6101_0.conda#7 https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h9ecbd09_1.conda#a36ccf0f3d2eb95a0ecc293f5f56e080 -https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.1-h18eb788_0.conda#2e7dedf73dfbfcee662e2a0f6175e4bb +https://conda.anaconda.org/conda-forge/linux-64/curl-8.10.1-hbbe4b11_0.conda#73c561c6b84bda71776c9fa21517e7eb https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a @@ -342,7 +342,7 @@ https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358 https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda#c808991d29b9838fb4d96ce8267ec9ec https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 @@ -351,12 +351,12 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25 https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py311h38be061_0.conda#f85e78497dfed6f6a4b865191f42de2e https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda#f5b8822297c9c790cec0795ca1fc9be6 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-he9388d3_8.conda#f3abc6e6ab60fa404c23094f5a03ec9b https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.1-hebfc3b9_0.conda#ddd09e8904fde46b85f41896621803e6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda#fd540578678aefe025705f4b58b36b2e https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py311hcfaa980_1.conda#b76d6a1a47942ad2021a9d3d7fe527bd https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 @@ -365,7 +365,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py311h50c5138_1.c https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 -https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.0-pyhd8ed1ab_0.conda#80a4a0867ded2a66687e78bca0bc70fc +https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.1-pyhd8ed1ab_0.conda#81bb643d6c3ab4cbeaf724e9d68d0a6a https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.4-hb2eb5c0_1.conda#1aaec5dbae29b3f0a2c20eeb84e9e38a https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 @@ -382,20 +382,20 @@ https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda#c6e94fc2b2ec71ea33fe7c7da259acb4 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.4-pyhd8ed1ab_0.conda#14c15fa7def506fe7d1a0e3abdc212d6 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.5-pyhd8ed1ab_0.conda#949a6778521278cb96d7491bd99a5418 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-hac6953d_0.conda#63b80ca78d29380fe69e69412dcbe4ac https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.1.3-h4ab18f5_1.conda#4d6c9925cdcda27e9d022e40eb3eac05 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hd590300_0.conda#12bf78e12f71405775e1c092902959d3 https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c089f90a086b6214c5606368d0d3bad0 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda#a1240b99a7ccd953879dc63111823986 -https://conda.anaconda.org/conda-forge/linux-64/yarl-1.11.1-py311h9ecbd09_0.conda#3dfc4a6fef3ef9683494e3266fca27ea -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.5-py311h61187de_0.conda#4b255c4b54de2a41bc8dc63ee78098e4 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h9ecbd09_1.conda#c09ed3ac47970f4cabcefc330365d158 +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.5-py311h9ecbd09_1.conda#7940686d7b134b80dce8cd9ba652fe3e https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.7-hb7bd14b_1.conda#82bd3d7da86d969c62ff541bab19526a https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.0-pyhd8ed1ab_0.conda#1e5ac693650d3312e6421e766a5abadd +https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.1-pyhd8ed1ab_0.conda#2ab100a58c45feb12e2b79a61bb3458a https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.1-py311hafd3f86_0.conda#2653b58a992032d6c3ff4d82fc1c6c82 https://conda.anaconda.org/conda-forge/noarch/django-5.1.1-pyhd8ed1ab_0.conda#d1e2ab198eca6bf9fcd81f6fd790e2c5 https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea @@ -408,8 +408,9 @@ https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hf1a501a_15.conda#d2e16a32f41d67c7d280da11b2846328 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_0.conda#a14218cfb29662b4a19ceb04e93e298e https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hf8d3e68_2.conda#ffe68c611ae0ccfda4e7a605195e22b3 https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_1.conda#4809b9f4c6ce106d443c3f90b8e10db2 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.22.0-h9be4e54_1.conda#4b4e36a91e7dabf7345b82d85767a7c3 @@ -421,7 +422,7 @@ https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_4.conda#75d504c6787edc377ebdba087a26a61b https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 -https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.4-pyhd8ed1ab_0.conda#638cfd3bf6904125e868176d89c2ae0b +https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.5-pyhd8ed1ab_0.conda#ecd5e850bcd3eca02143e7df030ee50f https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_0.conda#52b91ecba854d55b28ad916a8b10da24 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 @@ -436,45 +437,44 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.6-hf567797_4.co https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_1.conda#f709f23e2b1b93b3b6a20e9e7217a258 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.9.18-py311h9b38416_0.conda#67bed2bd92ffa76b20506d83427706ae https://conda.anaconda.org/conda-forge/noarch/imageio-2.35.1-pyh12aca89_0.conda#b03ff3631329c8ef17bae35d2bb216f7 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 https://conda.anaconda.org/conda-forge/linux-64/julia-1.9.3-h06b7c97_0.conda#6214d0563598ae0cc9b954344b9f9c10 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.22.0-hc7a4891_1.conda#7811f043944e010e54640918ea82cecd https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h22f9119_106.conda#5b911bfe75855326bae6857451268e59 https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py311h4bc866e_0.conda#e32a210e9caf97383c35685fd2343512 https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.13.0-py311h044e617_0.conda#9d783b29b6fc53e4d9a94f5befdfd34b -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py311h320fe9a_0.conda#e44ccb61b6621bf3f8053ae66eba7397 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py311h7db5c69_1.conda#643f8cb35133eb1be4919fb953f0a25f https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 https://conda.anaconda.org/conda-forge/linux-64/poppler-23.08.0-hf2349cb_2.conda#fb75401ae7e2e3f354dff72e9da95cae https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py311h92ebd52_0.conda#ee757dff4cdb96bb972200c85b37f9e8 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py311h07ce7c0_0.conda#73a9996e4b765455696b53bf74865b09 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py311h9f3472d_1.conda#be9361437b3f5b9d79ffa6b577b1dedc https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he1f765f_0.conda#eb7e2a849cd47483d7e9eeb728c7a8c5 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_1.conda#5abeaa41ec50d4d1421a8bc8fbc93054 https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-hbf3e495_6.conda#a6caf5a0d9ca940d95f21d40afe8f857 https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.2-pyhd8ed1ab_0.conda#38d785787ec83d0431b3855328395113 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h9f3472d_6.conda#ac7dc7f70f8d2c1d96ecb7e4cb196498 -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.8.2-pyhd8ed1ab_0.conda#44d22b5d98a219a4c35cafe9bf3b9ce2 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.9.0-pyhd8ed1ab_0.conda#2e4adbc7926d91412fec7076f14d554d https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h4441c20_3.conda#1afc1e85414e228916732df2b8c5d93b https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6238fc3_5.conda#2fef4283b2bb45a66f8b81099d36721e -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h74b4f7c_0.conda#de8e36c9792f14eed7e11e672f03fbf0 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h2b939e6_1.conda#db431da3476c884ef08d9f42a32913b6 https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311hae66bec_102.conda#87b59caea7db5b79766e0776953d8c66 @@ -486,15 +486,15 @@ https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.t https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h9f3472d_3.conda#a7c4169b1c920361597ddacb461350fd https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.1-py311hd632256_0.conda#f3928b428ad924ecb8f0e9b71124ed7f +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.2-py311h57cc02b_1.conda#d1b6d7a73364d9fe20d2863bd2c43e3a https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyhd8ed1ab_0.conda#846d12530687ba836791dd54db1f45c5 -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.2-py311h18e1886_0.conda#82c29bf38b3fb66da09736106609b5fe +https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.3-py311h9f3472d_0.conda#998bb9a06c3d669d925e9a19724940cf https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.8.30-pyhd8ed1ab_0.conda#330700f370f15c7c5660ef6865e9cc43 -https://conda.anaconda.org/conda-forge/noarch/xarray-2024.7.0-pyhd8ed1ab_0.conda#a7d4ff4bf1502eaba3fbbaeba66969ec +https://conda.anaconda.org/conda-forge/noarch/xarray-2024.9.0-pyhd8ed1ab_0.conda#2cde8ed028a0fd8f35d7f9b44839d362 https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda#41abde21508578e02e3fd492e82a05cd -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.4-pyhd8ed1ab_0.conda#c8b6a3126f659e311d3b5c61be254d95 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h7db5c69_2.conda#abbee22293e6c094fbe139615cba1572 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.5-pyhd8ed1ab_1.conda#7ee17828b8e0472196ed1663cdc970cb https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda#a201de7d36907f2355426e019168d337 @@ -519,7 +519,7 @@ https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.c https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py311h044e617_2.conda#5ea04101a9da03787ba90e9c741eb818 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 -https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.3.2-pyhd8ed1ab_0.conda#3d0aba33db35ed85eb23ee6948ff79a0 +https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.3.3-pyhd8ed1ab_0.conda#995084cc4bd45c480ddd4f1380de1d0f https://conda.anaconda.org/conda-forge/linux-64/cdo-2.3.0-h24bcfa3_0.conda#238311a432a8e49943d3348e279af714 https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda#786d3808394b1bdfd3f41f2e2c67279e @@ -596,14 +596,14 @@ https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.1-cuda118_pyh98e67c5_2.conda#8c61e30dd8325ea1598e9d0af3eb2582 -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.2-pyhd8ed1ab_1.conda#0b896fef433a120a80f37e4ad57a3850 +https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.3-pyhd8ed1ab_0.conda#bb748c8dcbcc48b4565459a860b13616 https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_19-pl5321h7e74ff9_0.conda#a4a0ce7caba20cae61aac9aeacbd76c2 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-hac33072_2_cpu.conda#48c711b4e07664ec7b245a9664be60a1 https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-15.0.2-h9241762_2_cpu.conda#97e46f0f20157e19487ca3e65100247a https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py311h38be061_1.conda#d7901c26884613539e958c10e9973413 https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py311h38be061_1.conda#1077e7fc4aa594c5896cf8b8fa672f88 -https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.1-py311h38be061_0.conda#036ce626484c4458cc99b6d55bb036eb +https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.1-py311h38be061_1.conda#09a1fe2e68da301800bb919a24312e86 https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r42ha503ecb_0.conda#12b6fa8fe80a6494a948c6ea2f34340d https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r42h57805ef_0.conda#9febce7369c72d991e2399d7d28f3390 @@ -660,13 +660,13 @@ https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r42hc72bb7e_1.c https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r42hc72bb7e_1.conda#07d5ce8e710897745f14c951ff947cdd https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.conda#7985dada48799b7814ca069794d0b1a3 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.13-pyhd8ed1ab_0.conda#b77166a6032a2b8e52b3fee90d62ea4d +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.14-pyhd8ed1ab_0.conda#6644c676dce50d7355e5e1c7e90e999c https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_14-r42h85a8d9e_1.conda#ad59b523759f3e8acc6fd623cfbfb5a9 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.8.2-pyhd8ed1ab_0.conda#3adbad9b363bd0163ef2ac59f095cc13 +https://conda.anaconda.org/conda-forge/noarch/dask-2024.9.0-pyhd8ed1ab_0.conda#43e08d885b7669b7605ede5bb9aa861f https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_0.conda#b30cbc09f81d9dbaf8b74f2c8eacddc5 From 8761590a4f0d8a482d001c34e993f905abc7b1f2 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Mon, 23 Sep 2024 17:40:57 +0100 Subject: [PATCH 35/87] [Julia] pin `curl <8.10` to restrict `libcurl <8.10` so Julia installs packages correctly (#3755) Co-authored-by: Bouwe Andela --- environment.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/environment.yml b/environment.yml index 54aa73bcf0..681783e7b4 100644 --- a/environment.yml +++ b/environment.yml @@ -16,6 +16,7 @@ dependencies: - cf-units - cftime - cmocean + - curl <8.10 - cython - dask !=2024.8.0 # https://github.com/dask/dask/issues/11296 - distributed From 7ea975a4d2c0653d1a90b72263ada18ac5c22185 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 24 Sep 2024 16:51:21 +0200 Subject: [PATCH 36/87] dark mode compatible transparent background logo (#3751) --- README.md | 2 +- doc/sphinx/source/conf.py | 11 ++++++++--- .../source/figures/ESMValTool-logo-2-dark.png | Bin 0 -> 42828 bytes .../source/figures/ESMValTool-logo-2-glow.png | Bin 0 -> 77452 bytes .../source/figures/ESMValTool-logo-2.png | Bin 46806 -> 41318 bytes 5 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 doc/sphinx/source/figures/ESMValTool-logo-2-dark.png create mode 100644 doc/sphinx/source/figures/ESMValTool-logo-2-glow.png diff --git a/README.md b/README.md index b196f7fbb8..aba76671cc 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![Anaconda-Server Badge](https://img.shields.io/conda/vn/conda-forge/ESMValTool?color=blue&label=conda-forge&logo=conda-forge&logoColor=white)](https://anaconda.org/conda-forge/esmvaltool) ![stand with Ukraine](https://badgen.net/badge/stand%20with/UKRAINE/?color=0057B8&labelColor=FFD700) -![esmvaltoollogo](https://raw.githubusercontent.com/ESMValGroup/ESMValTool/main/doc/sphinx/source/figures/ESMValTool-logo-2.png) +![esmvaltoollogo](https://raw.githubusercontent.com/ESMValGroup/ESMValTool/main/doc/sphinx/source/figures/ESMValTool-logo-2-glow.png) - [**Documentation**](https://docs.esmvaltool.org/en/latest/) - [**ESMValTool Website**](https://www.esmvaltool.org/) diff --git a/doc/sphinx/source/conf.py b/doc/sphinx/source/conf.py index 1af560b576..de7feb4775 100644 --- a/doc/sphinx/source/conf.py +++ b/doc/sphinx/source/conf.py @@ -168,8 +168,13 @@ # `conf.py` file.Be aware that `navigation_with_keys = True` has negative # accessibility implications: # https://github.com/pydata/pydata-sphinx-theme/issues/1492" -html_theme_options = {"navigation_with_keys": False} - +html_theme_options = { + "navigation_with_keys": False, + "logo": { + "image_light": "figures/ESMValTool-logo-2.png", + "image_dark": "figures/ESMValTool-logo-2-dark.png", + }, +} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] @@ -192,7 +197,7 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = [] +html_static_path = ["figures/ESMValTool-logo-2-dark.png"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied diff --git a/doc/sphinx/source/figures/ESMValTool-logo-2-dark.png b/doc/sphinx/source/figures/ESMValTool-logo-2-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e120b2e7312532dc394057c928c6afbbdff4c118 GIT binary patch literal 42828 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

W!X;J?lxWc0zl0j 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/figures/ESMValTool-logo-2-glow.png b/doc/sphinx/source/figures/ESMValTool-logo-2-glow.png new file mode 100644 index 0000000000000000000000000000000000000000..14aef201eee50b3a5a892afe133b17fc4c5aa25c GIT binary patch literal 77452 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

MC-k@bhuC((-!{($r#{>7!Sz~&7^5iBe zW#y~_mk&PthsfKlSg%QGa*U?;K^!}x5d?1u9V(me7HVR)c^#O~^r{_8z0=yetHhw} zPBe(npkSx;Y1}784ND>e-yPGyE(e95T7;eE?V?% z=L%TFtQy|_02T|9gEQ};$azVL{ZLpBiiQc7(IKStTxIuPeRJ&XRmZpfW53TQun?Dj z_6u+)U#vSLJC{wLpBZ0WqmWGC=o4u^2~jy`np%_Yef?zHQX28pn&)*|tnz8oi(UI! ziJRh0I{9N8qbc0wd&lvIa;ht#;U8ZTdC&Ap;u2 z9f1>~S{5mfMEpLDlPj&RG&R}{5)b|>7pa;C%!2oOh4XEz;1_G2<5PxvJ=LwEai=UGV+2fI!6i|je$px(3UmeU$+yp%wx7SSAakPk@Yx6_o%b)S9 z=5Nr*06$~DzIhA00UE&>JvaRo$Jw(OayuET1MHu^eDWfG6HAK~&0V#=BJNL-ZFi<* z4U&S7gr53*L+ovY3=TCZ2^ph-7w$Ij&MvsUay=i^LLly&Fqsx~+%Q zOY%y;et^w@|GVHc^YHT5$2#TFPJ6g2UfcDr16N2d1^IcU>=2BKDqqkbvsVa$ z-~U2C^w4C1fZI{?Xr;yu0ta1RD-2B8Ht)hyXcR{kno2Z7fZ)+99xIL(xy!$ei?Xbu zC@i1xm3uR`cX%}9T&~7veY)enC@Ir%XysXG)9e(#F?P?b;@kVRm!1JN&A$xEdr8T4v#SAda(SjqhU%SH)F6KX}3qkPiWaUpNh zpQPe$%@E-K@qtsb>QDlFTLR~tK1Y6fr|d*M%fkH{CEpU9voP6y(&gJ*t>50IIp8*& zL=|3=7vO_1d0~+;h6hZ@g*u zu;8a~K~-R1=NWv=PL=)KH9f5oy%NwMhd0?iF|u7MPc2K_zIyDvR}g_eanl-0!1-x- zlFuMlF!SUGuVh}?uZ22OesDVX+(jEI*jlVo5*Sh!je1t!-v+xQm>PilIb;g(X7gq@ zpgTUYQ#i)`eXzlRifp+d7b)R47cu#pyvoD+NWvSEnRS7Q9en;967*7cAugbn5W~^0 zZnVt#TLSg^#@Zpbs=#HGasOiS+}eW!x<03T%>~Z;UV%_!I>z_Gm4cm3JtYrxg<5x11 zf67e%;=M15yJ04<>1JoFSv4^PCs_8*u+r}sH>3kX9sF_kA!~8ZBid*dKs_{Q8E!FP2!Sf#E~QQeFGbF;y};IO@%WZlc@4b z+j^yag39~LP4BhK?PNuTl`j7WbLRB!%W2u2c>`bjk8*hTqB1w8&z#cQjn6e4Xz*6w ztMz>)612e1>&4w}-tXl-@Wb~!tscN;p&PC-YsyjzOIkR`SG zR>kbx8K{c7FA@5pm;!jn+_A{4fusx!a&4Bfw)}rkhjah1{!V#iDat#L!vjQ8)tPAb ztePvY?D7_P(*%}v-fpcoz{5@W)L@4V;8^B;97;hiXH8{#1`ZQj*}A^^{McHeAM`{y zs&}O0H%1x}V~{AsXupRen;bXiOrM;?kEqd3U>HXj zS8g*F)kphIw$Lvj5m{w2s03>$^Lr|80($9lm)r(jAC|F;$6N&i$HlZZGLN`>f5)Ug z*&$ayG8JOpedO9(w|M<&T%hm-K~#KYxj_!^fSmjV*0U^rKh*!!Qkk)>Fe$arQfFT=qHG<$%X>VY9KII5Ps`V8(Az;mW zHz)cWF^ku;`USkr+xGp=Gb_h6^sCz`E6KIV<#FGKso+G!dAHXJ-mm4niH1NaZ%@{} zHFz?B^0#z!n;mP%yOWy((GRD5HK`{vaOtGLPd*tfLx7`Z-u8Z1@MW>0{pNVBQ+IB5 z77JOceiL%Mheg^ZEQM>4*J+~%6P)PJ>u8e>&S~R;Dv|p!AuArto7#4O+_QgihZK#= zcN$Kh>Jb}VwAlAcLJ%_lwA4xb2vz4!PK<0qAY{7x6o(HQEC%8 zx-Fa7bC%s!vL8Ei5M^xhA`V`U4ZU#{T^3V9k3OK;gbYrJ3ln3HzdLYn&ZRzAw{Dwc z@NtJ42gv%~U4ti$D;1_>!na(<=Ef#OSlGF4O+jXqV8RBErH*S?{do7yW?Bj6BfE6@ zT5pWXPW-@Azb3UNQwpTwVR`_Z7Ek8$H02wk?L5hsg-7QZnr4SQ%+hzv(9#xmf+s=c zA*=Tx>SA>2*oiW{gwUGTggA%em)9+9p`Ry572PQPf9TuSlGxy&jx89Y!Jw0Z{A<|> z&(9aQ0@C;6T9SUjp=u;`TXb8PXlyUl2n)>G=I}5qe@wIU5{tlA+`}^Hw-_5>o^ze_Ig|NzDqgcRF9KGNu zdWd<+WrRc)5~Egi{)-{=8HnQY3=IyBxM?&V6c%-U)pb%E>d~3hXYm`S?bOK-KxU$a z>ZZ-xgO$2}*=bl}{3l3%YROb6XlW@`sFbrH@u2fPVTQ`|CxcAUnYYJ7dO`^SdYqQ4 zlKAz7HEc{LuRV+P(l@EhA3-Y4tKEX{7!#oioeW|Roy3bE^;(Jjsm+{pW}gY+Xm}L- z&4`#IyQ9Z<-mls>aOmc@>yQsr`WhpUh?E*h^`%x&x%@kv*mSao;XQ1>;_bV-;F5!) zx*fz{LcZaiKSKW0zLs^#Civs$gv`MH`swp?J{Iq&!d%&*-TpZ8cv{}~F?&VJY;6B? z#6c66lcb~Pzjy&xhv(zE)mF8YUp=zF?$etqW*aC>L`dBdepL^_4pL(Q>>xp0TwJ`S_xdm!1fmh4iR@-0npglqs05$K!(>D9K^BrVteTEOES+n1{s9{6}{8NZGFsv9!J7YhSAFf?iH8KWN!>` zTDbv#)PFeb!RJGVgs2nj+}w3Ef`WoY+1XpgqioE~UuvvoOJ6_=K`0^pgQCnLGt_wy zycZ8t{%o=4j}@36UFT)B0ec;eP!--6_e?L^?DiVEq+!!vM-_cDy08Q4Q2N5JPnQk5 zpCDbo(QUoJzZQ!9lWXUFXjE;yChe*~uV`n1s84;(jF2MNW=rIrTT#gL`KQ10;SR5@ z&5Att{C`TMq8UX#pk&afMd%TJRNJ}5;6EBv^J#NIRZ&pPq5zk#iJHtUUGD}dxxN%U zo@o@xHgZt)dXQ8;cD7eMi~z+`S}o_?uwoSNc2N*$B ztxN|Z0nrI%_h2Xd>m!P;dPPmxWz2R(O*|y>Huv3+4ekHYtN*AflK$nBV)}8n{*<`7 zKZ6shRh?K1YwQsD9UMgOSnj?56TR>2ZLsqd^=$y689@Bf7`_*FG;WIT;PKl7;c8dA z;Aw%%=G#W{j+9@N?r;-hY-C|on7^U{#^E=uJQ!f53&ssPkMi%xA!{CGCUS)&%<4yU z{|h;w-6U9FjZR#8m01s@5Z1o>7mNO_-;eu$EkK#1pH1b@8J|v`;xKMg_WOsf4^`8d zqgH>2cp1;(%bNdK*{}0XdCIMsM9nxLeOXeaf>1*d3J!fP{fm_T4ssC8+{$B{TAO6k zNPBkM_WG>Sw7h~kp!1cgEz!6K;=QF8he(=&5hdV$b94+Msz$rRNzU+4ZlGgB5MAJ` z{RG5WEEBrF4q3Nod|IVkzg_S8U9#(T8AU0JiY|Din09n@H1a3oIZn~lkZgNi7Dj)m z)_M_gsir{7%v`q-gLLPEl&*s|PG4lENfkZd2o5;Yf*1Ydf}__B@=09R!^6XZJ}Mog z@9xlIMfu>GLDN4SEv>XxvrEN!@?pxjR2f*YpzleQkZ4Qf@7nZ9aQNTfwp`qDuXo1S zw#Zd7;<}Ut3J5cEluJYm+>z0=#v?OTK;sFL^}?+6g8eviiLGr#amjx_CRVdk<5==s z&5T>f`8GJTV&n4G~7$WZl>p-h#WSehZ$Ui=w2qs_`I4yKX)zhIjBsq zqh-Nq=>2SZU3sr}NJn2d0KT!kk=^SZ%*x$$p3em%=G)~@-ZE^b(f8@lLe!MDfTu=_Ox;8fWyOBTnQ|I3N!K-Cw{>F7memmY*0(& z(dn`|u*$Atw<$U4O)@Lu)z;S5z2+uCKh_7R)0T|t7PYsA-OwSJ4Z|roavwxO<%G%r zmb<^8A=LBk%%JbhegUvpFL1nobGUGFQj)tL2BwedWCeD6-Nh?&Ejmv^zol44#17cA z^OlipftK~2XOyGVc4IJ|=2KjX_Z>FvMo zr%e`qe%R1{7>K0G+2m?5pJ?bl^#m-h*63Un&N}=D``?)s=n`#&4nq8tUQPN*z7T^n z=E|>nS-!T8w@rBGdnM`oJE#_)pqBk(p z|4L*P!_W2G7Z7I-&9bVH$V)8BsVs1q_=hbyWbw`S!_zxW4=aJY1s7U$^{$%p^Cjt? z9+|e{ZvyJOzkRZY2m5y1&W}nqstTDdHl{;#n7CHNi8#MuKvOssQRDfcw6_r$lm8o% zQI|kM)c<^>tHxQqL1EWyqPnqIbN(A^^JG5WAP(H)B(n36lHw>h-rmw zVt)}h@4gvM;$D541N~EB1l%@pGC7s(J$i_1h$?B;J zhVN4W>3DE0nVg&q2KiOXVAun0>xC(s!5CVTeCI{2F+YuVj5udHz<1bm@)ua@&m+T{ zw*P8}vG3H!c)VCb#7O<>Ki|k00qH@<6~V4we7_rM8if{F{adXWA43VGLPjL-HmpJd zjI~OBVj|kj7{ozCf+kS}Ys88%rAA%PEzRNdXh&60$FA)C3gyrUo4J_Ra#_BrV&Or$ zw?1GCAatE6IO&yK@iz#ZTKwm~74mc_riZ`k`CuFH%*?p6e!e+%uETUYL&)Uph(_%m z+a)X9rmrBUklm2=qyA|iui>d6kN4g5Smi-yIr4u6%^VluA`*-Hi}f_TZkm<^tJC2M5+O-mrleo!Gp z(AY#&dMdYxDVb=J90I>Re$1N1Xq_gHO87J@eUc`;a^!ZeL9pKNO#2zkwQVnk$r5BH zu_9l(QBSmcx>lYDCQ)0KvLQ-V>UD8*kp#*Z|Kz+jmW4bu3js~S!>;`d zd43Azh}jZ}g<-eGaU@f5?#;hM<{V(y6fRGFO|Kv&MYGuGbQm-cO>L`Qpo)W9`~gUO6KvY^9$>f}oS6=7X;Miq}Mn$Hs5gHv66BStYl=4pz9V&hxQTfKe zoQ2}E@2F- zKHXG}iStT`0lV7~M6QCAQ$MI*{kC%lC zRvR%0&wKJv2kaKxNl+T@@1Z>f+z@@-adqP_X1)F5zqa|y`9!58 zT1`!KUos}>_LlmVx2m4m{%O3IO(Ry5@T4i1Ire6I$+NV7;d6CQ{UN(I8Vh^=XSHV2 zzDr4D`2LsB0N9H80%PtuAONj(3y>0rQ*X3#CCDlC3TPxu*o0L66!}*f3!ItPXb~Cx z3IYgCj`ZYVm=1#R9RknICMNT~NOIn!gKs0VJ;=6er6`#B;gx-rqAjs3gf>3X!|txN zZ3MXwis4kjrt!zd{CpZdUfu>Kw6jla-W@Ba`k(#_7V>x?JOqhb_4*IrLAHJZG`7E$ zztbElU)aqFLz#Aub0EvK{04+Cn{7sStn{bvK@(*%LLMC22-U z)vNMfo|pqJ+JG(@7jh)Y_!T*~rUKuWeA#ESgJON*^T>~)j{lv!pCMR~SY9hvo2zHb zNZ!R`-S@{Gq6`i#RF^>p(w15jqw%6e^cJ6Ga!7=1)^%m&;LMN_fh}Ue4k!`JBGrsZ zpDhSN7+)}_M$FvLF_^w2^^>}Q7#^(wzWT{(Bpdox%cw_gu^&l2G>;32r8my|0~Tda zD-TqEM_%*1!?Z^_7?T$VPpVtC>Utcu`8gPkVq!9rUlU5h_`VM7;US(ln;o{pbd!5Z zN>4$L95yS}_lf-#QWj|r(}DkcTL>jWQj)>NRp!LGdPqfcT0FrxQHYE7D0AJFXQU%5 zq?79~4;6P7TI=;s@GnV`*BAmULgWS1#5l$&W9{sq!eW--eq-5#bbmIHX;nkmFdH7K z0=#N706ojFh{6V=TA(U{+U(q*qpV{b^6`iKjEEzC9P7`22;rve-_<)fIMjm;xDy_`soXml5m9b)6{rHjYgYdtwIX$=`gmUy6ck^^^^dwJXU%5T zW3M_Xt~Gz_Cy}dc?ta5wXcsCZ@&iiBr)^hQ)Gub$^wbW$;mNNH57|AR@A6? zENe6{9@0s#GtR_?h(QX$O`U(_p=R4j zFEJ;VP0P59GhNaJDgSV9~sBYM8Gj%0|cBW|3VV|LRSX5PUn{Mjhil31F>{s-5Qh6_yZJH9s>zByeb;WzykuW#MN0eq0L5UX5^K5xAL`xO+@?7YTB)^rRh%*1FM~Rxu)icH^a%65uLreQ7LCC}H zs3&>zYJU>mk7Ac&UGt8#SLp+EAOXm&vj+N45D?n7T>m})L!BBZFDK{7hViRnfV2|h zjApgmKx|P8LE!1Ei&Cp(ChVcL?Z&EizQ*2K#{@Y0Y@)~YeU4OCE+o$z&0RIJQ^Tsk zM9Ej)S)HVYXgcO$Ld{&)PLd@$OzJl!wgk z$0$pGlQVHGY;Jxju<|oel9y&=k>Ycka6%$ZZE`%5%nwsmUepH+&Eb#hYjL(V$pp9s z-4*3i^ZEfmi?+bmts3nn5@VPygH!G2M5_^hM*11{ZCR=tKe~-Vy~?$ z$(

*p^5O=A-0HFo_EJvf-b>>a0C{h2Xo^Rw40eIpYTk{Z-04O(Egug*{Qmee#ZXOGWT4{4#VzU#Ax16G7?lBb^D5BgfMR9RW%OkBNc1#WveIB?pO&Xv!w5U-v;A zPH|dwYugS)t4|V&(@`c$jE-yzsfV`02CT9u&wbmw?5f||;=1vS_M_7Tzq30{+~YLM zDV|{ql`8Lu{aF(GA`Of$Xx4sqj>M$x!(Sw@-$!&I{Fxhi@IZP1$Z5 ziZjMRnJ72XgD}DAVaZWRa@`(AHCv=|38TxXru2=`OGLgSW69mhI`Xi*R}$UN3BQDg zSk^X(nabgtX5JhfOwyHaW`KrQ?a>r396tg;TgjDrj83e$bSL+j^udk(w&g>=U_#fj z;FqJBbD3UyG@ep5b8pSZJRZv>s@0K1k{VGOSCu7deYZU){6jc?3{Z>Cv7kd~oYth87upom&NV0jVZ@&HmMLV_w z=Gn1Kj#`+8(e7MIIk({Aa@rG+l9S7p$YRAS+G*cDy*hJ8$(ChD`-DOx+|8g9-l1Q< z3I+~@jS4+7Fu31zqA*{*fVv#ZtgI|r7}|3TqbC`S4~4tos9WgLz@N{4Xr$|J=;h+g z;p{1*5qC6Mqo_45FS=m&oN(5(TA%!m$1_4$%Z}mm2_S_T6nON+;NapoK#tLaiNw`GK{GU$ zv}433dkv^v!^R7AsC2T2va52s*Xs|Zw^{j$4WRC$B=mC8%r`kRr$t3cY5$ykRK+Yv zK69V)(?aaYpm_)Q9)%@-EE9-0ebC%}KN8R#;VK<^=F8O+vHj=AO<4`Xcg&W5d#{dD zm}2s=DN;D?XJ0q{r-)7e1g9$2`zZ_Iea+v|y3aC(A;kQI1wA#ipG{S!^_h(91OB?D z>*rA!+EY^Ty}b+A%$A?bJ<^XKTG}=1M+6VcylBx&axVTZ@TjHwMC4X^5^ngx-m_R0 z9%#cz9-u& zVT|Uy(Lort*)u}s?=G-)Xg1iddrCd2Z@-_g?9lLP#jnSx0(E-qwIWA`MU(t1!K-0^ z*rt!S?j7I|>tL0l1BA1OD4v1uqTh!b1*si+=7(RS07iS4v-WUvygzMGEnC0pe` z(k#=g;~EqA$5%UOu+ZYI?nZi(j%^-Na#sW{-?#q;tWTF3E+1V0JT~J%l~0j(37;L; zM~|WZvMg>@#ujJ9JdifdJQ?7L(09kz&4HEZgBPgR*^dN}A?u)Wus7U#p&F@?PKE4e z1`kYnyt1W1&`r2(WsC@44 zb7QQ^AHIuafnh&Xb8U}04#u3;Y zLiiN%=Y;aKu?%{x0-O_165+%tLn|#+^?|KzsO4}So)H$-#23jUW;Q;k=>&!$21xE- zhG=rQ0xODX<+%TYo-zRjX>(4jNXr%KWD`8YO%Ef0io1rel1cv=az}Z~_(ne2z# zzXV?on#+vg$J${F-JTz=XQA3JPp_Q|OfKa+Bnck6DV`iWVlV^MZya7NSrKczH+K;k zxdj=h2fG{?eYgGZd&F~M*RSDj7Z+}Mvtg0gtWsKh^pVeWN<%i%v3cg~TyZ|tI>6A* z^ix7~pm~ZQzW&M|r`0{B(Pew`?%1nSjvNM}sAdtjq-97Y7V@~%>~$F9kE0&^4#n0XN^`Mq z+OBH$;Dd1TkSh@>Uo@(fLW{=n)nmOo+b$mHaQIn}RL8QxB5+5+Kxrq)c0OW>Q2C?T)Pj5xdQ2{eT1n&-Q#R45O2@ zuw}I^S}G7er2m^;|1cNm82nS)#Cywa)3{2tQjB^m+UYdAhdM{t=2Zp>cpG^A%e|PM zT&p0yPMeLJ7Yzlz*0~NeIg|z>=_yE+*<@k?gf@${)`wEx(!q273p>b($2A&5+_x!0E*{NmtT7}9}(0SgDJXE3KQIsyFChy5A4`$*M{JT~a> zKm!fv>3X``3|C3w3(w5_q#_|9QC?ni^@-j4kP!d-yGmoW1Wypo`461B7`uqhmYrAO zqD2!~Avj$4TTde-V0fQp!}s~h^7Anm1hlJVyRLVA^X|^@B2GpkTsf+}5WSC(TGS^C zd>|Itr(Nyq*F#H7%PHb;NxE2>XSbFWd@L-ZZ62of6Y6&&2!WJl7x+Ks|FrP0qy9pG z5C(3CFnt}}qQ`%do@1BQ4{`peO@L#hO6fytXIiEC6^!Y4hZ5{2;Vla+nYSW}r_FYUwJ)i0F)N+J%JoHQx85=(N;wY*k7NQ>yOlN96= zsab7b;$UWC%T0W+DN&`mqm{J&mXzJyB)ggQca=t#Q~I)RaDnfggNX>)Vi{$<%NaGf zrcf5g(0j(~XqtO<#^3k`?n#67p~}3@O^f75G2y2ga=9LOvQTSj&R;RY5d45O2Oxk3 zpH3Gla~Eq#O^Ee=bJ!-c)9a*)Uzh&d^M68{ll(d*wsR#e$6?T!6VM8E_?ueIMq~KK z@sIc9wLe=>TgUfplLES1h~WTaobq*7+?Uo8-_?WB*m`S`Di^G4!^p@@h`aL2q{&wy zt7Y|?|FpLkb5F3?+eODP!JDM!cX$5K&M2d}wkdd<=!8jqnu#I@1@Q5Xsf-UDpWpMM zTw}oO@2C5WP}>P6tG!qsEdMPFshChmooRFs!b5OvER^zOkc=5E(XQjlS{XXM$2z6u zHTs0fyvYl5)Vd8E#VB9illnAtSSFmwfM4DLsG>Ok=dV?pA`Bwv18=c0e9k9J*?q+B z#V(+9N)im58(|xZLS+pohS1()_DVH)BCOLGk&5FZ!rqa1-iaPzWl#Xwfpb~>!Y|VjEv|Vnj5#y<4oS>nhVPWMh5}VW}2%z%iAmFiEQ_8LWNLXb$ z%q9ftI6I6ZIDkCzrM3|7o*i@Ji#{-<4cVAYv)tL)lLA7taUu^rmf+on2gW1>A#a8e z@lV_y&11Eh4u5?1f6xG3E^uHOw%(sE`l@ug(h^>zN=Kyfa6IRF4K68S?DE&;u$n2R zqoWHlgIAl@!vO+{|6>P^=h;JG(%-|1x`CkvTON-$l&6bz%x<9hJ~6-z+xd8blf`^2 zJrT5Zeg#8)ujOQ91~uV(vEtuf(?hUgCW3~>|7^*m+~T|g#G-^7S)k;bzcFj&QmTyW zB49`rNU(KhY=pkhoqkyWhIdEdI9Kr|r?X0^KW{*rP)L|(?Ae4XpE-(m${AhyX}GIpu>SkMejksPPVG6 zu?kyNBqG%adZ+|csgM_$I2WdLIKX^cKEIB9E^4{5uS}Tq_2!{H-iwdhhW!y zzk_@&H(%MlK36$qT-&J9SqJ0g|DYuCNj95Wj4C=UU|x7Le1P`0zrB;;x#up%y^J^6 zHmobkefTD+W+_b4teLr~PO%0%8%@b2?%&mKTHgb;bhO>5hQHs%Upp}z&&dXe@i)7; zJ^j{-6MI@jkNx8)S7Znca7n_s<}9LD?gvXWU}2UxROR>(E|6sq3}WrepZ6HM4Ar3$ zD7@;0E|;D2!+cYqjzzL=a2z;JD2lbIOPR9*XxqlN_`Xcv?V-U@&u8r6PmgY2?Em7e z)w`;BnRGhU_diW<7WDd2qODPi0MTu#rGe|cq@=82VW&F!Lh$Ge9_IY*p}5<|rQO&8 zV{b4AZ(9!<0u-8p03ACLJbCd2@Y`xCZZtS!;ZCNAx;2WhI84g?Z8_=qQvTwP`Z z^J11xmYdQdq$u1>pK{n|wy+_;WGtpl;C)2n(yQz1d3HXNrdM=#6qRCs|5^ALAk;%XkY?$xj8xa1Gph zF!o_VKADHrkWEVJLh>WfGXH(X>#PI8V3S#%3X6!te5@=abX3f*we9GmwZpLqHD`a;OQ=iB4$B}JMT|W9?qMk337rT!9ym8t^Xks)Y>iMmHzk_ z@Qwftjfk(>kM%!+7a#KMNm*H7mK}b0&7pwXv&K>_YsmxzhqiA|maPoe zXrD8F6IX_k2)}5IrV56i3zQi=@}jj1$yluCxL}k{x$4QI>SF_%yCW&5P!JP$$pxLO zVg}hPB&i0Of{;gzMK-v*vnqQgYwFOou1L3`gd$3%LCW6L3&*zho(Eo0N{DbVpqrZ( zvn@^vFzBd?#yt5iqhVIcVlpn~gxhQx8%23D4Ybe8j48juYL{#so_&XQR{qo>?V&=F zt?p1IsAOAr7>;Rbu+>?0+Be~)kWX54iAn3{=;hxO?9s_>byd@^ zPEs+Q*3{{)F{}hfDS)2RE28J&l3_XE{loplZ5bj1)BNiT-2IN+C-8Ku&pOzE2bztp zCLR%L?V9-jY6B&@O?Bx!{tr_sP_p=&ijr@JzT~r-jSvccT%Bqe&jMvnFW}*J!WGBG zCxN2T00`kR=t0T>489u#gB3Fk2)Mr2=kqzf72c6V&Z5V$3^9ICY*L{QYL+B7Ha1i- zmKPb7^q%ffbE+}pG+XDPzW*qoZ@I zXB}BAZS}?)1P!de7HhnpdFM7Nc*}#!{B21;r8$M)*;0ulz0}}v7Q6lEKaXI}NyfUR zD1K1=LeNQ64!U$cfKi8LEcg^i@2GuYQNB^bC|b`~QdWVNs<>_E@hf`d_Jyik*# z-b24E0DJG!)krbMKw;L!oAkF)KHEyy9E{NoZv)52N!zyPo2@uKPggTjQ`3$feaol+ zBoXIq5h_Bh=zwcbvCsbx{N$S;%E?^dJ|aotk^Kw~wT*&zYre;+E*pOY!In*V>bKL8 zIF`GrUcu!{Rd}z~oWMbqh27bjC^2C9yf}>%@sC2#8Aur!y!+%?ib6$rN(^$oX zf7*`hjo2o7k_uX@a)WIOs1&#+^VeUCcKStMCPwLT`EH^*Ow33}mwP-18+LrwIvKI0 zbPyI@g^5)Mrx)n@qhS81e%|osnAYW7M!nT2o0PB4uCu1ZfaYP2K)Jsz5Pw*R(l~H} zNqZ6d!!Rs96q7_;{;S+2>T+^+xZ4ExKT{JEG|96Dwp(y<89qmKtxN!KI8gL;b^ih$ zBGMkbgoU#e{rVv~j`}#RzhMdo?jq@<+L_Bfclm5Yf`bHpO-+SzUm!*S(`BisGU z(Tc8F`q86>Hi}3D8`S|kfFx(2N3i?81Y^0z9SWPncBR>IrP(#<;r4Vj+ok)o?e*JF zkP59k0Vlz|`6@GXVUGvLk5wW303Pg`1Xav+oPi)VDj+kO%!@TML%?Akv6KrIgd_=xi4muZpktD7lffZ?!wdbR%ELMRP3^_FWEehK$eQZjwXcB{pFWoF z<%2s>Xq%YmX%iEqF4wKxxFEp=Mntpc^wcmsuFazP+u}%8bV%*{!UkjP(dZbFO3TWI zrVI^Ca<4@QRWCIchg{{4io$6G~3s)`T<@r!k+gB9!;zKYla;vLvI=Q^sr{KsI13LQQbxTI|=GQANd2O@5 zeKezL3C7%w&8hx{$HGCU{;JSRKTipbW=of;Sl||tD>y#t5VRRUDUs~8Vu={Y$jFR? zUwdm3pHpE;!7d{`J^84>rQEL~^^$;AP%oYZVx7u!d^&v)eO#b|fv2gUQfdHCb)dqi zuagR5Y-~IQqMxVcU_fYR04#$}eK}ZMB3MnCYcia7o@#9+!w984UY~EfYW;p~MM@$s zR$Hii-0uZjQA3Q0_gk1TfiQ-}x}2kz;Hhk&7M_3tl~B4?$+)Y|-j8ThUgl_oJP{uT zLf_6fzvk+y{yy%HcoqQP{e+w43``qes7?aiw%0@I9BswLAt89InO$Iwb=QjqLZOvf zpt4m}RXN;2CSMW+Sxe?m?d6-66{zIm#|}V`OGD4TqlEuQD05?hqgcMvB6uKxK?D<^ zR5-GVjfs)cbFL zW6ysk*-qhU*k)gH;70!bjeN}gZWhE7`JvvnjMmYkz}?B7A=KuZ*E_Fs{as&OZ!%W6 zt#y8;rIP}^w&iAVL#jWF5b87xuR2BoDS3E>RH54@oaqe&z>$x1cQ@d4^uX#6;Bb6_ z2Au>^c_gD}!mdN;L8wmr?)ylQ@fv^VV9L`JCf z4=IZVpCm0JH0X9E`tU0!J6i(>+5Z-79#K(z)JwD|SHX8vJ5V#X1Q6$J_Zc9&X_JQ~ z)oXAtF|EI(qN18e0xgB<-^!dpT8)$ev|4DGBSS&rl!HhCR{IP9;{NtD%YiE(YLa<> zEw>tcPN42~Pf~kmcaeb>G_t!;UbKgX`34XxvL@w(EMuoh| zZV}ZlzyJfmlO;Iiuzn=Z7Yi1ajjZARtRShf=%m$NrI4!1h3lBT>SNaUFr3{nTy z7Ez!c13&s21SnOZK>YAUA>wOq+LX6^&2y!6xsii$-z`X5mrf@yU^(kL|zX znZU3bukG=vjb#wwuAjLsV3>3iQiT zen;H^53%kCEG!imK)2D+9*mr;=^%=Xi^DxaDsICD`V9rFF_zo$Sy@>R@>1OjFTlwH zHL1J;6g&R}g#!#`x5V%MqGBpvP~kw{409|XYEWK!3(A~DK)mz^sp(UyD2#`f*vK-P zVQtx)^9G*wmhXR8d9j%;Il@F3R%m3V{kj;)SoM4?c?wVL0%JMLCM|2azPTUQ z*ivFj)0?LA(d6X3tLS@!lehr9kl^tyi^lm(raNP7~418C%x9&sT^XFpUY1`1n#=kY%AmUP7o`DtNW_o;# zk7;sIOHxVAgi5d2qw=qv`X5M#Q21ESx1-ui%9EU3#3j~}pg%3}iWc5e*}6fbMzeED zhvrMS57!7m$U}$`bEIPSovl+M)94y)8WmG^w|8QgWqk^Jqar&o;)y>#tM0Y%Lu=J^ zpx?eX8CS*c7pC{|7kn3@Ns|%t;T!$l#}BZ?randNkSp+>-mQRlcLOw==P>IwRzJ7B zKHKW5lvTK0Ti%1ypKUU??Mj*0Z?t8UaU4_tI;XmrmGlgnNaRy3iPd=Ke>kMI2v3Wv zFX}g7i^Ofa*9019roW`{aTb8cs7)_bvLV#6H^$j~G89G6!E_P7MB_`oQWhG5mx8Qp zQBQ;XpAr1Na1!)dzeyH}%}jQ0u>bRiqCEuzff&4=?sQP zXamL~{|L)+VqU1c_dsYz4Gs{~`cwm?_x@=q(Qb88Oa$p5qwHrZ+fysan1Ua@+Rj}_rJ9)8vejzzN*7y>7*;8<08&cQf>?9Z)~6h z9eN~r}kjHv`nIt21JELAGj2+c(f1jAx+&>2f%OMGa7@Q$I9(Fy~ zrwR!)paFxOD;TPp+KMo94>R{raR@F6!7z0xD0@%Y%ZuW*Y3F*{cfYDbupxE7Fvgj)_Lbpa+)<4pG*%w4u z=t{8D&J}NbDL3c}%WOTh*AU%fn@#x;W>7D$)7qo)h;mkJ4Nlr`W*E8+Wjv}e{UO2)Lb zaQSxHdH|V(s8Bf4uJe)s*ZUshCf8>AZ^WdOIXK25_jEY*9fWLvRIdx*4`~laR*dYJ zf0<6|_1mea&aU>kI{j5J$%)nK5=Pu}9c_!${uNrI9;!9J_~fT(jXFBv`pX^yKJtrJ z-k;Z067ty?CG~ax5bkJ%ro#MTo1V)w;t11gzV8tLPcu0rjwxY5! zt7kFiY4B+5(ZJ?Q(|hIRZ(<^ICvY+U9dVrsp34W7wL`3iSwIm^gp9Xyo6RYL13C0Q z^z2tYq=un~?ZMZN@aWY>oo&WWZaF3n3?;?Ir1QM&AL*;ThNdx+!Hd*XpjHQw)!fJ_8ZUe6~N4eupz zF^JaGt>d;Cq>Z zPymJ(33irR!|8(=OXcFw{cq|@Fq%s({}kyL?P(E;;gK#*pM3y7m{D)r6NGcz`9J!m z2F>1=+YFfNKheH?llF#fX}KR12HYYC+xBRxZb4RlWyFPJ0GatkT8&| z@SzUTSZe}z8+eBczqpviG3h$s&y|_DH$-`-rjKL4YoE%MC%6S;eS#2B@$8mCD3V`- z?GyM0AD4m$lo^CKhZ7^2+Di-|*Mj)MvIOBKn4%i{M?*_vy`ix&|9BfejTu;Kxun`z&L zRI8-ZPPM-7uKXBN!SudydVk?tXvB=4dN1;yUR&LH@pp`+{cDI8dG9`NyyaIbph^BI zg&S}@h>#=lCdU*Ba4)5&3cjTdSfZTm{IXqZIx2Hc#?I7z)pT=RK%%!3p7yT_qE*^(PbVij6ToWik>%^K7k1|d< zhb;2h(Xo0njQ=E`7!1_~5n|`OGL4E)n}*9>Z(qPJ$dY7mkdbwuk9(-}x|KeV_mc@m zb1#8tK-ae_P>{#@@1oSOEvVtRb}{TtkJ-`a0Gun zg=;WlG@kHe0W8MpEh>2mW_Z5ph$6l50p(e58ctf;eN>H4QdruZaFT$b(jhc341UKE z(TRx*T+Ga6qMF=By{MB};X)tZvg(gel?NgE0>C_oRO7PV8%^aaQQOV3hRp?zOm z{15bKeEKkXGMN|dwchD3OhHK*Tka$XwT36|oW$-2HC6S)43Hw?b=W!q%{UKWp4Sro zZ0|jJ{BsJdNCUXO=#U)e>nRAbt-X~_FpNySf2Cp)2&=m7A?|b;m|Kzd!`nIYz zpBn%J92{$udtEOtf~3bc`II2{!O}!`Fc4iURMHYypq$tHsqD3#|KfOeVE)$Wsf;}& zN>Am9;;j5wX0<2pvRga^-1U<*EQgF7G{7{JRa>SogKJG3t1MSsgJV3s&#z-f27w+F;%Cqw$27^K;1GB8r4zK5*ZI6A1k%gsms$UA;zGm;<>D2Z;;37JNF2rnwcnHo18pTjJ0D<0W{R2?DMb+r2G{W2y~TLH z1>e+461!%PyVFop|4w2zQy>w=@L_D5z-Sve$^G&4{QIYffZv3jQ3nD6gZvh}nQnPPX3hi1F!}#}~+K_iVt^tu7ZpJ1h{0nq0?#1SM z`-s@^sNwf0n2$_LX6Ps6gxN5M51&m>5#-?UNgs_m@a#)tr9B0U#r1tIE$7Dx5xRR4 z%+WUy7RXq8jHTpQT`xVUbD2H+Z|2LGRd>NFFjC*zqTjK{W5FCJcOkaC>O$<|az)pm z#MhO-Cag4c2mNXDu;bev2JG5U?8d0s#eX7N7F^@{`*AW=ckb=tR?n|2UX9vfIh7Aw zKco3(B8<1|SG#5GRmG|}uo!0#skA64)bD;tTckjrxIEjWvj2we+hyo4i%N0JPr!i2 zq>#&a(G2>G5Fc?L2~{+7JrAG0=Wvrl;RlOI#s#n81y_#WUMF`?45K&?Hcy*xn?nXc z4E9AIj28ZAvOkh4xCpx5y=Tad5;HO!1m&dxX*s!K2@kW7Xn>A4>{0==rmEI&f>0;r zz{rTrD7M_k?z=iifYq~2PY6sVF87EA*){bqZ$vCBM$FL6{IGrU7-+~YXM4+`ho7qR zYa*2CLScn3gN2xZ9b_LlQMt?c21VK^wOM-|qdWW{h;-G|Eq2Yarm&gFw5rlwi#Qgf zh`Q9Z20>ZfgYRAx`LGrEv&`JD_UutJhq%qpVlY1o_+hxMP~VO0u#&n!L%_|sr>_+t zs_UskunThz3k-rRMDA~+K;OgmPFM!uh8?0Sj%Z)GyE3K)`);5MuzXW=TzVrABNE(H z*sXt_E>Ou!{QVIH%umf3d6e<^(y7_x0RM88?gN`Q+XD^!2ZxS&2BqC)*88^*I*?1L zU5+?DMXE-II(vD?!b4cd7K(c_9A)YHC_*Z%5B4dc<*7X^;52S!f1~*iF;5P5D?kd1 z$dme+DPwI8`Vq;0^vl|{JqrzN;fRt_!5t>eRt7Pw%|vJQaq#jBw{1S=GtS6Ago#52aSkzD=&oZ zjlXv(J~uNA=4}ZQ!ilyHb;LE|;)`})hRZNgDJikd9h+W&S})d+w5z&A_I@Qk|14!7 zQ0dAk(b%wF1pV3f2ABI+7Cgjs7*bIOMYD0Zdw2Mrb8xiaffyEjc;57dy}Tucc9+i7 z^_!6Ijtzv#shkZ%&pM zE5UZ){-1`T?)qix0g(R5yeEU94gY(`w@m6g>m*wT>h3-n2upU)z@V6GpI(>Nl znoh1Cp6^t>QfGCGX^3Q?!VghOoV7eyA<=HYN5niNIPVD|E@yAQ_WRmR1)F%^fH;Oo zll#SY`&Q*s4K9jozg3MoQT;dEViifMTX>DZi#Nf;kAP*WxFiH<921P4EFy?toV|&IXA-EA}6uf zr2lpf5cEy1cjyv2ZPC*`KuaC;Y3t*OTiPi16WDR19{zltZF|AF26JRSf+Q$|To}zq z0Mda*3J**yEiIMzt_Qv+*I`Te*EeEfLJ9_{qQ=VPc!1GA$e;{lx-w%kj#;nt4Jesu z1X*yKK+5 z^H|l>j=$9!#I9f3cA#wql{V$b7ocOcNM2SJh3apzdGUp5*YJrjy2!tFZ=k`;oji3ejX7fR1d;`uj1K{HQ=qpLAE{LJI` z$MWS#JP z9(N#2&^--US|UPg?}p(ELASdz^(Bg)sNgy_=}LBG>FrHa7#v8@?-zimhckr)z|!5y zTnBMlvx8ctuQ?kaZLS+gr!?lRZBi8FE|KFy_~ZDA$nI`GIrhGIxaAL?6CKSOlP>$H0Y7n zBj0J~?}9!tRe}B_X zu@y<_tD@~+@mrO$9fPL^WEV?Fk`%?-gOEN~x_DDogm?bFpT6(e4agxJB);HBFFr#0z-BQ7a8uY>1V@vGE)?o{ zk_*|G&c_>Rrs3R7iRtNzE}#FD^r*D1KcZik4`3$`0tBMr_qor^&CLbdOp&2K#b5E> zHr$9K=PMNb6s7fE4vzdz0PH%>=+M0)@!mckn1_DO0JpT+q({pbuP0;t0+XJO4$05! zpCCwzbwg36#u3I5qr16l?qxxZwsc#W$1=zJ88<_d|tKxlFF zy6Fl<_lfQ+#LeIgLLIp-LxM{bnfGOJUA6ug?$%1 zD!aR$nxl7jw@&YPxaodz8$k0z#SI!Uq;LKC#`8d4U?qC-kz&xx!p(uaMj~J3BIL_v zYvf?)aN>5(0VYj=_PE@?EvSc9F;Ye`8Ncb{C%*|Vp?Q;q1-|iAyF-FF$2P8<7g!6X zAo@*4lT*))1FDc+4{R1chMcX^v#-;uUqxZ#o-(`*|&EUxNUg)v0nKJBk;^ z=Zis$QGX5Y{(eH-af@r<e9uTD}x~ z1#(6j#g`uI`&)12m`_qz-Uz{80aqEJz$UOx3aNbU=VfMoDuK%?_ysxgEv7%V;Wa%5 z8(!TDCWRPL%0Ci7U~xi+L_N2){h0~=?$(c_^6NFBS{y&CL58QX(**hZx3fq}N^+g( zYiO9s1&pi>rnK&drsHU#Af5mwspWe-ebC0#Egfuu4voAva4`p1X5O9t!wpB4v(OK5 zmRNl)#`MJ!EtEljx0Mp!hRHyTB&XLx0$;M?H+I1GSrikcj*E2L7R&iTQHPhSjA49K z6R-+ApoCL}B_#@d(}I}S=l|8btuaWsfa$Adoa|^_y~9pLC9-%u4*|bKWF9g8dS$kB z*n#v{nJ_qin2A3ORUJ7s2twTw4;&fNv;2j_)Rgf!q4N%vON960rWq#@c|!tI!bb)z zc~q13$fc(p;DR-$ygR*ZgmRd}S){*y&W1XHT&FUD0`Uih!u6}=%m?9R^ zGj=zTQ^Ijj+PX;pk?3|!jFevFW73E{`jsjAv@r5SO5ggoMn=x7+cpa#>k|~S@!uyy z0#1#N`|f6A%Rjb|w(5P{c4=+}tYLS&h&&<-yLdI|imyh56hRL4Kz~D~3-`nzV+uAw z6CAL#AV1@g*^j?}|605ZI}_I}*9pJczQ+BYX{K8y2-bm#jY%XXC2^7?+hQW235#GO zmo~-3#B@K*^=7PyFhAR!IhvT5_zdQ_tQK?4AcjdB{`-u}YBx_D#d{LzP?4Ev2^7HH z9C4uJ+;($jJ!F|;doqG+?*LkHr4Mya05Bl=zLMPobwPKN&Cd9z7x^wrUmg>z(VnCy zItl*TKlNn_w=SKq7ZLx6t@`Q+*-;fqEN4Fxy9IM6|EH}{+Go67W1QTc>YujrvFU~y z&)%0?FX{S0C`kO$Lfyju2kyTSqCEl z3Vb$UFMUa4J#U9TKDIuFE!!SFw_e&e<(u2Z*>PfksqN!$C#fFKLs0iU51+Nm9S^pN z{n^LmUk#cT4ubI=JjEuA%s_@nOxe{_mW-4U44RVti^F_%tS{Tth_^R4B3Fa9@g|=8 zeojiE+riY$vFy^kG|13m4|T(U8pw15jZ}E2CxR2h$p%eFZ1Z|d$ zxga;0nC6o*ZH_nK2J1#M)YH>L7jH`7JAOD#tLhFKh8h(ka6Kafs;KT)-1f1ePNt8LN;(? zL_~@P$q-;v#d?IxF%sS)JVoi0MFE8y32$Av2pt*Fo6OB% z`+IbeXF;d8>UrtIclF)8^Ok9@CxHT;lv&|TDyaz3b&OY+&WXRY>NQS}#3v-^kvhM> z;K^4kLmxNT^NUSQLu+x})()r%lvhj8{JDxX^7S){3<+vJI=m@_-WCf)5Y=-fD1rbs z_csuzG9>SAJQ}AsS3mUj%3XoC|J^$mpY-XM=~Sz&h9UvV*kC?>6rw2R!~~r1Ok3y> z6fk&HC%@X>xKJ_3nR(!OA%C)DV=tZ{u!Irc%L1$5X5DMBpD07a4SkjCQ}Xfy6)oU8 zYkH0JwYZ*R)AddZ1%VYQ+;BA52GC+zz_0HWAb#7knr_(Id;Il?K#-40K-|8k+n(*f zBVrzH0Q3xT#tUk(*S{|Vf&yZ*u~DH`Bict)zy7>Nvn(CA^<_*83$|ahssG1<+l4kM z14)A>;yhj-oi*OOq=MP2?TJNtsBFRE+oAL4x#tsIP#pud!A7aX3$nu{aSDA&ycVZo z9O))Jcd5q?=(_Qphe{z8W_*&PA5eyP=udO{iKCBbR<1q=*BJ-gB*cBTr;u6I=iUOB z=;6axiNwzbYT5bWC0l=@!|%j$Sd6+FE|KN2ACTfQCXIoD?B;plV1tC-rp(3) zWFHEt;jhtV4+q%xKW!4GcVIsfx|7-9(jE1rQdK`O>N?ysD?##8V8S z$-4`wnZuir4(5WCd%HQ916aPOKd#H{QOR&-NtGSa)$@8*|Ei;M3G>qLZr0<^GK;ld zw7K@=6TC#=JHwc%T_+bs2{53jAA3Z*?(WNZwIL3?Mj(&vCpCJzf0cJK2$vq*;?lkf zmK1(IluIMJtQTd#-|}-oMIv|sE3V-p?@MwVyj&(+MuYo>L16n_ik^l___v8E%H64^ zSbW(mkI8h-&Puf0yH^KoJw;{5=OB=otTL>E1WVLFDnMbRfuYi9d=6>BddC)7wOUs3 zfUIxA^B=?Kcb}{3yngCvTyl`h%SdBHV^qK!G@fE%qR1xx>BwH9+nTo`V$D!eqz}H9 z#K&h)d3-*8?muvS`Hn~N87_m%ohI$3R&BSe1W#SBuCfryJCRM34qy2NzIZyR#W=!E zuY5}H(-}UU-GBj*$Ov$DcFsxN1d?ED4~7g|ccpk7&CRhsku+d)GJg)LY}Ee|lK&mc z2g<&8sTAm!r^(6c&otM^7_~AI@VpK5d0S$s3?H!gAEMupG+s{@K~>eJRAqw^fTp#)v;@vri$& zxV;gXovjF3Sy%5>%^O`OIQNjgZTD>$YuAj+OQk$?@W=S^)~27fIas-a(f^Q`6ngtA zI4&vp`j#$Xl0Bti`>0Nn0pM2}sFyVctjluRsXHtNQd3WIK=5{LNQ7LWO$GB$aNuVO z5{aL}<+qGwO(vCC7rO)-jw042iLaKfbQn0(jrK;DLp4_;IexrzgI|>=Lud%21PTfY z>z^k6K$i6?w=8nmC}xxPjd8&1+)&Dpa}^kTO`8$o7bWfwSiX7YPKgGYHk;qk}ODV*B0O?hljpotEb*3wG!LBL_2U+!o5l`~hW zkgC2=B;wlE~wVRDcy*67SV3(Ss(NGYXr)~=cu<>y|5%X?{@qk= z#aU<`;jsTDa#E~mux5=;p(02*et`nkk|+FBcnPVm$ct_NjjUH2ng1QB5c!W`xD2}g z6_-ZKk?_GaT{AXnsC3IAKU8W}u1#^ZPm3yoc=${~nmc{o-u#2%vY3va398iiocb$_ z?G4h$BS96gx{ae_GU5nI7caKUeN`>a`hfYpv-OrJyvL^2p6e}Qk%r4x(AJR7f-}-C z&-2%&?N#X~qTEJ1GA`sk4*KD*;jUkQO53|@t&fz8I+>xDk-{rjrmP+5=ksSWz5tGO zZuHseh}2zs?6);SPM6o{35b5<233Aqu38kh1!xs>iUP=f{U#FmtBArE*Z4FLT$*9F zc~b>X(KY{0gv|Cu2INQ4zlG+3j44jeZTOgI9|-!yA@q?~7MG=T)dd+= zfsnebsl%fhtAJzjO84`xA^WX1V7gEjTz_iwBRhjP>3i?zPSn!2eHW+Ro}Lqb*T27i zdK$ohslPxH6j`slFy0`K#t{%XutlW*%SEGi25V)Xuq?iT5x#*iaHxbUehjWW%=0e< z5y(HiUkk+H!l&fuHG?Wxb4-FD(b!QKC3+6bwno!$e+($8((7b_{x6hyh8(h~o0}G~B0%dd`&J;-3TBO^Zqd zU7ABpU?UL~9wysG5pjV$Ny5?r3Q=Z9am{Z-j@Y_J=9xDm#+{g^)loN}QD!>-PEph+ zPd#)@Hl@02y_&taD~+HEdT;FFNJssFZew6vwGl7o+>K-AIY~r|hG+Tm+?B~}SF8zV z+Czh}mpRqDCAZD{zM+W?@ofuuQ002&wv|9K#p;NJQ|gA4b?VmZV?)lm*7hXXw1GG#{n$ZV)@Q+>Nadlajui8+Fc9B=@iZX7T6PH^Ufi=_Z zCk5AxiDwn6I{-EB_Y=@!wLhkKgOp7-K;T{TBPGI?DZxBOFtc3gX4)nb0@YL?6a!Lj zb^t`IR;PK&}FzQnIt`ur-$($n>?)N?TDLFaMC{~cYkdXTJ-$O{P$l!A>L zkC7*O)tN)!9b(5&KL)gvFtrd?>2a^x2Mf|XP}k7Vkl6Pz09zF5GHYy^_}YN<&Rz5& zOf&+A!kuf@zcdP*_=LJz!#({=m%av~y+gJFa0EDzlnXn8G2J*bJRc_wKYM9RMkE_a zB<-j1r)ZKink5ie^!Hd6^>BHF1HarSy1(+_P1U&lMgea5rl0-EY@#C-E&(uRbfn-G zb*X<1&l(PZ=YLd5Tj$u#7`Ep;gOWf4@kef`I&KiwtJIgkh@}d-X4)|>ZfVQT$>MH& zCKfv1b^hvf8X28Ze>s7{T+@W@vyV>cXp#u`92A;fcnEzn9ZDFf4OVuUd=&P}Ch(K- z5h|aB+`q+#TVDNwbsL$w$5S|1aik3o3lONOd^x+?9lft6{7X7J_a#qiE->-lPaB*4 zdlBF4Mi6>lzhOLnH)iURZ9nndy)5NjQVzK_**g<{_hMeEm6rv+Yn+JgxPfBz`PJ*5 zslU`lfzL{UR*82=>XO!+>VO5$uqmKe)hX=fOlj9$(B1V?Tb_hZ-IG$P3o)o?dhc-*0g*a}W`qvGAEZoc ze{KO&>2j~LQyM?$|uBR79zJ?&2chHg($aNMaO|TUQ52!bFRBTRRD{fklXwt z%=@8grgpV=3&>!Qm1=X4mF}DK6b|NjQ@q3}DK4J)B$b|(H5id%Ay9bKLrNXflCk05 z`UcG5-k$oL5UWeLRe|}1#llij>Bqmy(=Zbx#4z5VSS=Xs_2vcLw({=8OXg>$?9E6# zuutZHa9t^$)n*Lq{kLO!_t_21!1XFgZMn%9&~4G0%Yh{3(>$;B1{MMwjR%$8Uki9k zO>AE^J?ytnO}4Tm9QkU-#&j?XxD<{T11X$4MkByb)mTzelKaY`l^h;z=iAip)jaOQ zSiS*Rcu2b&ggYIXW2I3=YYy7$Gs(Kf2i0SW&1~65W1YClrKpFs_1fD=8~Jh-6eU&F z*i1|#ZS8Rm;IYgze()fSpo$RxJ-w}6gDm9a45k;21F82yE7g$F@?gh(wb3SlN-DGCgJ+> z#l-cBU_C^oLF4vS=f6FdN|xC-Fu8z!_YAOI6+|V~D?kWT&)6kh#Kj~J=n!xh20W* zd^J|=kum#89W4c;c80IP^=OMb4KE#0MFN!KD!iMJe2ei7&*l%>|NYsZ3`SS@@agG{ z6w-Mh@&oSDqpry$3whMXJRU*>Z3|VRAV8HwEeA}D)_mmJyL=Mr80^F@LtzBsw%G>p zYB^#l5^lQsVn68y{=B*ZO1=FRACqsws+uP9%y!SAV}O413<9ZA zG%IUsd6uC1S0hazxpjw9w*76Ek${>-A9tCY6CTOTKUo*VqY&}~#&^G;=NU-BEXX|4 zN2onyX4WUSd!ng4=RidJNMI%}JDXbQXccH&_h_MaRwbG&S^9pxa_Rf`Vo4r&VVBsv z?F5bSfZ*{5TtN@kXm*(X5k(Q?SqB*`fNcN~Ccb})skVK4zy}!yf{7WDH-}F*;4tL4 z&~WtEHfv@!y}A|ZbokPPMqVNkAl8?|T&1^Tou57YR@m}u%!~-w6!-Ttk1IMJH38V% z+(ab>{{8}(o_G@o0ytvU63NhUU;WXey1^ph2UzT#V9OT+C}#I)D>Z=JuBN*Ux%F zNXEOB%p4bw&pa>@>^(DbgizK*I&Pkt8&g=#MuM^>aQzQym^zwckMZ}j2;g^|DW9a4 z8&cfoJ>a@9mCQ~f%X8Se9@HnJVn8u7fTI^D;kY>9O3{}O!f{9AAR;Hx$S!&P?|g~( zW{vJnA8mWPilU7Zi-ZiB4?NZ$ajAcQe;t95laZkEau_CYRR+MJH-j-(?jL{|tnD&$ z?fv$x4eU@GvZ%FRGt+fvorhgM&$|NAxv;su(T4s3m zGaV$w@ytAPT|^S3Rn@ltxd_1S4^GzNr6&KlS8AT^y^bNRapguFm!6NdOFSahk1zRT z#>Cp44A}~S5X)LE0Rs3l!l(Xm%ObC3=`TeWU(SNMlJ^a;s!f6ah^Hy}`QF?^9BNV5 zX^^IByZ<8FK$kf{zH%afoexRxpI?&zudq_k^)zCp*| zA7ualInb)2%#zrB?Q!vIS zp!?#@F-x#V8vI3&dqIxu3^i8^DY}NPf8OKX`O4S`6I!z=)TFE}sma&vy=ty%FL}`6 zuNIO01EonmBD%+8-CM|J7(%h2Au0%k)hD*7K3Nw(p;Qmr+RUm~Hs!~1!$MG*SA_IY z`On;dp74!QA@-PujMiLNi_L_CvE2y@IW7fuWG1t zuaCF=u=^5-Yk5y~W}5Z6%~E*GLc5mvGE{DNcO89bCb5iTB?$<0Cq5A31-^%GAS+Vw znIWQp0e8Z#gNDyc+IwM1!X~&iodE4oFe?rG77V_xSvWZzx&c?R$mR(zux=~>iPrgk zQcn$RB5dl4imrnj$N3ZXu^?RB;0z|3QNYce_27Vv>SmYG0|V}MxZL&Zext}ZaLqB7 z#ry&v2QDzn3T3FU-T{>5APD!Z#l**-hsiShu&6BsA-@LTwpHy8Mn<=wjRppI@rT^p zmE?lKtMu@C!n26f`F&D#sIQKVS|W}${u5R_ar=k<%Vxaq>RB=-pDVfxX8d3|lmu!O z@ec!N>j_t!0*W4?@^sPJ$MiE!2{yO${ZxOjO)n@R%P;k8Junv=i{at{%5z?I9K*)2 zIm4Y0MuyJ-Yog6fd@(TW^MfCEjG_U|3!q^jUi2;z|W+_7%qPpgD3;B!~M3IT? z+{*RC0(L@sPmd?ygz2+yoP8Uud|Rp{I|37h@;&YC%WlA7EGi0W1j*XKulKniRL>2i z7E#W8TxmR8tu%LVThF|G`?mRh73rg#0MJ+-16q9(*<32{Ad=jZ34(Ury%YBE_c=c; za4%*Ocs<=(ej{()|CME;KEUvSaDWxuF?hpW*nCWOxlIqcILE4cQvSOApPh$gfN*f3 zW+K5lYB=QR@~5>fh`hBsEvEZ>G1|;ek<;#|DO}l=L4}nIs-y0LFS!ORZ;(PmWP>Fy zwt~j2=sR?SU!m7=5czNlE?=XEW;D;rI;Bx6?nsIKBphWA<_>1(S>vX2@Qxc;Z+X&~ zeJxonvAgQt==|4We&_(g(&k7x?Snu4{p5dM05a1XI{*VpvnukvSc%xXuiGXEt@vwS zPn$r+jlKPmM?uFSAtAym8{3QpK&LLuZ$Q@ZHGf1C7{j-T#J6+mdkxN1+DFR1z{Ai4 zBs>znV_)ji=mX40b++gPyWsQB$w1&mgqFV~s=^FsmZ0dp$3$d<#%|*IZ~X;R5x&#&#i1Dk&siF<_Q7$l2?)EJT?7Tbd4v)*u#iZ7+yhiQ~1%Q59#zB&BVLjR>{f!0lLT* zKI==?YqIjRKY=sqcTa*gRlg)Z7ypRAEa1PIjNPP%T3}Q%=(`dB!%u2jV}r74Ck6-g zvZi%#ZToFJ&9XRbohtV02}pNdl>l%;qtdU+T>oRG6R-^SDpa?e`<0agIvgo(jmON( zoC0Binoz1F0KjuL+9~i8;e7Sy(raE4#H=c!6h2{6J(K7GF|{73j)FU9iQB0KB7iq zLP$w3{!95-}N%h_n~+;Tad{PvfrX zkCSjt+K|{?R=%@Ps7c*s|G-4}L(~!vdHLN4n~c39qDw|*Y9`N9y`yJSg=+b`xSx)c zQLCI3Jpn|29P~$N>}ecfsO0E_pcez0$LP|MGc<1@U1OuF#Vkpf=RX?DEFBQ)9{2-@ zEqC|PLe|>X_d(pt`vUb`ET<~wrC*?V(3G{$1I&DhuP6!jEX$Om4@oCk9YD%{GyD7|qOIeInZ+@Wxbp_tTTX?`1Iq5Se|=oKOZn$jnt_)qM|h%((NEC6)ywv! zExLSCQ+YN`8q}c2W+6Xtdt^(bxsmgUHb%{gA&i1rmi;rfi+-wFt{6uC0|JwPo`$zh z20l?yQ7qsp1vi3A=P(7om15Dn2`C3P<~xJ#CP608DRppTBmYs*9QozzNpqQ13fMSA z0K)NRk-<>vTS945teYdRVprV&F@}<{Crp*5JJ# z@NR#pGiawToNXSAkbVGM|D6Qr1n%6ZpP|UiVp-6?_y*mi5gs4kZx@^c+$WJA8NWnx z`6_jlZ%?a(NbW#3cgf_1gq6w|J1tN`R&yTszQ4Le&VZQYz!GD%C zSpOVqCQdU*HmNL`xWERTTjlEbRz%xX&}(g=G&wW!jff^s$SJWyaUF7wM++W~HElA9A>2C2E;=P9Ph)7fPJbmGMP0fqI`z@MWt%OLW}cN;%~=5JG9Xk#?M;^{$1}5L zoN4{$9X;W(c(Yo_z5SSx;lV$3Wg-_Gf*D;3GICncrh2~pQ{M7i&+SNbu4yf%qwqJ_ z^qB)sA2N^V>G z3%17_0;45O1?QkEs8z(m9?lEV%;)bP@W-v;0MyubLlB-XF5L$mW*RSs?9-jw$!HWJ zSuFh}U&snLX~plkMLC&|J#6ysRdt634xAOR?Cae%uy>1!f%`2KNNMp`Z-Wvz%}gu`mX4I`3WdZ?!(SkOXgR_s?|V(=HHS*yU*J+gyuRa2kU1@*{mZyu zTv)P-PtV$yUb)o?U_fDhdXl^SLvtnJ)e5AWEpzQ%CdLa48|6ckAK?BjHUzg8v<2wH z)5isbVfHAAWQ+|PD}{}U&xc_NsAhEE++q_i5YN$yk<&2@i1yqkDe-Eb`hwk=`AS&K z�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 I95Cen08>=#asU7T literal 46806 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®jX* zZd4#2zJm3byF-U}&u!<#0Ta>ilGu_33X$1MNCOysd@{HkxlLMuWf{NTmuP3$i*WiC z)QC__altOWZfnd107%DtFlV{5KiWYpzl-!Q#m3=d&Zs~r?q}+4eM?yyN3S&1?v^Ra zW{8`NS z74_e{QW(fI!b0W^80&;yq8>8R*rOS3eTeH9NLOZpZ@thbG#2i%y5AUe3nT0FkyU4h z)68#Bf1af^Plz$=?PRY9ZFCF!T_EijG8lar=1QyZX%gC*YWpSIonv$;wg*-I<#)Gk z{#qGy{(L!Zu;1;w8dS$*&|IMK>ktlty7{N~W;hVG-;5#_5A^h~SuN2Mdj2IL^f-t| z6dMnOglprFa`yW4lK`G7;``W;>th!Fn=Bq?n*T{V)CO1{qzU?c(&V1~!n57^`sn_W zV8^|fVSNIEU*Z{1q-@l6``PRV+^9qIjDYT|qLPy4GrTpN@bK`3#YKXrhu!|rT$OGp zsNoOmt4l=i0FYRljPXm;5T6^75^^MxqAKzdDA+L@zs<^7Og6?JBEIiNVMD#9;*(4P zX_b+jr5M8;^XV+J(UTiXSMs{I#EW{LNZ)Wv;Bx0bpg@H|zA`%%HowiCF?tg{lniTV zgo(}xBiDLXL4-n{9Do00Djcy*&Pgv7z|y@7FE#&T85K27$2!2DJltTkvVm-|P}@qv zrq!+URMTL8l^Hb4&d)rsw@?^@cc=u_`s(V5h#=Xx=%{gJjad{uY;?*^)6m8scf!H9 z;yGx!@aG#Ms1$N*r5oo@vlzo*K}ies?Jc*MSp_kjJb@g7!yzmm^$SwdS%8eze9877 zH3=d!{01KarD?a9@=p&VF;_I5-*a*4>7#SSKlsr7wlUq11mCY67?f65S1WbeQ^X=M zvz15>&@lW%LPET62C=qRH$FeE{H_`urQKc*Dags~Pl{7rBf0r7)T*^dA1~JVeEc?C z*KLOO*qEP5z6o`2$BtW>`iOG0XCmDe=Aixl>8M4oB*lr+GP-z_hA@^|W{5v)VK~J1 z(=dU&HeDE9NHN^ZT^;2kIJk~4opWj#wMakXi5VE|e&^)5pKp|<>5?vNH<{qk15bK4kL88^-(zl z*4VJ6m{Ba|d_Z%vDv$%SmlQHEbn(7$n9LYVPF9<2*5qF&ru^(O z!Fs;7=0=L${3}Pa*>_eLv}=lgIc)i!BPGxFzaoIXtXv3aEctLyNU^F}W0h4^T_k{L zG@7HFoSaZ?d=Y(KLpwS;Y7$aWQQh5+GXXO>E~QM`Ow}^#w~&=4tDmJ8T@^{p<>j~c z^YU(M)qLP=ZK&||o)4Bl2H?6@-A-3LIVJFB{rYreM=u0q{{Ay~_21F;r0wa)>f%N`yraMgV&W^U=@PLLW zA5l+OO%83oL|P`-l9G=~M0O~Znp%CsRXRDF;X|D1cTn7~7X+qEP{gl+7C;aj_&nf;`7~nKXZF`H#&QT{oQ;;2r06) zA`+OY6ydy0$xUY~L?WV%f!Ein=Sf#XOReoyj z4Z{+8av!4(dqwDwFf~yW)pO=2PCZD#GF@_~Tmq`Tw|Ni>`p^VC=_`+#o_nFxOdL{$%a4N2`XE;d@B)_5c=N4NzoBjsvY`)IoagrV0Fqr|Nwl-`V- zp>}sm87y{lWF*UQ60(x8f}0zc(S^j)wkQxp7FgCa<1ELsQ%cPBVmnU&&7yoZPURfl z&`5+6pC4}?Ko%f>=5u2G_GI1#_ci{AD%cWAKYqT^+OR&gjzPBrbT#;D-ZFn)eSO-6 z3WVjgqh$fTZ2tivqynu#AxuW?uo8=n4^v9Y(Y~w!nzUdM!&6IfFRF%C1JTS!;bP40 z2jqEtS9Va;qWH>6n&Qg`yKre?L(_BV<_kFFD6!FNs@k*9RBEIl>aQj2%2C7u4w9Gw zL37Qdu@z5BKU1U4Vv++WP!TXkb<@4n>V4fvS!d!3s@%`wP>Mw1OLTGr)t1d7ztppq zlReNwYDb=U;%Coq-y1ABDe{-fWTfx|E1USQx=aK9;11i}u+$AJ6j+li1PB*X|A`p) zj5f4Ge&zYVkE$L_E+z?8!QFq0#Q>|0Ctr7~FKuONmUHTL5tDNe^|qCRJOeBpxC zS~(YgUm3OjAiUGP5*O^gME3uO7sU#^{}D->-qSZtO{?w`KXk41RIbH3hbPq&W4mROO)n^;REwK0+ocHf|FbO-jqk zasY83*tg1V=GjaZo(cwu0+8z5s`6>HS$^@cLM7RKAYvu^`0N8j2G;wMU$rc zC7HIYm^lHxNU|U$MMZfQxKAIQACe*(75x-d#N*1n6T!cSFG?A^BF_QwkSB>Fw}`_e ztBNgy;hQS*=RuUDT#KXt{ZlNtF(VHZ@ntezV{v}7(_;#j7dEoQfE)Go1Qm?qey(`QQU$d|K*#s-Bh@Pwt+UE*z?#BSS*G#BYZ;gP!kl zR<-{$Qz;9$v5sX1%g(iw2-c{}0%Q$tl`T5%Qk63BAhmV*)5r>rSm-RsZ5wjqb9$q0 z_@o-qm1k6fDt$wSbRVzmns`l(jj`#P;hYD-nw?MPu0C7_4C~My&)$G~?wn1Rn?!@v zGNZuf^FA9TNWRs2kB5f`P@^bZpIXHb_IWu>b<>)X00$5HA_i60(TSd9G$3edpKk_h zosh|jnBMpd6_czgr0s%_G(p2Dei$IK2JjUXbYO}^l}WnJutPSOQw**}Mt<>UMZt#u znM72o^!?Qy%EC_)>XZmIKdn2$ZO36oRctSJ>&|-qvF6)~zkpp1Z*04VZc6DcG%hwT z_a51ABxj@~f+?qbNwW=~pGffX8voZ`erYg@+us~Kq{&cbvNT{cUN@9;L0qG4!ycqB)ahzvq4_O zK^MKwTXjMwWly$|#aJm=qqrvI(=hQNpPd~)&dI~iCOH+8*InW`gs3|U>H`$TpDase zB7i*lJ-{Miab;zt>dxb(P2~zBv-k5gBWzDcN5|EJ3pzSFa%`@;z|`27^p^MCq%G0- zyu6@K-{EGP7Ko{d35&ztfZV#vPwBMsa$14+>wdX)oL(X*sIT;_1f-q#s*>%loDeB` zU<3+DbbCRLVMr~r_KrA)Bk&ng>0`rWai?B|{MXbESuknYnKj56wb?W79SE~1>2#$; z(aROfgw@XSgKXAD6orden&7Dmb0?*Bx}wM}$tlC{af-qC6xbEy3am@ToPnepvBd*i z!FA5*Z_?}R_Q@~mI}{q76y;sUhcL zMqjER@5rJ2A4wu2gC=0YM5%tR(5(`!p;hvqM2NK|6ww%%{v~vVwH&x0g&)DN-?Cnb z|4JO~#WVp8`dLdCB44pY{u2kxfnDoEimIxEz*039P2jR802~4=AVuldW^Yx?*4SE;6`%FpnpMrs^M0%m z-(b;cO~u^ucj-U_-Cl}YgV>&kPYUsEMtRYJvrYIQ}Qk;Iekj{j( zlsTNkgZZ#?a+p$&x*e{`?kxMLtUH5%?x;q{Mx{Y>uj=#~HfL)F^D02V;3M9fV+=77>y?smB3&8@LnoX;)H+l2o96= z&Y3~2equ67Io}1PX#P-lVxkoxn>EpVlp*(~U|gH2*CrCXA?$xC0|(fPfdOpWdV&Q`M*qC;UPd{J&0cd#3KUVR+iKO9xLMugr=N} z&^X6L;_CdK>(ZiPqDxS4-<~z|w7%btw_bI!kQv_b6aCVomFde%4@VZ^o4mY|yT_Y*a7d=dT{CqZ@d`f} z(N(&rWXw&XFr7xXqbi;Ownd;x6I*(G+W0u%km5#1bgj}fzz;QdnHy%5#B+Tf=WKF- zUPT#eUCPK?5DZKiwUjj9ff}|PUs*$`GhFlr3h`IyJ{MMPBV`Z7movSRK*SPm z7IIkTYL{pWA|f8=1kgj$1JvtB6XgX~f7|oe?|=X!y}zVocNhRo$ZdntxLpha!O!CC z2GgU@JfipYx|}G`)ef1rX?xsuR(-~PI0@AFou$F9f!!>9pyiC9SxQoJ2UwF`J-$_! z(?TQS=e4zE=re~+nv(JGq)$x9kj*{A=ati%n3yaqEFi-}p@^ZB&P#cE@&dcQLx23j zz^;K@2t4nrXl}|+R%uAV4e{(OmT6<7#CQk9&wacvDxFfPvhXGYai+{zf$(>!;#SBn zM|nVhgiXyGytXgq9NX-Nm)ZPQQoIA%qj5~F)?x&mH`^NFH187 zyL*c}udZ@fTpK*(wWhwN5)P7h04ayc zxA||t8kvTc)^H|IxRgBxC~3Hu+nhy!oZH%VJ}k*W?f{JzH1zbwe`oTkTwF+Yte`1Sl?0|me6HHDLq`_d4Q|tkwBA81y@|iGh0zXQ&?M$mr>ouvLc%@! zY+S^YkH32%D9sPWWPVA zmR7b}#D&gP{)wB3gLtS-RvZMtHz12FlB@Iv7ig^L>B@gj>D=R!7+y%*I8Fu?AP9?! zp`$~Hgo%LTCQ}J;rP-&y?j|SPXo)<_Y9WW9t&6N}u>X1?yS1?OCv*E7zf6(SA-dCb z{A(KK3R7vOF?{0ERPu6RIS`zX$;=QeN(Y5b_S zecvv=f4z?`r>2;sgMvdTXli=S`N(ARCMVPVbbWiD$l-6Fm%Q}4Y&|ZLK1fbYoiCNo zO+k&iAc-Jtce^UF+wLlLCRlH=I|f3>P7sm+cRn#*>HH}F(?2R^od4;DNv!)bHB)HwwV9bV1`$%fPsY-I%sIo%=1%SeWd-WYaFPE zAEl&u`(OiCZS413n19SD_4F+xoqHk#Za?${8N@+=|D*x_bIL&Ll3ALd6bJcltnkDz zwdrgX-TU?zDJ-s%bV!0S((E^36cJ=}J>=LxrJ)Hz#BX;5@AXi7d!6k;tEFP~IMO+d z6&gs!wHv8&zLf8S4bPD$VIoqAuWy~^=vK=Vbvvef5^KK*1}|&(v5Kz$YN5i}HY;mFP$mk6Ns&`Y?5s|||K%%LI24c;0dXC+Z$7Z? zy;LCL6crKQvy&Vke!V&Drr7e}MDh=0t3g43yoQto$%G>zAvriaK(cnB zOH3&WV^s^6)l8Ve64zscs4^(ics|m|mDN@ZA+KJGWHk7UIKgcUx$d)HA3@q8xVn}S z5pmkC`kEH)_%4V=nV690x`DARIQy3*EEZiBI^1YGOtRHoRr!XUfq|xR^D-3i6 zozIVzmaT;}ew&+{FYw+A(Lr;D=y>r@wNT+(4=`bsC|^lYu&~5^qJ+5M&g}^P-^j z9_NY!w{Xm627kY?*Ix)#k;fJbsy;WvmXa!EYNq)}^WT(Nd8kM$ghE4P6pxg#VZzVi zEHq?awY7^#liOrX7-zePz(?iHoa zpOc4|&DA14o8$&&PgOlgazCrrvAw5fe4Af3I6CZp@WV)!$8rO!Ct6i!Sbet2P_Phz zuyCaTtM-jfrx`a)5CWPhczzTk_iGmp!Gn;5MJ>f@JxSwsXk!@F@(TK;sDf;ai6kA* z^AT=hN%omC-CkfYF=%Msh~*EDh?qDipIO6$@nXzR4eybsuXYP|h{Zc-|Ss1Hbz{xCfrMFM1PTLHEa4IR|b-#mH$|X<8h-o^S=~ib7<#P-vA>~mF^e^%z z+tYpfU4vEd^=OqmTduBH3ueZx4e{@l{~J5TCO@smtt`_GWVUZ4E_Tt3)(t zNJ_SR_+7Ogq2LgE4e{|#&+G)D0x*QtI$1vd`k9Ht@sE5q$`|^{B`Ww=Lc>Z2g-VkN zf#+@C2oda`vZCX&-ItY#Er{pJ`!}dV>g31?=F96 zI5;>*z`!=!x*yE4b=>VSR_Z;Q>uv*nj^l8?{!dxNA_*Mk>QU?Q%bkTl zyC(=AwO=nw8HjIfZRvY%C8zB)RC@qANx#L z-_eXXl;3l70z1E|89UN7TlHF406|Ge5|X4YxJz{I_2i~bB(HJc?o$5rrw(Qiw(8XI z1P+O>$6vdOD9uOIc~d)2a&3yM%7mPTZ<%35t;ai?ei@CHW(b$A!hnOTJggJ_P5C=j zCh3_E0rAkZY%W_=G-!8CIEyQEEj&<}v&N#woIs}F*drAF+M;e3+}4k5;k+YWrqSz! zUI-e=qx*Qck#V&LdLao>sxn;_MQm;+q4Y4~682=aJF&z3@!Cc4d+&ZF^Y+KTuhFcB zi^0=rYuz(PLuL_oNvU9D(kOSoq-2JTE$FQf#3X_Gsu*Y*<2*Fn5fWx;!F6*#8i;1D zH-LrDlE(v%DcA{UJD-^~y5nty`ry+h)uq+HKB<8;g^I1nq%qQ zt@zsdMSKH`fO_I3`2|!pV10kb><@(j(kv{;8-7G!f|=Bbuoc#E$@MQ5At91Twvf*# z3UqXI^kyVu#Yq|-D>ZeHW~o-Q?Z(c|4m+266pu}W&i)5qb1N$j&ogt-lfAc1=XX0W zp0Bf3WccGz9eXbpYPI|JyVcr-mhI>y;hWCy9QRkKTGQ@+^~qF+imMm9LIkLYvQo1B+Ft*dRaR;kjK9 z(~(GhN@^ZxC?ia^j}BNMl$CkEBys5L^OdW_bR&YEnMngEHuJ|rou!3izv6w-P0`68 z`{*@G{|oV%;)9ux@2Kg{Tja%e9{qjds<}&Bv~E@OShU7WD-|;4^K}9=qM~!Cs(*hK zWUEB%Hi=>qV4`jnZwgUSFwsvQuPXjbWitaRR7B8IGPAUuh$XJyDP{0<2P5HlTuy6y zf~<&kb|H5Le~p$}e)pr_z?OXrrW0b@R=Wi*F8jqn(5EiWccffmtb!PV{pRQUtHWVX zhV(L^v=U0l{T?PP(v^j7gYgYLpvlR}zaB38J^PTL|8;8MUiQc@?5heDRi;sr3^=>uT z1c9}_a?^C+2bb2m);O`I>_a1N0=~LI*aS4w1j^#s;*!*OrAyLm1aP!@UBOxFDICuI{(V=1*3Q6_m0GNkGM^!s~riHY}8w zkdOp=J@3yk9jE=o_Ho{OQ^jxZ!ReNwJ!YY!lRA9Z*Vo7CNgVZx+4){)B!gF7R!M2* zfP;-qH6kX)wRHtNeFoSY_PhH(*iL@KG(F3oMcUf_-j!;q%k6`Mczf<9W^^lyG2P?|O_+zwb-5xl!%stGUIa<3(oRpao4FZlFI$iE9S0)t)3 zvCbSnXO%9E@Kst+V9>yFipTb=5H}MKTX+}nSNvB*1lYE#7^K0!`gG+kh&8N{$-;E( zo_RsKC~ypBWW5VAxXH8C2l5oYP2|mE>6qJ@%@jt3cNe>Vm;$Gvp`l0kj=?$89RHW9{ z)@f>7mF-t)mXm|jaRO=^ttqq4V9SF+UP4;h`*ATMZ_vPfsSjX7yERL|1h=C$X?c6L zl~z%&nlHuX@=qmh;09Q@62E;bo*T90ItNo8hueY9NCR*Wm_6QIwp~ohd!2=)%gD=b z08hZDecxL1A?%8lU+s?RK*^LCAK#_t(B22qV#)}^Zo#xx1+obmFC|%KoEqPv7*EJr zEa|HvAtxlq@Gjvd%4#VJ&WO5_&o5I8pI3BnIk5ja*f>WY+LF1 zugegZ%to%`mM$H)=^?bA?k>X9<|W!_q99`@8zq^!CsQ7od={-xG~(^* zkiNfvwE@T`lGxzD{!Kt=6i`>wBrobYeS2;e7G)%4Wal|)7Z;bz%UBZLyynBcD17dP z+h4zasi7hSZ4;oA3CtRkC(yS89a4=WhkOD-mv1 zkjyf&fkQx0WV_H%KCy5E+6!D&T+YUGpf;+%b237GC32l85?f|@XBuKL+%nPIiRS6a z<(%zeIW})sW$mN6@N-2(Mc3H`sle|~V01$s0p&-;$t<|dc1p-qROe55o3ylWEPRZ} z^_;4%{+TvPCgnI~(oTufW56^!h+MDF>ycG)%a*G-8(&%M{A65OP+?uGme zF#{*09>#5|!=7LYp~UlD4_!X=et72$l3Egyl70ejx_}(P8%9R6qs8X5YI8Kh{o>-Z zo}qeB!e8*==7Q)@P;|(fe*g0Z4+T9Flgpg+OPWErpy!tKdkqp5ExtS;c~8qE}C4Ee==d)uK!PK*3Sih8x{J=2L&* zzX}EY`F%<>Qs3NQ=MQQguevOp*J2_$gED`V3hV0GzL&@RaBw@h_yOzbw*rTb-$2=3 z@Rak!)qg~=#lU7Q8+czK6gm{|Us;EduMwbHLghWZ=Gdh@obgqxMNUR}Cw!;CNNJ~N zShQfAY^+8c8-bdsNtd(KXyuPm(n^)rTagG+(G3DDc68l~wLi)wWKZJKcvPEO)Za~+ zNO;AM)H_Dh3`C_3ULc^ug~s#kbcglh1`_*mag1jD%BrgP zmu_i!rA&(v5aTVwm()~Ld$dG(^pgM{I+ubH1<^x2blIQ90KwRfpaAA|w2G@dxi#$OTl!PDV z;zgo%MR4gLDqyOb!JwFkU-_0_2)mjGU37PLovthgszVkJl;G{Jf4Z6Yoe2F_$mFb7 z%oC!xHmIjqQfzTy|B=%8t6f6fY*+pM#q@3ZN2!pWb1Re@DR$F=UQ=P{7s_DRJ|CGk zgd$%Avyd%NwP-`dX<=uxItm&WBk}oSVm6d-Zpg<>t zuu-a(z1Q8Wv+4T%5n7xxrav=`!j)VH<&xhks>3CG(eL@ucBv)VeyOFoew5guZGs6- z1-B2uZ1=^|M&xR;-wRkSLx-|4VC@+NwL!n)9^4ue)+qp5qf;~dJR zU?w}@ews(M9L#DJv?C4bDN~UDi*~VLGF5GpBO8m>mR%nrfV;=6JQNRv|J@A}K$%=I z<%o{&W~Th)RTj%&opiUn0sFlnnl&sazD$wTj_&65G(IA`RK%z3;n&5l#PQg}yq_7-vFU<@cBa)}q#ansNgN4nzP%Nu8o28tYz2Ey0kvYR(|_1DO6x{Q8; z0A@B{Iu2o}yt}*mcP9VetvjG(b1hSg%=^&d78n@V1RQfj4+c?CfU1Ajnp4J4Q{F)A zF;`=eA>=c^#pn01LC(3ff0+xOu}$;8*BLLNgr+|sl?RV)1_lO8$r??s)%s31a)N!=&>%TQz4pi#6%e&$;F!3-)g2H5z$i54w{Y8*78wT*S|5P~aJ z9zI|pQ7E>{sWs0|q?sT1ROV8t=hN5UV0DUrGD}_cpi3O7NM&M&h1HQBj)s=oUcHyw zWL|xzov_-lkg2UVD1_(w@(B_7RhmX@)GXq9NMN4bObO&04RJxo!;{6uQOPeAD<5AYq z7ATwSf~0O%Rmc)5#+aI|?Z+vM(F1d--h9yDKvCO5G&o;wOyDJ}AjC$E<+-m~P&NU% z>WJCPHz2q{9CRVij1BAx5DTI5ek|bZT>saM?Hu5&hmigt`k{?%q`Icvc5q4AYX~x` zvoXj(K9&VDHubQvK0PaWUhp~P`OoOV{_yOHx;q82>|%a`67lD|;&~wo!NFOsdP(aK$QApgR8YHyxn4%% zg@zIx9rs@yBk9~@7R2rl<4>&tBbK##)h@|eT|tN#Ht#tASUY6#)nKORltj==qjn^f zZJ86nqqTF!pISQhLj$3pSKZ&n(rGJM*$DaF+$h(@@;E3Q&_-ce#lQS_8|(_5+6 zaGSglUSBv^er}?;N!DX(`Nox9Txllt{vwT^M-1kP?|pxZ>q0@c6qwv*gNk+XQJhmXf{&xM+rOH5P`(j_++NuH>{$^Y68%ID9sI_vUK7UDeYHvI@Nc(za;jtc}Nxibwpw-QA#U2c| zoC_Izt|ikkt*%&IdA9UL*r&J{^vAs@R; z8mre3r=8F4IyJRb2Oz12@)JE+9w~o2f)OiATt5j{D|WVK(?ydD8zvGoeS)n-cW3vn zXYx-r`xA+Bw^v%p<93ibV6j3JIPsyt`}*kZ!n;OzOpR(w=D92mtI;Z884$YN#QA#o z@c7saN(-@I%A}f|=u>}E@~4ohDpnt7u62QT15TfQjIFP)YjM969%ZfD)*v5vrUisA zt@LnPE0!&36hdjox#b=TppL0NQY4i8W2>Z=$2Uk!AeYBu=6?+~}TGL}JzN z1Ldv%5KC6L5Wbmy+t%)aJlj9ZWtj(aO%bJsX|we-pL}-S@)5paV>bDYnUmH627mhbF0G<=v51c2g~j0pcf1S=H*NwpS$rw zMdAvez5%+_L0}dyEH2(cs&j!}qJ+xA>;mPr^)R*#IKtoIz`VezBkAq@Gs5mj#)gK5 z`Rw_EeP9&g+;Xggs|Zrfr+Z>LAI|L_Gb1-t1; z==!)x=H|?+=?(=t$zb&(bt@!=JEvR68m}xG1NAZ}LoNL7>s8nMtb7D>(18RF0bj%X z&>P%L5rGzXHd<&~3yBezvtAjT9M(?=Opgs6CHQEF!+NAU!a{4&_0aqAtE&nr4AiC_ z>k!H(cJgu+3)_m;nXi150+Cp!P3O7a4EEPNZOD0S??{&;mfO8KJWh-O_G<_vd1eWT zi60>k^R^8{ggGNVFF_G5t(9N^v_a5n-FPYw?lxWpZ0m=~Cp4mWgZXgbVD&yUSR*ll z{4$EhMQ8cMJ3t4V7Qra^IMSv3$|UN}TD>{lxQoeoRkyAkVCl)`M5meu>~H1vi{(*J zS>ERcDSt8E!+W~B|bkzX54Bj3!Bi@u_49TdcdV5+7eMrg&GiClbiP5e^> zo99q+CoG6UB53L~sAr8|XgQ{o7B8K1;LDlFE)6u~eumejKbIXJLVH6`n&}P4+1T0L;@AU%2VqNtfg%YO;I|k3bBAA;drN!;AWX=*`RfbCr4hAdbNI-cY zz%rm%Iu;*~`SsN8g}}gq)>yUeeHCOKcVIVur=9trX*wxw<1DiaBa?pIO@BVxRWedF z1nJx8<|*szD@aH2yJ0jp7vDr}a>Ys&Gw<;#AD}NzNmsWL?NV|Pd4tg1e%FXF@pF9D z>1UcZHaQXa?lfEmf6ABf=@4=e^n9pc;N`SrzWvBSeEV;Z=n$^8pVo^@va^?eEtaMS zsLtAJ%8h()`xr5@vez z2{hitAFkuX1ouSKR&c8oFaoK18BlLvbzcNX*Gv_TqpBn)j4z!x~!*_a`-0i2ka8g2ST#@*U zAbJugXQY(BSY}6Im9ql%?9@Jpe}=e;@^viioCr%TP(m#Rb@MJ3wFLRb)*M^h8dDA)=_V!q{{7z<{hq;xW=QFxZ?m2$kd7*{*w}B|^an0EJ{s0^2uk zhpYj%XwXfkIfXGxLgk)nbpi9ia5>cHk+3Lwc96yU)lN-aeaY*aBO(Cy8+>s-Ksh;8 z$XC6l18&tNzDm1efX_@RjE@uj=@U4b5rz7+k8g^41wDKpHuRWIBtm*&o4jm9oA;zi zi;#H_M~~8-+f~GA1?%orJXkziY>}^2ZlZXJp{c6S3+O5R4d&#?B zcQ|&kisb46=2pmSOGUl?ex&;X^1p-YdxgH9r{T*Ul zEllVpL}Am`U=qU5gq1L!4SuH5Q29(Z<+7TU->`&{t7(xqOEHB$+6|8Jc1NP^DJMX_ zE0l4*z=B^ot7$CG0tKC!1a~>nWjHY8k1()W#m^FA{CjU$e;q;R`ZsST9AMCl0rZ_lHCL)#X@BMk zbpv$TdAfaOn}c8M`+gh#XCYZTpVWj-RZF}KHcK^EQ1(>GhJ5mV!RvpE{@_Js|A_E_ zR>D~|ry38d$JL`O>)1q0&}tY@*Hg0)p2rg&bv+;ZSC=YYt5d*e53#K~b?csSGDx& zD(eebc~x-19O+oGx~W&;L0iffWv8aOI9;J^!1p`CMN3QjLSF*Tx+}j!8IV9PY_isN zCf(7%whUBpEFfo^6)9q*r~zH$nBVA1NgJq}3m!u^?SgY4AnZ*gtlngBKL5xj$-&_t`^{QH_71EZQ zFn7sm2;{c}1VuCG{(hs$7*a<+i5|GcL?C78NN0MN@77^(G(uLpuWR|kXqELV66I6E zw=ad&5;yiG;#3wUh=PyqIK+DcJc(Z%SJ1j-8>RAZv;~8+9wCu(qL{0+RyAvpUr7|6 zdB`!RFoRa^jI;7u!Zy6`O~9;OIW_Q!g=8)aWWv3`w@lfIbW8lBFBE?u@#{^{0t30Y zmD9(Ho6bGQzsNj*gM2M3p#K4`N;-~A zAxmJcyrJFu+7ejT4as|f+NET!u&F5(Jfj)MozKgMzU5ksU~Pl}V=_sYMeG3(P);)q zd3pI49qlb}b_?z;*f*X}sVl$0Js%rLIc;z`EPsEv+~^=!<@?oKXYytAhF)_LUPFF4 za_-2E^}JHE;55a;COT&%w~gQ#M`SO+?Z#z zaiq{Fz!Aok=#H&|f{9^0tPa9`52!}-`EMOfzKk3e&G^5~?=};a-wl7{>`T~CI@Iz9 z7)vGqL_YMVfrpG05LPcKPnM$@LrHJc|IJoY1MKn#SeCLfCTwhMod#P%07trcmjO#` zsI=CP6bgR;m{9xOFRZ+asH5u{!-s{2nwis7t~TvM1~Ew@&dxR41gHqGFSSYf?;Pkvqq3n=@S7gyw%?K9rg$qYujgy9fABR- z4sAXpuD5iI$|=BPZxJ70D$ut4r=H79eiiKH2vkOocb# zD?B##_3PK6Cnt`deSCOb_i$e@cZ1d$#%~8-sVds9-XDRS3!$4;*pY^GZU@V=%^~n+ zi`PmSGGE^seE3^I3i6%Re<(Tq8>a;Kb+KelF9P4_^B1ra^w~G;r{Ttliwwn^B&+@K zT_Rzndprf9Q%Es4G1Pu>C5eiw7LXe5>tX(;H(YHLv*zB+x5UjCzKNoDhL6+_SdH(p zfy;I#q4ZXT!-uaS#pX{iDdzBW8HK<;&cCM=ByNGN!H8Ar#r(sac<(2UxqU=)?L={a z`^O;wkL8X2l_M-ol>kto)mMF(paRNw>6F$&s@Jdk%b8mC=;`Ul>(&8@hZxj7zIpmW ztG&crq5Tr@V0c)>yt_KwS5x2;6wCxZ$~cDa?{;6a3@>`_WP)8()y)M?IS!z`8{rBC zZ;?5hlxOk8HEMQ0HUveyRN0bcV}yHU6J#%x8FenVTe;Z31+d`9Gq;`J-!`1Yv_2AC zhoJst^T+E;BTdb&{C4QAy7o23IGndqJoSm7%tKai<}7w8Typsjf!c}EOl<}hs^V?Kk@m$-`9qRUWKP(4fa+R4~h5+!6?Ul()uDJkH7|X z@1Hxn;2>rFm%K$Z9z!Rx#q6mUT0%5=sCtgrxOT?WWlBOt1rsD)(Xg}ENH%aAcR~5y ztRco-ZnzyS>gMYki2HcMf@ao^Ro-j1%EZ1;sYTvRe^g%5+R5}2kkWAeLx(-qcpC2k z2;ZiYRt@@b@87>)L1I!}QO>FBUxNYg{sKSQ*!y)_fAqtiQ%{SXiO9d^q2^&mi5d~9 z=fQzM_E$8p5L?Fr{l*(L5PNO+LZq&rf}Awa#Zmw>&_91@Bk@d1{ORq8o7gGzW(FG? z=AbCktrs0}W`9xV@?>oIDnnZ26f|cg$wB60S5qS1*rnBcdWn+CkK;n9{Sak8;|UvgI{&)^-eXetr^?$Pa?m;C75jO!yMs_K2!xPZGFpD3zDQfo;8G z8C;ebUQ8T+eJAF`I%{K7jfC!3P|G%m7)E(a?hkm9S>mFsJOWJRCIfC>}=U^Fsz^Ac^Q^>DAL1&L+r^d zxMu|`&h}^3u)mAjV)Gs`1Dk!&nz1nb#j2=gTBHkK;VU-M-?ikpiMt9NpHF>}I>qa0 zY;XyK8Mt$(^T@E4+eTwLlvrF{z|9B2VW%&!;sngV<(G`Oc$emVbIwqRVou0nN>pM)CPhEQAPoXP zdx_a>@!1}hVS8g62;4SB0;FI9NDxd%!a7r%F}e#|VBpguHh-Eu?1L9VWO7=QkW_we zc$*@|>0VFu7n_JHHjoA%zD08BaAOqhyn29)8i?XR#$d^W{Tfgg)BypRFizX3NWI ziQU(5$$9Phc~yG$zANMkH`%0%HQdqP6`ww)P5=pe@K6*LHVoS2C%Wcw1@BEe#f9>EL_iJpim4nOWQ8GYuwm>0sSdxmkZJ?miA`8o83GC$nR`_~(cR8`XM zeI|<JhN?{96%?EA}cHV;v@lX zP$I$_PS@aI<2XY!Baimx-&`# zj0?BBKeAu`1pth<2ER~mZf|Gd#BdYENJvPG=SyRN*IOys+A`tLDP8a&DUe@>C_rf| z1<}}9xSgMKE_Lm1cO@xzy;pRW*HPinyU9}|;k9~X7ioojSRtFg^G`y?Bhq}ciEexd z>#er>JA!CHYK{wmp<&h4KujF5Xzw+kp1r~_3cpUBT_(4)6vmU zKL1_o{d>8wEJ0a0xydrl`FUV*vwd;TyeQv*x`5?hbxLwFcHPp^>A zfEKN6ZptVRP3IfrkYD`R9@7Qk*R|&^YI?c?)QEb<&M`hxaCMbEV$zH=?{foAe|lG8 zLQh%kNpP*BWVVclO$Jgdr%H$@M7#>-DcONmFo%k8aoQ`{=knV@IdKoIbK=GM`Njab zU)$y&dC?GsdDRk`b3tRQw zs*qtM!22T_g*;HzFCX*!9Y-8jzppmT!{Eu75%Iv7|Yh; z9Q+Y!_@Z1Tl<4Xa4I*|767ER>;{{UD_c@ouN%>s#GaN}JR9C<8vkS?^oXe+UppwB; z4~xoB3^rEWH%=zgF%{j_6+H~Y!^o#Gc0+{^~irhsvh#dA&cr2K@r}K2rP}cZ%rcM4`7cKNA_K7`GSZL59A0 zatbe{%P4B09Xg3lQ&3wlSe$3`VJk~L%=)-c()KHyYuR} z&~yop0D_o%Kz_hG^9`9Q690t!qs+KQ+HwdJok&=8CuZE|#fgXx+GpRn#dJDamX z1QZ2A*f$a5wZfADhcZ{ljtBnltkk6KaW@@onwIO>s%*$z|BbJ`dU(8?i~!5H=V%9w z`eCKX5YbIQ`e{+Jj{|ePG@(l#UiCRJFf?4zj)WH~g?*3&4$sN>V0T$c?qT)dgN`~} zrw)aMa9Q`B)X z5-rUrHdpdNJCkE2h#Mt4$*gF0AD;^#Z^gs3k&GR8_=5YGXA^BcCofJ}5BrFX1hi|E z`BfA++H|eLF5P$Mod9DMtD8AJ*rY^%YX z@)X0X`p{ zbUt2?(tp>}{;Fh(hS)&Sj*^==+Mqk_$XPS7vV^i}!|)%O7g9E%Xkd3QWg85GFQSEC z{RWB-=ZrErT9{vmBU-XcV$^I8)DBM%e-JP3uW}U)s5$BVcZ$3y=UPbqVj9vO&1$`D zWn^b78@Ly?uvb)$8aO|hc}jgnrU~^s(fqB23u@L25&8-8a74fk2ba~`3dc%Q^Xki| zrEj!ofiN^Vh0}C-HNS!k_~#@_t;84nwR~arYP+vUQ4PjK`W)sZDk+1B zas~+O#7$E5?_D%|xtbIZr1?~27bOV@5Q!6VG+Yl;7K~@Us%UJBV6P?qpeSPhDI*Zg z0B<;Q`0ZN(4NL| zOgFkU7>T(l;F1bL?;Vr0Wa~AU;iO>{AYmexF{|HPtA>kx&*S(_^j%$JBANb8bndkp zL7|ev<{s)-t$!F)<$tHwwYe`A&!d6wKl7ja$JZtgWnl!_UDuNC_k)Djh&`-Mei}xO z%n^6v6f2tYig!Q8xJ)|7g7dIo;7K~yz-fY4HNYNt5U~07PQ31#Yn49aOx(Dx>jQjG zsqSwCR24r5)Uq&>wus;!^tJ=kIbv>1vd;RfhNY2lcZfo4m<~BBZI6sbdGDQZCA-4T z9K|&fzO#fEJm&xI-7p*`MOmXBspc%6v!53E6z^@-7Tw7l19f(Z<A9MWKo#^7mr9*US*~Z^bHH9K#VHaydPyF}B5kVh1W0E3# zAr()&Z{ish~$xnR~Pevwk?WmJiLc5DAVdyGV z)({6z zkIAZ+$Du1GwjzpAG$QxNso16cc=P@pPF2nC6T&HBe-ZoH0ha&eOyJwgMVNLzE9BeKOlV8P<;RqAhy*M>SI=?ZWRK2sy0 z@?RBIG+7Z+nIIcY>7L^luM|vj5W4>K{jzeQ(`4G@Mx1d38UnbH0MqruAy&#)B>PJR z7rqpzLDaW4oM;1!1(9KY(nC``+b#l&@NCb1Lf32>P7(UV#p{w>8AzGi1<2o+xX5bs#$f(s#(N$y3 z){SCTN8D7KmMGy)Ek#USulDrsQ*RM&&^5Ns4!$vEXAWy-2T>%|QdtO|a!8A}23>ym zhh(G61uXNMl&UEnEn~?`c4U>c^DE|%A&ub!yH4Z`@ z^sQnE$J19@0^=z+jAq^1P;=<;R5WzrO33kQKjh_!^gD621ZER&RyV!4i4R~|9D*g0 zN?cjTi+-Kx2-p`S6Ma;#~IPug%R4lyKTfD0L0$vx*>RFxEvCwF>pye- zetMt07!jwoFZgwCsvteEXyc@|WgWZ#iot4fpgd@eQaQ%K=RT;WxSvYZzekP#Q&vcw z#b}7{Rlk$pbjyL{}4OSv^g>F+w2jT>q4sb%k}{F8zWlmC(W<=lcCCNAzzAYU&ghmi8U z#RQ^WBVh<1bXh2w_7ttZg;c!V=VxREZ(RF(YU35;C(&^Sg5Y~m=6uSIc7G`P1*AyW zo;Xo0??J&`8X7lOQqh3OOIAuEH9XA58A?p3m1U1LEtKklZdao~(Lf`IFkd@Co#wLl z3P$B-1my5^WT)mdZy`CHwWE1Oe#L%?V?`U4Ri#Ipc-*2MD%2RE%m#%F($M9;9)<@bQinlWHPUYY5MCUt_KRT|= zN;6g!|J$2XaIBvpsjbucZsx+Ck|n~9w^1c{nEpAqtnZBVneZvLC?L~Z2ELf48EN)I zt=;1t+k9yMAlu2sS!+n-C2SwJcUVZy+z;`qHu+L#(JJD!WLJ~oSkSRQcp26clDVZE z`dA|??Ejf!ERVcU_A3kE+WiJpj!SoMCyx1iw*OaXn8l#5avaJLD|@?_SEgIaIm`U< zbXh+q&G*k%Z}asVjF;0v>S2ZsA~4A@zFr1JavWjd8CemwgjCtbreS^V*hl#L+Aq0D zM;-<%qVaXEKbRh&uk~Jh``^B=LxqOB z8!M?DWcl%nPum*aMIt6d5)p%jK{yY3+OsyHT3YtLXtyeQte)xPy8n{izh&Suk3<+*yj`0#Kb~$3nd2H}vhN^;{ zF2-ZI4{XKEVd4|=qO`a;D2cwpxD&fxwtQiw|r<8%cymRtsuQck`9j#l#^ z*>snNi|ff9>j*266+#BP+IVPeyRy#z;Y^b`AY^7+7FSj#%vDve;QzD$-;9dpI*#Hy z_h?SGiW!g={q7zN;T&uOtTK^>ALo01=^5K#=(xcy-Xx=7(@$ZiauJy9c|aCm#9(-4 z#Q(keSJxUk-1)KIcD?AE{}d954ehr!_9BnMz3X4mt2ae0Ead;a(6HEk(JPM_|Euvw zXP%4RX30Y^cmKnP#pWc0LqtOI{nCc$MspPPe!lVv+WT9&C|>}yCHSOZbD z^q_iGv5x^AbD>hn3zG?qo!@>mS?AojpGn7zBVAxWHNuh^7C(_=p)xvza6Ro^JAGlO z&TP=BFVr&g#Uw}Ur-{E8EzT}kq0fZdM;Niw`U|Zv219cBH=yD-WRwxsTsXW#HM{!1 z*E--y=?~R=Tq+7B`H>J4r3}&dRv52PvDTTZ6W2Sgb}+G5M zO8ZWEnGr5fOm$k9&+zi6ZJ5!!S~Qs_tOk}AGe7bCKrEUv8t1K4p!I)kL~)03!nx1! zzfFDuLxjJ+;=`~TQm$7wqLMEIF6I~{MIe*_W!nLdi5 z@1Ch7DZC1cuR=MZ(0KnG3?Gvi*Ssp5lfT`3XUn}NZMV{w zl@UD=d)Oi^5mn489SJx5?W)G9uanE@shCI|Pxv%Q8m~%_Fl$r1vL3xe6GilD zt^RrL%A$k)K^yVRFoEb?d-uxV6Myv4!30^LN0YS~+f{JhY5YvwB0Th_kPR#@leNul z^G(MRJ-u)v=lVcw*ID|})AWA_mr;J`#a4F~s1?i5AR~f|kWbf=%cDC$YX0}KnTSjE>y*KxHeZIf@aX;?< z7T5KDzt(xaj^la6L$D8108uDiCIi*2TGdio7X8m-Ena1dp<+^{+NY@cDjcEODg|!R z)+^HJ_fe#ynKWqMNGkdqe5-fz^0sy!Q+z~+kLC8SY_#dic#@#|Qjg%*bl2W};UF{u zG+iMyUL}Mcxrqy=^yPQnLIw06vMq|ZBDd~pNu&RfNfW0toJ?31ZfrYk@bp(o8`Koo{Luc43{!oeU+~~@Vl`R(Mu~o;INi(@VdN49OoTaApey!(_8@Z_5*-h|hw}|Pv&$Y*Rog$qf&1jOm z^z8D3z@25O^3P0^LeAk}@}lr*ZF*#Kzb&CRS{uu=Xw2$-znHb-m zxM_`VFa?NXEfb#lprEx-Vu@U1$g>G}1s=U@t>~Lij8~-Hzi|WY9K%V=ec9~(Y5gzT zEb(p56+^%81p>FaUcQ{nW3UQUK(8*@?zyEMw>r~cTzh(Jg&ITYxb)vK2;K3{5ay!@ zFV_srIYRO78!ZD3p{b)pm|k9n5r}5-?ahs$q|EL}?z%GZThY7E2`w&*7~#IW8$9OZ zaG7J<*!*J5`qB7I)z8T~r?Q`1Rjpv3Dn0&saByH%IDHk<`B_STdoTYB2B(O~l*K6; z$k0=0oW0N=mEJhi%CEUqiE1|(BYn#eTjzdliJ*roXHaULS#6Uvng>p@j{q8PP}`-J z#)XEd;&fMNi;n-yK+f~@macnYy{zwB)5Wc^JUB^)Eh$=Wu07d){n}5lqlaec*{Ld( zWUeotG6wGs{uA8E&|Rs5Nzc$b;iFH|ekGay?L>&Ww>pz;n9=RANujzn8huy7)6L)6 z6e*DlokSz&RGgIeky|_+A!uq;3q;{ro22zxN-{eEe=bMeG<(ft8`$%&c=>CCCl)<4PY&^WrU`Q1{UHCZpW=L^w%K#0eY0@uVP`<3!d}wbAc((=+4tW<|F?X&l zz5;g=QUM6DcKH6S%FAm=862#bngyQj2P;Uc|AKT$2%_ib&;Dsysn{L`iXNi#Xr~Ac zmtE$z7GjhiH^VX-gToiFVvknQ$>)Do(HNTf#vSdF_2>|nGh(RI^y8Gtzrxd9c_#LO zM6G^NQyN|K-jy|h8429>Ydv%uT|-+>v&OltTKMvKfni1&&xC_RXX%MKh#ay_>J}Gy z4t?-%&^k3Pw{ki3Ur=JzFiJ*JyU1MN#NBJYDQ&qD@={Os2bzt_>r0uz==w~Rgvb2a za9!OAwkeJ}1JEB|^YTZ7&c_kF(kd@J1_t<;nS;P$UST=%0GNgCATC-+t)_sX12pRn zNE)Gm(m=i76*5d3gkDd*yhOdcydc=+CT2Us{P?-vSVq{PMLG#~Hmn)ee*$}5iFKP_j!yXU5V!6rs!746&n<8y`~ZMWvn z?MFhovbUsUeYgUOxJW6v@$uw0!v-{YK#{JnmPT z{p(#*cOqegDgQ@>KPDZ$`;mBV!u@mx_twe1x$F4#nFFr(9)({%m-t|c8WQ-I^ycqH zM>!iEYRqt4m+qr=8dt=gb0}YZU?@IU`9+}(TaD#2y9!v}& z72?g~&%rT@flGEV`*+T<-2K=#G%O6scM$ZtIAJ^%b6UcKh;Z>CUbvoR@Sa+m(Jl!i zyt5dQ0A{20ZEt84Jl664I=j>A^vV$(O;;+O2Kb?5o8zE?Q3P(J!=oq@^%_s#`BJS z<5gA(7jKLFUsaW=47_tanGM1wAov01dQj<&{5tbK->jh?b@~w=R{8|sm!+N6Naq{D z`(&IJND_)-W+n7UmdIA6Vl)(K|0Eu(F|EjEflh9d!qE`<7FFDm`vgX|e` zp0PKp_sRZP2dPoboR>r=J>MI6gnq}jn!RO==+QN*&q(LfA9t~zd#nE9YX#QB;W6m5 z4$E`jZ2wDzOJA5L(y)e@z8VonpaMQX>T zeK@6{>Z4#1pE%k*ogFK^E}W{{B+I-p=3^)q^yQf1CXFN%r}xp5FajsA2g9AQgcegC z6IdbYYg#g=3_0Gv{4~=^HS)AH1Y`e@1T$^a&Y(X(CEzZW(@t zc~>61B;3M-p;}EWJiLan+f%PGU%XlWv#BK3p{a+;$;uig=(H4Dza2#5wKAK|j*;>C z5$C7hCue6}@1s%6zpMc>YuQ)zDq?!z3+WwJTAuFbpHGFE4w(_$n-7xt&?)!>IXObM z12C8UuZZxs<%x$fGxra#h?dRbNWH1)?e#I};gXPTI27lw3~h*!@(2GFo&x{(v$sT= zgl>$I=A?O+gbx-3XjeIA4MPJr@3wMa&1tOclJIVv1ku<_VgV^CPiaIW&d(1OG|QGR z2o;B(Dk&Y8uV}@=Zhmu4q8i~NNqT~$DJv?J$F!?xQr66E?aa{&m)X0 zwUdx&)vzc_9&Tjn)c=UuKlN*H@mdY@`sler27jZ&8UOG>nAl_A_f98wQv|iXSmzP7 zdJ$1$#ye6zamEG@7C)j}T^Qgy{) zC)Na-?%|K~GE!1A+uKT@>48+D+D~Tzdd#0QB|o85y)- z-$kksL7Qs?a15mAUhH+N9|rR0L62DR0!0v9*U;?E*D9k1YzMTvnpN-f$Rj5-fP@Ng zBLf1^ZR-}vG>f$}mvP=M1Eg@cZyDSP2fDdawr0TPME)vj5jXp_;f|aeO6j7%cV@ru z9v^pFR^6nb=>r+i!DgII*!LhpC)iqyt8}pm37J_~f>&0|(>#xK%7%)!Mvbm6PK8fq z{LwKmh{?!g-n`*OE=dU3<`^D5iU)g)pT9qlTMfaZHnL^_vI~gOGpK1pP(FSWj9h1W zngC+41S&S_^W2=AnD}_j%$5tlwXF;n+!7TP9WK%$1P~A88p5adP}y<-G~^PXCORyu z)-K-x1nUAgAqm2Hh1KVAltq2Q`{7;@3G8}H8auF6CW4U#Nz{sR&`qs)x#d)?XRuFp zI#p&M24C$599j(K-FtF=bmy$8ri!Y&u_-2T2V&w=5D^ng0K^G2D%7Qn3Hx+k9$z-+ zcK+$ei+`{S+!@>y{cB?YY%Ol*lj2ruV*_ zxv;wdCxZDKd^$9A?KN_e7kOT%n_n1b=dQ$#9@bxu5Yfdm;>1j92IquGHr!$oOeAQCa0}JQXG492V&dxAKh4@$t(3{dCh^eU`g7&5>mLC8ijp2~}vz~sNgd`Y_F0rT71_lNd z-q&7q0r~2B)??)o=r?X8xNiaoi312TB5Mo(ykPvAMyilVhm&))S-HOcs)NLibZtI{ z(96bfufxygx&i>hIRFbAgj{l@Umf ztURLXhTj$BKOEV7vSo^iiRmWtkdsrHQq-eX_jm=8G!;0ICdsOaYpeB!qKO0!W{qlu zZi!}8LFC?VJtp&09XZ|G+a|?6J0CSkG~e`xr$;f?9vx4tNi zGi6h$+l@rrzmqu19x7{er}HZqHoKOOnDTPz(l*}{39}4{7oodPK~aJ>5@xC_7qnxt z;*3Jk{_3!f9H<7ih;zDScPF*6#(L{JoAb2q*b`kOf9je~L`vW){5gvdM%5)Iq47;4 zR<5MN>wRX*!@c zUi}MnW+4Jf0fa#It#sEPcdACJZS)`{67g`H?DX_>5+Jf?2M)lMd4Im|Ra|Ogx1Gs=SY_(jjn*piE z1zyOOI)eK1YB+kY{;2_i(Yt5e3H^`u%{fXOvIGZ=CXb(MD+c_-j zG{v)3h&u?Rt$zmJW*v-}duF7SdHL^U@M>ze?$!GfeUE7+;<;&lb!(Nsli&BxtKZx* zj?a_sS)2D5!B|hfly1*|H1hSTPM`QHm?|nZ_Vjh-{`L)Q$&2AiNh|B5(Qn#xxu>yJ zs8_M~+JA`CiCXI(QRXHGYSXM(EFSX2PB$rR5s%*7(hNi{9?(B1E4#SxD2q>lGgk;W zPolVQv+FK6Ty}lE2@<+sr{&(4yyaHOS6;9IoO!_!@=cOkeZnm&s!f$XV!(o59Z^NQHh4m8ggIG?ari-Nq=zCErFD#;hh#wafHH zL@vX+w?9it+P=@f-8HpgMqI2nm4bfF_RNxniII@_vrlW-N0$VGtuE4Pn&OlCD%Cu# z25eLjrwLCH99|Xv_F9QRjGES!>JcH)HX6-Hhfq$=YKlnF~d}qx`Q$?bL*n@L) zKH>>InTbu<%M$XLTN*1FVc?mb73p~Xz1M!oeYDuL4CJSPE^_m%ll=`9<@L~XGfdQz z^KuF9YDTPuJ#$ZS{8FR+*yCs>}!cz;NM1Q8r!3f&Tex zK2^CuT6-A(L>n(JgfO^$)Es`tP11Go0K z_UBrL2eVPV&~-g<7y@!c*?Dbl+C#n(-MjBt;RyHi8l{vy&HKvrvhx5?#~aR0x5>r4 zgz@h_LZ5+i(J}zjk?tb@8>xhEVEN>zsHmV`JX{@;O&9I$?tax3dmlh<`*6T@WqYDU zEE`EVFwLP|?gOxy-uXi~VXpjDQ&VeEde@8 z6N>T-8P(EnNtGC4ry;kMkLZ{vt`ye0FM652616XUb5X&2&~tYw98bSCJ9JKo%ZFZk z=&7jQPo5#Q(*s8HiSp36a-kCMA6=sKysPNBCAM>YSjkgEXL%HKbi`-R0y9{y@M`H7 zH8j}yne|QoSeKN%cwzdXM(ZO?p0CggLgFghLvC42eS4ea39ZnUKPA1Qvs)Y++uMDB znsfz!J^;g!9=)?KYGh#@-@E2|VdrQEjZhM=#Z4qRJtG4Noh*kGo~F~KPx1!1_Gca% zCekCLf*gVM9c^!49y(ZY#@3fSsGY#eQ2Z3u%^3+WKQPBTF7@2`2jH5i;|eeYQi};g zx*C$D0Bb)1jp#TYYeyq^DWf}AH;BT&yiUdAxU3V^kaF=|hiudjueCIridAQ^2S z|D!EN!(ug6eqBg@og7P^i?}`k`g?WB{FIV+=gB78b@9=kyd_VyxVrX@fIz=iBjn-w4`AX$uVY=fgH{BK<|9+6IO+ihZJ-+?rM8zM$Qe49iBC zEQs5Sky7U5dihgGZ2#$>r^Z_AN)Lo~%M_0KzgtGD9(JRsG#)!BNIECH!*sD)3#8S%Dz5eVcD;*NW#+>QZ8 z_8}$Z#S+9`vjKmhY_03YmIU<{nfTZ79&qUpzErOFGL+{STHI1V?0b0u$}?!H@B;4&~Oc1WygezLI@U zGvU;oZ8z$tjQjc!wX%`g){=m~%ID$j-(Ts5#9f=DT9urenyB!7mso2q^c1CLQuJoG zj^fHM4(%|n#C+M~(t8WTwTpMg!y*y|3DW9re4zIIo>w@?^ITH(1>*w?-^kev0UGqB zi@so#z;N$6#b#NT_v^Ts9ooUQVPdzCc&V#@QyjfWJH#pY_)6>c9gkf;2|B$_`rHH^ zu2+X^BR)=+m6d`0hMezCH0z2}vl040WWwqK&842evP3TjUP1QB9edfOrV-} z0>~&nq!N7UtTcT|>@ySY<6I+IZ9V=041Malh;Q3^6MZ*R;GA=L03fp1e^I2@FZx zxPSD)nD*^O)$S83<=J_?u26Bp-O+tamWdlJN7E~w9FUVeLH z1gHoP2$+4A$mt8|4J%h>NPEQNDkpHQyPl|v0KCnVEwJ>)ZzN#^5R^#DHxL${%E|54 z9@pk&6s#m;prfzE=XX-OhlBafVWtHIHuPRJLScje8g-Z6;=KHf{Q8`H>;~5s1AXm& zuh8K&G69}j?KdfQ3lwzg@uP4hlng7y7l(Nnpf3QQ_4Q1P?*-H_XMD~fVaW&cMd}=K zg$M*mf}E6u`qWk&RnZn9GknnDYxp{iY41BzySb|8=jPtvo`7??53J13pnVF1YX9lg zMpM&KTvMld4dDoerRuTOX+!sANLjDM)z#I(+DI5oSESz(8nBuTUG!afnd z7ZI4d^-H@Ve#R@h0sq6d6qJv5lG|GlDb5B7;u+VL1?iEa3&vrGl22QqpFLZk42l2CpJ30|MOn z(;oZy&}vB$cKrYuF|IEcGvBWNp;ifpT}7*Yid9H+stzz$t^g<(aF`3wTAyB|_#2wF z12G&(e|rFt@O}@EY4IFXgG;c!HWeS{?=aUSd*(mKN~0LQ)D_*wF>HqO}B3@0sf)5bRvStd3!#kkSyOPmRt`ClW_?EFP6 zMu>cC+Qi)N=$uL_O#F+%^7LzIYAQZiN6$A+RWGu^W>cJZ?*EMyKmGI{rUZYRqEaDS zGLh1>`zIlGFUyd_N5**VJqvw384~_*DI*BgWoqZLudna3bkV8#*Iw+z&}oCAwKCo8 zon&KVWYlnVwvP09Es9biH*GiLS?F^RQ|MmZjJn12YzEq32RojsB!TdR<4-G!f}z#& z72N%060BfHH-ko@zVt|3R@SP)u`@IT#bD!lnv_8@8r8_E_8oj@-4{FjcK=e~Muf-h zz&t8Pq;*yA2<(3!BkuCYWB;^2oF6p)J3XBai>Ag{)H)Pz|93|)@a?UY$n0?(#b0E? z3sksqTYs0Y`uQw}S>ibiO7qU@bdM9^0QOB>am|Z8y+(_Qseye$2fH^-M8U-5o^yRF zbgdJSlpS5t{`Q-cbIuv$(o)1^$z7vi^Q(8=CL8lOaihEm3v_l`mEUD>6T)v750flUM`bVTS>m1}Y-y%ia3!QmyJUZs zswb#mXfGDW$N;!i%-P?WrsO9!sOZ1`&K#M|?l0?p96rR$w;kfo<&+vmV>!(GvmiK6 z*a=&zn8PQe0I5)^@qX#ITgmQFE zP>xX}f}GvO1nwg$zu<<{UtF)rXLS1R@3eED{9}JR$B2)4Ycl@1G&))SJ#-7(P5sN6oqSLYs?j%|$kBBcS!* zv0HSclxkPjvabF*+)5tp)O`Rof*jRtpS%3FNNSr8&)EtXOUs<415SwR$uSphQllDp z;md{m=Gr3g;k&b=Kxa~$gU8K^K?Ih11ovW(@>7yDF1G6(Cmp}7U||{#6r;${0;Z1G`4})dboKC+$M>5J5djJ zRB5oBU8b-J0@JvZ8>+gd_lMcE8%e!9Zb`o6F_(~wPJK}@&%uZqM@_V{{A}nIzE3!5 zjteK<+FMzxcj!hattQXb$OXULTSQ(o?*dN;t(P(G1?vl>9Atsw=6`Ph4)<7emJ7Hm zS=tH=jVl&j)12u>PcYV%4nN1~w0`-H)jjHCiMcs9s6;o^LYGo^`N25j*Lt+tg7n4d zN$cV06ECh5(apMe8z0gOg+GT1LKsogI53yLE4Y8^j93Krrhbsbe>LO*!z15zr|WK~@ywEH^`>97}Lo zp!){P3vBh65fpsJuz6PzVY2`H;{7yuQG#eE-EPfcIl=~8XhU458XIRnI4RTKR75;Z0?zTlOW||^w~qYr2rl+!_7xji4>@qf3{iXa>iXRPS!iHrex@t^eM)p zD?Gn*YNNFjqI9-;eVg=&)Ft-)bfF_yf8PlIJCXBU`70e3fsN{fP|l$2L%?BhtD!>L!MQW-lTer^>4^v<;5Is#I{I!BznYkP zp(mPqJW5!x)ss_X-5VP%ikdK$#5(cv=aF|V(W7XO7C#xC+F6-yIhOCWE_hu@HkEWR zVHD4KV6IVuo@KbTCP1?&N9wzGG!}4%{5Z>TUddQ2+t8moEh5U&`Vlh*MYvl zN5ImLvWSEW{fVZv)&tk2)2BXAQVp^>;2Txrb~Hq|s&RP}_(km;xB7jGkgR7I|^4zBkOix^BlVe~r(k zM?jZ}GS=~SK?t?Ng5ptT%<@m^@4iuMVRBp_=YP_dtk52PKzv}_4&3RuA=ooz&NNm- zh0hj6JkS3kk^(tOpMFNLDd_7{GsuJ+t`6oP0)m3}XM#~_z3qPx8auRJ1ee~ zr^l1do+(3f{DorLg`D;5s1$TtvYF$G)*-z|qd6_QPw@+zUZbtTes| zpwuiA?Hukv^|o5{Q}V#arW7_?2vqqSY@WL}Ar$50`BUlwpV+bezei4wVR#Bx7{D{` zgwsUCI;%_+^>64WLDWTw!zn~G;89#?k@%x&5Mu@X7**iC`O#3xmXO=#hWXql@mJ}J z`3rGsp(xT)nF18{vz5M#)2Xk14LY$IxT1WzH2%th6Mlj#EZB7)(cRG*x`T~jz}nVF zGh5`BgD?^ZQGWi%?Jh3ff{?CiMqoxiqE@^qJMo1q=ADi_7P8*`G#-stL-MVx1{7F0 z?0S)f+MKM4{ZgLKNtY^wJeku)t+ORQ(vo>yU{s)Z$1q4EhxyI>2-d#A9ECe@JX>9T zu9nInWRYaD%q-g(o+sTEP~G|1G?kA&)Ia#1)9I1dnp}@1 zMd|9?E7?@F&k9YxG+N>g1;ehXkDo+Q??lP6^G1cB@+$9%2V{&rk>C*sOuT>FNC3~| z<)1J{<@^1{zbd62TQ$XVZD^ch!u+tmQb@#TdU0F05S!!kz2a(DSt$RYANzfF@{$DC zj9yxgj_s_T_F=V%!Ee2=Uo#A{{|%*kstC>0uV#J7yba)z22X9Jyyqpy1LSr%)a8RU zcGDCkn9(UIP%n6*$zzrC|3 zkmd^vYDE}a$Fx&JP3S7?8XGkHRrbknLJ9K z$5^YgwI^-Q{I2+GG2Xxj-8^3sZ{!*t^Att99&UV)S#$8@pTg~g7Tsu*r#svq$N^{y z8y_EJ2Jv!i>;beqJRc!q7PO2YH4^|ahY8&End_eVl7fqT$ulBo!>eA%{kH*O%q-?W zdl%w^_5f+|1^UHPO6ApD7g8LrI}@JvtdE5pPT5eg|9k5VkC8$Rs20DPc9S`8 zjI~192?>iiwY4W7I^o_sD=W)<@G~|PkGX(~zjyB*5e62?=KK9Gyg}6jVCy`Gx9VM`?P?%_X3aPSHgXKl@1zFq( z+E9s{13m;w(gtIpOXtf|_=Wb;;nn{MH~t-k8bsR}ulRlw{WLOskAw07KAVl;%gRQ_ z+Z1uHuRK?+8`I-a{5e^e(%jbWBXMmYN__`6!^$Mmky!ulXubR-i(tR z3&e0Bd!eL!!Pu=46aRZ_qhq7zilcMiyI@@1nh~2*W~NAYz}|2)v?2r*ogkD_&|KZK z<3p|&zdf(_6yq^2S4T9_8=>7+26IE(m#^I&9l0UR;{SVF=|R@#az`fKt=obI4q1l# zq{RMwjDt0}%(&IDdRj#V*rON(jC4EB^qyt1w93(_O8>2HAtXN3?d|RMbM4qYqB2Z9 za`!SWu^p*oiQAkG!><)sB%Q>ce&)D-krXUfmH8ovNJpUZ8M>MQ^ED3HrfJoFzN_ZH+JTItkiG=Z{v`Uh2N zXEwIbyw+P3MqCX12xZMYyH2Kt^CJujf3CvU7wX=Aikco8JWL}#Oz1~9yHn*~P35?@h8)d=^eBZsf|Bd1p)beUM z*2k?)lQxtbPiM6ya60$Z1a#g7Q@X#7>sBR2(^Mmm5sew<(Ic`Jzt#KJ!xL}wXLV4t z4M$t4g_L$yFz$*}u%I8=)n@Q+*!K+bMU4NQE9fz1M(8`!eigKRPq{D8m@N>&c8>AI zdij38<1d#5)nZcR&o5KR9^IG8y3E4jzkfn*ZQd3sjoogH)jmotpOHyNEb1`K-`V}+ zKk>X2Jx0cVhbqv~zy4X={J+Hmo}B!DQxSO_i2dK*3QG#h|9yfOROSD@LMcc5ookeG X+*I3|5P3EP{F9S@E>$XN==c8s6ilc6 From ba940112420ad248cac8e6a95d4e5da8ca6216fb Mon Sep 17 00:00:00 2001 From: Diego Cammarano Date: Fri, 27 Sep 2024 11:49:17 +0200 Subject: [PATCH 37/87] Update ESACCI Landcover CMORizer (python version) and downloader (pft yearly data, v2.0.8) (#3727) Co-authored-by: Manuel Schlund --- doc/sphinx/source/input.rst | 12 +- .../data/cmor_config/ESACCI-LANDCOVER.yml | 32 +++ esmvaltool/cmorizers/data/datasets.yml | 30 +-- .../downloaders/datasets/esacci_landcover.py | 52 +++++ .../data/formatters/datasets/agcd.py | 2 +- .../data/formatters/datasets/anuclimate.py | 2 +- .../data/formatters/datasets/aphro_ma.py | 4 +- .../data/formatters/datasets/berkeleyearth.py | 4 +- .../data/formatters/datasets/ceres_ebaf.py | 2 +- .../data/formatters/datasets/cowtanway.py | 2 +- .../cmorizers/data/formatters/datasets/cru.py | 2 +- .../data/formatters/datasets/ct2019.py | 4 +- .../data/formatters/datasets/duveiller2018.py | 6 +- .../formatters/datasets/eppley_vgpm_modis.py | 2 +- .../formatters/datasets/esacci_landcover.ncl | 217 ------------------ .../formatters/datasets/esacci_landcover.py | 190 +++++++++++++++ .../data/formatters/datasets/esacci_oc.py | 2 +- .../data/formatters/datasets/esacci_sst.py | 2 +- .../formatters/datasets/esacci_watervapour.py | 2 +- .../data/formatters/datasets/esdc.py | 2 +- .../data/formatters/datasets/esrl.py | 2 +- .../data/formatters/datasets/fluxcom.py | 6 +- .../data/formatters/datasets/ghcn_cams.py | 2 +- .../data/formatters/datasets/gistemp.py | 2 +- .../data/formatters/datasets/glodap.py | 2 +- .../data/formatters/datasets/hwsd.py | 2 +- .../data/formatters/datasets/jma_transcom.py | 2 +- .../data/formatters/datasets/lai3g.py | 4 +- .../data/formatters/datasets/landflux_eval.py | 2 +- .../formatters/datasets/landschuetzer2016.py | 2 +- .../formatters/datasets/landschuetzer2020.py | 2 +- .../data/formatters/datasets/mls_aura.py | 2 +- .../data/formatters/datasets/mobo_dic_mpim.py | 2 +- .../cmorizers/data/formatters/datasets/mte.py | 3 +- .../data/formatters/datasets/ncep_ncar_r1.py | 5 +- .../cmorizers/data/formatters/datasets/ndp.py | 2 +- .../data/formatters/datasets/noaa_ersstv5.py | 2 +- .../formatters/datasets/oceansoda_ethz.py | 6 +- .../data/formatters/datasets/persiann_cdr.py | 2 +- .../cmorizers/data/formatters/datasets/phc.py | 2 +- .../data/formatters/datasets/regen.py | 4 +- .../formatters/datasets/scripps_co2_kum.py | 2 +- .../data/formatters/datasets/wfde5.py | 2 +- .../cmorizers/data/formatters/datasets/woa.py | 2 +- esmvaltool/cmorizers/data/utilities.py | 31 ++- .../recipes/examples/recipe_check_obs.yml | 4 +- esmvaltool/references/esacci-landcover.bibtex | 11 +- tests/unit/cmorizers/test_utilities.py | 33 ++- 48 files changed, 392 insertions(+), 322 deletions(-) create mode 100644 esmvaltool/cmorizers/data/cmor_config/ESACCI-LANDCOVER.yml create mode 100644 esmvaltool/cmorizers/data/downloaders/datasets/esacci_landcover.py delete mode 100644 esmvaltool/cmorizers/data/formatters/datasets/esacci_landcover.ncl create mode 100644 esmvaltool/cmorizers/data/formatters/datasets/esacci_landcover.py diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index 798b2ceb27..1a56e4fcd5 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -298,7 +298,17 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESACCI-FIRE | burntArea (Lmon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| ESACCI-LANDCOVER | baresoilFrac, cropFrac, grassFrac, shrubFrac, treeFrac (Lmon) | 2 | NCL | +| ESACCI-LANDCOVER v1.6.1 | baresoilFrac, cropFrac, grassFrac, shrubFrac, treeFrac (Lmon) | 2 | NCL | +| | | | (CMORizer | +| | | | available until | +| | | | ESMValTool | +| | | | v2.11.0) | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| ESACCI-LANDCOVER v2.0.8 | baresoilFrac, cropFrac, grassFrac, shrubFrac, treeFrac (Lmon, frequency=yr) | 2 | Python | +| | | | (CMORizer | +| | | | available since | +| | | | ESMValTool | +| | | | v2.12.0) | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESACCI-LST | ts (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ diff --git a/esmvaltool/cmorizers/data/cmor_config/ESACCI-LANDCOVER.yml b/esmvaltool/cmorizers/data/cmor_config/ESACCI-LANDCOVER.yml new file mode 100644 index 0000000000..925057dc12 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/ESACCI-LANDCOVER.yml @@ -0,0 +1,32 @@ +attributes: + project_id: 'OBS' + dataset_id: 'ESACCI-LANDCOVER' + tier: 2 + modeling_realm: sat + institution: 'Universite catholique de Louvain' + reference: 'esacci-landcover' + source: 'ftp://anon-ftp.ceda.ac.uk/neodc/esacci/land_cover/data/pft' + title: 'ESA CCI Land Cover' + version: 'v2.0.8' + comment: '' +filename: ESACCI-LC-L4-PFT-Map-300m-P1Y-{year}-v2.0.8.nc +variables: + baresoilFrac: + mip: Lmon + long_name: 'BARE' + frequency: yr + cropFrac: + mip: Lmon + long_name: 'GRASS-MAN' + frequency: yr + grassFrac: + mip: Lmon + long_name: 'GRASS-NAT' + frequency: yr + shrubFrac: + mip: Lmon + frequency: yr + treeFrac: + mip: Lmon + frequency: yr + diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index dabe314025..7add495dad 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -473,25 +473,17 @@ datasets: ESACCI-LANDCOVER: tier: 2 - source: ftp://anon-ftp.ceda.ac.uk/neodc/esacci/land_cover/data/land_cover_maps/ - last_access: 2019-01-10 - info: | - Download the 3 NetCDF files for 2000, 2005 and 2010. - Download the CCI-LC Tools from: - http://maps.elie.ucl.ac.be/CCI/viewer/download/lc-user-tools-3.14.zip - Unpack and run the CCI-LC Tools on each of the NetCDF files as follows: - bash lc-user-tools-3.14/bin/aggregate-map.sh \ - -PgridName=GEOGRAPHIC_LAT_LON -PnumMajorityClasses=1 \ - -PoutputAccuracy=false -PoutputPFTClasses=true \ - -PoutputLCCSClasses=false -PnumRows=360 - Put the resulting processed data in input_dir_path. - - Caveats - The CCI-LC Tools must be applied before running this script. - The CCI-LC Tools require Java Version 7 or higher. - The input data are available for a single year and are copied over to - generate a time series over their time range of validity. - + source: ftp://anon-ftp.ceda.ac.uk/neodc/esacci/land_cover/data/pft/v2.0.8/ + last_access: 2024-07-11 + info: | + Download and processing instructions: + Use the following CLI to download all the files: + esmvaltool data download ESACCI-LANDCOVER + The underlying downloader is located here: + /ESMValTool/esmvaltool/cmorizers/data/downloaders/datasets/esacci_landcover.py + and it will download all the files currently available on CEDA (1992-2020) + under a single directory as follow: ${RAWOBS}/Tier2/ESACCI-LANDCOVER + ESACCI-LST: tier: 2 source: On CEDA-JASMIN, /gws/nopw/j04/esacci_lst/public diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/esacci_landcover.py b/esmvaltool/cmorizers/data/downloaders/datasets/esacci_landcover.py new file mode 100644 index 0000000000..efffa2aaaa --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/esacci_landcover.py @@ -0,0 +1,52 @@ +"""Script to download ESACCI-LANDCOVER pft data from the CEDA.""" + +from datetime import datetime + +from esmvaltool.cmorizers.data.downloaders.ftp import CCIDownloader + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + # Default start and end dates if not provided + if not start_date: + start_date = datetime(1992, 1, 1) + if not end_date: + end_date = datetime(2020, 12, 31) + + # Initialize the downloader + downloader = CCIDownloader( + config=config, + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + downloader.ftp_name = 'land_cover' + downloader.connect() + + # Set current working directory to the main directory with the files + downloader.set_cwd('/pft/v2.0.8/') + + # Create a regex pattern to match any .nc files + year_range = '|'.join(str(year) for year in range(start_date.year, + end_date.year + 1)) + pattern = rf".*-(?:{year_range}).*\.nc$" + + # Download all .nc files in the directory + downloader.download_folder('.', filter_files=pattern) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/agcd.py b/esmvaltool/cmorizers/data/formatters/datasets/agcd.py index a8b138f7b9..f0d6b290ef 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/agcd.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/agcd.py @@ -80,7 +80,7 @@ def _extract_variable(cmor_info, attrs, filepath, out_dir): utils.fix_var_metadata(cube, cmor_info) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) bounds = get_time_bounds(cube.coords('time')[0], 'mon') cube.coords('time')[0].bounds = bounds utils.set_global_atts(cube, attrs) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/anuclimate.py b/esmvaltool/cmorizers/data/formatters/datasets/anuclimate.py index 0077bd17a4..f82ad295ca 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/anuclimate.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/anuclimate.py @@ -87,7 +87,7 @@ def _extract_variable(cmor_info, attrs, filepaths, out_dir): for cbls in [cbls_1, cbls_2]: iris.util.equalise_attributes(cbls) cubesave = cbls.concatenate_cube() - utils.fix_coords(cubesave) + cubesave = utils.fix_coords(cubesave) logger.info("Saving file") utils.save_variable(cubesave, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/aphro_ma.py b/esmvaltool/cmorizers/data/formatters/datasets/aphro_ma.py index 002c83662d..1e1f9dbc4b 100755 --- a/esmvaltool/cmorizers/data/formatters/datasets/aphro_ma.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/aphro_ma.py @@ -94,7 +94,7 @@ def _extract_variable(short_name, var, cfg, filepath, out_dir, version): # fix coordinates if 'height2m' in cmor_info.dimensions: utils.add_height2m(cube) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) # Fix metadata attrs = cfg['attributes'].copy() @@ -124,7 +124,7 @@ def _extract_variable(short_name, var, cfg, filepath, out_dir, version): attrs['mip'] = 'Amon' # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) # Save variable utils.save_variable(cube, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/berkeleyearth.py b/esmvaltool/cmorizers/data/formatters/datasets/berkeleyearth.py index 81e4909584..c2be3dce7e 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/berkeleyearth.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/berkeleyearth.py @@ -172,7 +172,7 @@ def _extr_var_n_calc_abs_tas(short_name, var, cfg, filepath, out_dir): for s_name, cube in zip(short_names, [cube_abs, cube_anom]): cmor_info = cfg['cmor_table'].get_variable(var['mip'], s_name) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) if 'height2m' in cmor_info.dimensions: utils.add_height2m(cube) @@ -209,7 +209,7 @@ def _extr_var_n_calc_abs_tas(short_name, var, cfg, filepath, out_dir): cube_sftlf = cubes.extract(NameConstraint(var_name=raw_var_sftlf))[0] # fix coordinates - utils.fix_coords(cube_sftlf) + cube_sftlf = utils.fix_coords(cube_sftlf) # cmorize sftlf units cmor_info_sftlf = cfg['cmor_table'].get_variable(var['rawsftlf_mip'], diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ceres_ebaf.py b/esmvaltool/cmorizers/data/formatters/datasets/ceres_ebaf.py index c63f72170a..e02332130d 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/ceres_ebaf.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/ceres_ebaf.py @@ -50,7 +50,7 @@ def _extract_variable(short_name, var, cfg, filepath, out_dir): utils.convert_timeunits(cube, 1950) # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) # Fix metadata attrs = cfg['attributes'] diff --git a/esmvaltool/cmorizers/data/formatters/datasets/cowtanway.py b/esmvaltool/cmorizers/data/formatters/datasets/cowtanway.py index 76c9d525c8..dc2073f825 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/cowtanway.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/cowtanway.py @@ -43,7 +43,7 @@ def _extract_variable(short_name, var, vkey, version, cfg, filepath, out_dir): utils.convert_timeunits(cube, 1950) # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) if 'height2m' in cmor_info.dimensions: utils.add_height2m(cube) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/cru.py b/esmvaltool/cmorizers/data/formatters/datasets/cru.py index 03d1ac77f4..28d1f9fb7e 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/cru.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/cru.py @@ -72,7 +72,7 @@ def _extract_variable(short_name, var, cfg, filepath, out_dir): Unit("days since 1950-1-1 00:00:00", calendar="gregorian")) # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) if "height2m" in cmor_info.dimensions: utils.add_height2m(cube) if version not in ["TS4.02"]: diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ct2019.py b/esmvaltool/cmorizers/data/formatters/datasets/ct2019.py index 395d78e25d..33f56f234d 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/ct2019.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/ct2019.py @@ -39,7 +39,7 @@ def _add_aux_coords(cube, input_files, coords_to_add): logger.info("Adding auxiliary coordinate '%s' to '%s'", coord_name, cube.var_name) coord_cube = _load_cube(input_files, coord_name) - utils.fix_coords(coord_cube) + coord_cube = utils.fix_coords(coord_cube) dim_coords = [c.name() for c in coord_cube.coords(dim_coords=True)] if 'boundary' in dim_coords: (points, bounds) = _interpolate_center(coord_cube) @@ -166,7 +166,7 @@ def _extract_variable(short_name, var, cfg, input_files, out_dir): utils.convert_timeunits(cube, 1950) # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) # Fix metadata attrs = cfg['attributes'] diff --git a/esmvaltool/cmorizers/data/formatters/datasets/duveiller2018.py b/esmvaltool/cmorizers/data/formatters/datasets/duveiller2018.py index 8e070a3ae0..a793f8cbb1 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/duveiller2018.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/duveiller2018.py @@ -111,13 +111,9 @@ def extract_variable(var_info, raw_info, out_dir, attrs): # Fix metadata fix_var_metadata(cube, var_info) # Fix coords - fix_coords(cube) + cube = fix_coords(cube) # Now set the time coordinate properly fix_time_coord_duveiller2018(cube) - # Latitude has to be increasing so flip it - # (this is not fixed in fix_coords) - logger.info("Flipping dimensional coordinate latitude") - cube = cube[:, ::-1, :] # Global attributes set_global_atts(cube, attrs) save_variable(cube, var, out_dir, attrs, local_keys=['positive']) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/eppley_vgpm_modis.py b/esmvaltool/cmorizers/data/formatters/datasets/eppley_vgpm_modis.py index 6a6d15d267..6fae2d2d1e 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/eppley_vgpm_modis.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/eppley_vgpm_modis.py @@ -54,7 +54,7 @@ def extract_variable(var_info, raw_info, out_dir, attrs): for cube in cubes: if cube.var_name == rawvar: fix_var_metadata(cube, var_info) - fix_coords(cube) + cube = fix_coords(cube) _fix_data(cube, var) set_global_atts(cube, attrs) save_variable( diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esacci_landcover.ncl b/esmvaltool/cmorizers/data/formatters/datasets/esacci_landcover.ncl deleted file mode 100644 index 8472cef6fb..0000000000 --- a/esmvaltool/cmorizers/data/formatters/datasets/esacci_landcover.ncl +++ /dev/null @@ -1,217 +0,0 @@ -; ############################################################################# -; ESMValTool CMORizer for ESACCI-LANDCOVER data -; ############################################################################# -; -; Tier -; Tier 2: other freely-available dataset. -; -; Source -; ftp://anon-ftp.ceda.ac.uk/neodc/esacci/land_cover/data/land_cover_maps/ -; -; Last access -; 20190110 -; -; Download and processing instructions -; Download the 3 NetCDF files for 2000, 2005 and 2010. -; Download the CCI-LC Tools from: -; http://maps.elie.ucl.ac.be/CCI/viewer/download/lc-user-tools-3.14.zip -; Unpack and run the CCI-LC Tools on each of the NetCDF files as follows: -; bash lc-user-tools-3.14/bin/aggregate-map.sh \ -; -PgridName=GEOGRAPHIC_LAT_LON -PnumMajorityClasses=1 \ -; -PoutputAccuracy=false -PoutputPFTClasses=true \ -; -PoutputLCCSClasses=false -PnumRows=360 -; Put the resulting processed data in input_dir_path. -; -; Caveat -; The CCI-LC Tools must be applied before running this script. -; The CCI-LC Tools require Java Version 7 or higher. -; The input data are available for a single year and are copied over to -; generate a time series over their time range of validity. -; -; Modification history -; 20190110-righi_mattia: rewritten in NCL for v2. -; 20160714-benjamin_mueller: written. -; -; ############################################################################# -loadscript(getenv("esmvaltool_root") + \ - "/data/formatters/interface.ncl") - -begin - - ; Script name (for logger) - DIAG_SCRIPT = "esacci_landcover.ncl" - - ; Source name - OBSNAME = "ESACCI-LANDCOVER" - - ; Tier - TIER = 2 - - ; Years - YEARS = (/2000, 2005, 2010/) - - ; Variable names - VAR = \ - (/"baresoilFrac", "cropFrac", "grassFrac", "shrubFrac", "treeFrac"/) - - ; Corresponding aggregation classes in the raw data - CLASSES = [/"Bare_Soil", \ - "Managed_Grass", \ - "Natural_Grass", \ - (/"Shrub_Broadleaf_Deciduous", \ - "Shrub_Broadleaf_Evergreen", \ - "Shrub_Needleleaf_Evergreen"/), \ - (/"Tree_Broadleaf_Deciduous", \ - "Tree_Broadleaf_Evergreen", \ - "Tree_Needleleaf_Deciduous", \ - "Tree_Needleleaf_Evergreen"/)/] - - ; MIPs - MIP = (/"Lmon", "Lmon", "Lmon", "Lmon", "Lmon"/) - - ; Frequency - FREQ = (/"mon", "mon", "mon", "mon", "mon"/) - - ; CMOR table - CMOR_TABLE = getenv("cmor_tables") + "/cmip5/Tables/CMIP5_Lmon" - - ; Type - TYPE = "sat" - - ; Version - VERSION = "L4-LCCS-Map-300m-P5Y-aggregated-0.500000Deg" - - ; Global attributes - SOURCE = "ftp://anon-ftp.ceda.ac.uk/neodc/esacci/land_cover/data/" - REF = "Defourny, P.: ESA Land Cover Climate Change Initiative " + \ - "(Land_Cover_cci): Global Land Cover Maps, Version 1.6.1. " + \ - "Centre for Environmental Data Analysis, " + \ - "http://catalogue.ceda.ac.uk/uuid/4761751d7c844e228ec2f5fe11b2e3b0, 2016." - COMMENT = "" - -end - -begin - - do yy = 0, dimsizes(YEARS) - 1 - - fname = \ - input_dir_path + "ESACCI-LC-" + VERSION + "-" + YEARS(yy) + "-v1.6.1.nc" - - f = addfile(fname, "r") - - ; Create time coordinate - YEAR1 = YEARS(yy) - 2 - YEAR2 = YEARS(yy) + 2 - time = create_timec(YEAR1, YEAR2) - - do vv = 0, dimsizes(VAR) - 1 - - log_info("Processing " + VAR(vv) + " (" + MIP(vv) + ")") - - ; Set classes to be added up - class = CLASSES[vv] - - ; Save mask before adding up classes - do cc = 0, dimsizes(class) - 1 - qq = f->$class(cc)$ - replace_ieeenan(qq, FILL, 0) - qq@_FillValue = FILL - tmp = ismissing(qq) - delete(qq) - if (cc.eq.0) then - lmask = tmp - else - lmask := lmask .and. tmp - end if - delete(tmp) - end do - - ; Add up classes - do cc = 0, dimsizes(class) - 1 - log_info(" adding class " + class(cc)) - tmp = f->$class(cc)$ - replace_ieeenan(tmp, FILL, 0) - tmp@_FillValue = FILL - tmp = where(ismissing(tmp), 0., tmp) - if (cc.eq.0) then - xx = tmp - else - xx = xx + tmp - end if - delete(tmp) - end do - delete(class) - - ; Reapply mask of missing values - xx = where(lmask, xx@_FillValue, xx) - - ; Define output array - output = \ - new((/dimsizes(time), dimsizes(xx&lat), dimsizes(xx&lon)/), float) - output!0 = "time" - output&time = time - output!1 = "lat" - output&lat = xx&lat - output!2 = "lon" - output&lon = xx&lon - output = conform(output, xx, (/1, 2/)) - delete(xx) - - ; Set standard fill value - output@_FillValue = FILL - - ; Convert units - output = output * 100 - output@units = "%" - - ; Format coordinates - output!0 = "time" - output!1 = "lat" - output!2 = "lon" - format_coords(output, YEAR1 + "0101", YEAR2 + "1231", FREQ(vv)) - - ; Set variable attributes - tmp = format_variable(output, VAR(vv), CMOR_TABLE) - delete(output) - output = tmp - delete(tmp) - - ; Calculate coordinate bounds - bounds = guess_coord_bounds(output, FREQ(vv)) - - ; Set global attributes - gAtt = set_global_atts(OBSNAME, TIER, SOURCE, REF, COMMENT) - - ; Output file - DATESTR = YEAR1 + "01-" + YEAR2 + "12" - fout = output_dir_path + \ - str_join((/"OBS", OBSNAME, TYPE, VERSION, \ - MIP(vv), VAR(vv), DATESTR/), "_") + ".nc" - - ; Special case for baresoilFrac: add auxiliary coordinate - if (VAR(vv).eq."baresoilFrac") then - output@coordinates = "type" - end if - - ; Write variable - write_nc(fout, VAR(vv), output, bounds, gAtt) - delete(gAtt) - delete(output) - delete(bounds) - - ; Special case for baresoilFrac: add auxiliary coordinate - if (VAR(vv).eq."baresoilFrac") then - type = tochar("bare_ground") - type!0 = "strlen" - type@long_name = "surface type" - type@standard_name = "area_type" - w = addfile(fout, "w") - w->type = type - delete(w) - end if - - end do - end do - -end diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esacci_landcover.py b/esmvaltool/cmorizers/data/formatters/datasets/esacci_landcover.py new file mode 100644 index 0000000000..d0e4d9d722 --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/esacci_landcover.py @@ -0,0 +1,190 @@ +"""ESMValTool CMORizer for ESACCI-LANDCOVER pft data. + +Tier + Tier 2: other freely-available dataset. + +Source + ftp://anon-ftp.ceda.ac.uk/neodc/esacci/land_cover/data/pft/ + +Last access + 20240626 + +Download and processing instructions + Download the data from: + pft/v2.0.8/ + Put all files under a single directory (no subdirectories with years). + in ${RAWOBS}/Tier2/ESACCI-LANDCOVER + +""" + +import os +import glob +import logging +from datetime import datetime +import iris +import numpy as np + +from esmvaltool.cmorizers.data.utilities import ( + fix_coords, + fix_var_metadata, + set_global_atts, + add_typebare, + save_variable, +) + +# Configure logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# Enable the new split-attributes handling mode +iris.FUTURE.save_split_attrs = True + + +def average_block(data, block_size): + """Average the data within each block of size block_size. + + Parameters + ---------- + data : numpy.ndarray + The input data array to be block averaged. + block_size : int + The size of the block used for averaging. The data is averaged + within non-overlapping blocks of this size along the spatial dimensions + (latitude and longitude). + + Returns + ------- + numpy.ndarray + The block-averaged data array. + """ + shape = data.shape + reshaped_data = data.reshape(shape[0], shape[1] // block_size, + block_size, shape[2] // block_size, + block_size) + averaged_data = reshaped_data.mean(axis=(2, 4)) + return averaged_data + + +def regrid_iris(cube): + """Regrid the cubes using block averaging. + + Parameters + ---------- + cube : iris.cube.Cube + The input data cube to be regridded. + + Returns + ------- + iris.cube.Cube + The regridded data cube. + + Notes + ----- + The block size is set to 100, which means the data will be averaged within + non-overlapping blocks of 100x100 grid cells along the spatial dimensions. + """ + logger.info("Regridding using block averaging") + + block_size = 100 # Number of grid cells to average in each block + + combined_data = average_block(cube.data, block_size) + + # Define target latitude and longitude ranges + target_lats = np.linspace(90 - 0.5 * (180 / combined_data.shape[1]), + -90 + 0.5 * (180 / combined_data.shape[1]), + combined_data.shape[1]) + target_lons = np.linspace(-180 + 0.5 * (360 / combined_data.shape[2]), + 180 - 0.5 * (360 / combined_data.shape[2]), + combined_data.shape[2]) + + combined_cube = iris.cube.Cube(combined_data, + dim_coords_and_dims=[ + (cube.coord('time'), 0), + (iris.coords.DimCoord( + target_lats, + standard_name='latitude', + units='degrees'), 1), + (iris.coords.DimCoord( + target_lons, + standard_name='longitude', + units='degrees'), 2)]) + + combined_cube.coord('latitude').guess_bounds() + combined_cube.coord('longitude').guess_bounds() + + return combined_cube + + +def regrid_fix(cube, glob_attrs, var_name, var_info): + """Regrid cube and fixes. + + Regrids the cube, fixes metadata, coordinates and glob_attrs. + + Parameters + ---------- + cube: iris.cube.Cube + Data cube to be regridded. + + vals: dict + Variable long_name. + + glob_attrs: dict + Dictionary holding cube metadata attributes. + + var_name: str + Variable name. + + var_info: dict + Dictionary holding cube metadata attributes. + + Returns + ------- + cube: iris.cube.Cube + data cube regridded and with fixed coordinates. + """ + logger.info("Regridding cube for %s", var_name) + regridded_cube = regrid_iris(cube) + fix_var_metadata(regridded_cube, var_info) + regridded_cube = fix_coords(regridded_cube) + set_global_atts(regridded_cube, glob_attrs) + + return regridded_cube + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorize data.""" + glob_attrs = cfg['attributes'] + if not start_date: + start_date = datetime(1992, 1, 1) + if not end_date: + end_date = datetime(2020, 12, 31) + + for year in range(start_date.year, end_date.year + 1): + inpfile_pattern = os.path.join(in_dir, cfg['filename']) + year_inpfile_pattern = inpfile_pattern.format(year=year) + inpfiles = sorted(glob.glob(year_inpfile_pattern)) + for inpfile in inpfiles: + cubes = iris.load(inpfile) + for var_name, vals in cfg['variables'].items(): + var_info = cfg['cmor_table'].get_variable(vals['mip'], + var_name) + glob_attrs['mip'] = vals['mip'] + glob_attrs['frequency'] = vals['frequency'] + if var_name == 'shrubFrac': + cube = cubes.extract_cube('SHRUBS-BD') + \ + cubes.extract_cube('SHRUBS-BE') + \ + cubes.extract_cube('SHRUBS-ND') + \ + cubes.extract_cube('SHRUBS-NE') + elif var_name == 'treeFrac': + cube = cubes.extract_cube('TREES-BD') + \ + cubes.extract_cube('TREES-BE') + \ + cubes.extract_cube('TREES-ND') + \ + cubes.extract_cube('TREES-NE') + else: + cube = cubes.extract_cube(vals['long_name']) + regridded_cube = regrid_fix(cube, glob_attrs, + var_name, var_info) + if var_name == 'baresoilFrac': + add_typebare(regridded_cube) + save_variable(regridded_cube, var_name, out_dir, glob_attrs, + unlimited_dimensions=['time']) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esacci_oc.py b/esmvaltool/cmorizers/data/formatters/datasets/esacci_oc.py index 9ac8ac1a76..c267222c5c 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/esacci_oc.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/esacci_oc.py @@ -114,7 +114,7 @@ def extract_variable(var_info, raw_info, out_dir, attrs): if cube.var_name == rawvar: fix_var_metadata(cube, var_info) _fix_time(cube, var_info.frequency) - fix_coords(cube, overwrite_time_bounds=False) + cube = fix_coords(cube, overwrite_time_bounds=False) cube = _add_depth_coord(cube) _fix_data(cube, var) set_global_atts(cube, attrs) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esacci_sst.py b/esmvaltool/cmorizers/data/formatters/datasets/esacci_sst.py index 8e55296f9e..c009b96ffb 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/esacci_sst.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/esacci_sst.py @@ -62,7 +62,7 @@ def extract_variable(var_info, raw_info, attrs, year): # Fix cube fix_var_metadata(cube, var_info) convert_timeunits(cube, year) - fix_coords(cube) + cube = fix_coords(cube) set_global_atts(cube, attrs) return cube diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esacci_watervapour.py b/esmvaltool/cmorizers/data/formatters/datasets/esacci_watervapour.py index d4901007cc..d662f0c752 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/esacci_watervapour.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/esacci_watervapour.py @@ -53,7 +53,7 @@ def extract_variable(var_info, raw_info, attrs, year): # Fix cube fix_var_metadata(cube, var_info) convert_timeunits(cube, year) - fix_coords(cube, overwrite_time_bounds=False) + cube = fix_coords(cube, overwrite_time_bounds=False) set_global_atts(cube, attrs) # Remove dysfunctional ancillary data without sandard name for ancillary_variable in cube.ancillary_variables(): diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esdc.py b/esmvaltool/cmorizers/data/formatters/datasets/esdc.py index bf473f53be..529f497396 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/esdc.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/esdc.py @@ -47,7 +47,7 @@ def _fix_cube(var, cube, cfg): logger.info("Converting time units to gregorian") cube.coord('time').units = cf_units.Unit(old_unit.origin, calendar='gregorian') - utils.fix_coords(cube) + cube = utils.fix_coords(cube) cube.convert_units(cmor_info.units) if 'height2m' in cmor_info.dimensions: utils.add_height2m(cube) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/esrl.py b/esmvaltool/cmorizers/data/formatters/datasets/esrl.py index a0343e3417..ab9e0930e9 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/esrl.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/esrl.py @@ -187,7 +187,7 @@ def _extract_variable(short_name, var, cfg, out_dir, station_dic): # Fix metadata utils.convert_timeunits(cube, 1950) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) cmor_info = cfg['cmor_table'].get_variable(var['mip'], short_name) cube.convert_units(cmor_info.units) attrs = cfg['attributes'] diff --git a/esmvaltool/cmorizers/data/formatters/datasets/fluxcom.py b/esmvaltool/cmorizers/data/formatters/datasets/fluxcom.py index 93a41fffd4..3e25d8a894 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/fluxcom.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/fluxcom.py @@ -29,7 +29,6 @@ import re import iris -import numpy as np from esmvaltool.cmorizers.data import utilities as utils @@ -66,11 +65,8 @@ def _extract_variable(cmor_info, attrs, filepath, out_dir): cube.coord('lon').standard_name = 'longitude' utils.fix_var_metadata(cube, cmor_info) utils.convert_timeunits(cube, 1950) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) utils.set_global_atts(cube, attrs) - utils.flip_dim_coord(cube, 'latitude') - coord = cube.coord('latitude') - coord.bounds = np.flip(coord.bounds, axis=1) logger.info("Saving file") utils.save_variable(cube, var, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ghcn_cams.py b/esmvaltool/cmorizers/data/formatters/datasets/ghcn_cams.py index 5b343eed18..2f3eff6bdd 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/ghcn_cams.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/ghcn_cams.py @@ -35,7 +35,7 @@ def _extract_variable(short_name, var, cfg, filepath, out_dir): utils.convert_timeunits(cube, 1950) # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) if 'height2m' in cmor_info.dimensions: utils.add_height2m(cube) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/gistemp.py b/esmvaltool/cmorizers/data/formatters/datasets/gistemp.py index 81beb56c91..01366a0c06 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/gistemp.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/gistemp.py @@ -33,7 +33,7 @@ def _extract_variable(short_name, var, cfg, filepath, out_dir): utils.convert_timeunits(cube, 1950) # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) if 'height2m' in cmor_info.dimensions: utils.add_height2m(cube) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/glodap.py b/esmvaltool/cmorizers/data/formatters/datasets/glodap.py index c96f0a1771..0323f8b800 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/glodap.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/glodap.py @@ -118,7 +118,7 @@ def extract_variable(in_files, out_dir, attrs, raw_info, cmor_table): bounds=[0., 12.]), 0) fix_var_metadata(cube, var_info) - fix_coords(cube) + cube = fix_coords(cube) _fix_data(cube, var) set_global_atts(cube, attrs) save_variable(cube, var, out_dir, attrs, unlimited_dimensions=['time']) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/hwsd.py b/esmvaltool/cmorizers/data/formatters/datasets/hwsd.py index 30e2a8975b..68c894f39b 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/hwsd.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/hwsd.py @@ -50,7 +50,7 @@ def _extract_variable(short_name, var, cfg, filepath, out_dir): long_name='time') cube.add_dim_coord(time_dim, 0) utils.convert_timeunits(cube, 1950) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) # Fix units if 'kg C' in cube.units.origin: diff --git a/esmvaltool/cmorizers/data/formatters/datasets/jma_transcom.py b/esmvaltool/cmorizers/data/formatters/datasets/jma_transcom.py index 6ac33cb8b5..bd41512294 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/jma_transcom.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/jma_transcom.py @@ -66,7 +66,7 @@ def _extract_variable(cmor_info, attrs, in_dir, out_dir, ctl): # Fix metadata utils.fix_var_metadata(cube, cmor_info) utils.convert_timeunits(cube, 1950) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) utils.set_global_atts(cube, attrs) utils.save_variable(cube, cmor_info.short_name, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/lai3g.py b/esmvaltool/cmorizers/data/formatters/datasets/lai3g.py index 218a22a0cf..1db260d13d 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/lai3g.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/lai3g.py @@ -92,9 +92,7 @@ def _extract_variable(cmor_info, attrs, in_dir, out_dir, cfg): final_cube = cubes.concatenate_cube() utils.fix_var_metadata(final_cube, cmor_info) utils.convert_timeunits(final_cube, 1950) - utils.fix_coords(final_cube) - if not cfg.get('regrid'): - utils.flip_dim_coord(final_cube, 'latitude') + final_cube = utils.fix_coords(final_cube) utils.set_global_atts(final_cube, attrs) utils.save_variable(final_cube, cmor_info.short_name, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/landflux_eval.py b/esmvaltool/cmorizers/data/formatters/datasets/landflux_eval.py index f1e516a89d..f8b0a3ad7c 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/landflux_eval.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/landflux_eval.py @@ -38,7 +38,7 @@ def _extract_variable(raw_var, cmor_info, attrs, filepath, out_dir): _fix_time_coord(cube) utils.fix_var_metadata(cube, cmor_info) utils.convert_timeunits(cube, 1950) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) utils.set_global_atts(cube, attrs) utils.save_variable(cube, var, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2016.py b/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2016.py index e7984bb23a..306c4f8f27 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2016.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2016.py @@ -74,7 +74,7 @@ def extract_variable(var_info, raw_info, out_dir, attrs): for cube in cubes: if cube.var_name == rawvar: fix_var_metadata(cube, var_info) - fix_coords(cube) + cube = fix_coords(cube) _fix_data(cube, var) set_global_atts(cube, attrs) save_variable( diff --git a/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2020.py b/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2020.py index d5739cb8f1..e8419b320b 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2020.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/landschuetzer2020.py @@ -103,7 +103,7 @@ def _extract_variable(var_info, cmor_info, attrs, filepath, out_dir): # Fix coordinates _fix_climatological_time(cube) - utils.fix_coords( + cube = utils.fix_coords( cube, overwrite_lat_bounds=False, overwrite_lon_bounds=False, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/mls_aura.py b/esmvaltool/cmorizers/data/formatters/datasets/mls_aura.py index 1cde246026..5b500e9087 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/mls_aura.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/mls_aura.py @@ -312,7 +312,7 @@ def _save_cube(cube, cmor_info, attrs, out_dir): cube.coord('air_pressure').convert_units('Pa') utils.fix_var_metadata(cube, cmor_info) utils.convert_timeunits(cube, 1950) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) utils.set_global_atts(cube, attrs) utils.save_variable(cube, cmor_info.short_name, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/mobo_dic_mpim.py b/esmvaltool/cmorizers/data/formatters/datasets/mobo_dic_mpim.py index 9ae096104f..7b10ef0b5e 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/mobo_dic_mpim.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/mobo_dic_mpim.py @@ -171,7 +171,7 @@ def _extract_variable(var_info, cmor_info, attrs, filepath, out_dir): elif cube.coords('Julian Day'): # MOBO-DIC2004-2019 _fix_time(cube) cube.coord('depth').units = 'm' - utils.fix_coords(cube, overwrite_time_bounds=False) + cube = utils.fix_coords(cube, overwrite_time_bounds=False) # Fix global metadata utils.set_global_atts(cube, attrs) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/mte.py b/esmvaltool/cmorizers/data/formatters/datasets/mte.py index 78ee04636b..e82baab967 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/mte.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/mte.py @@ -57,9 +57,8 @@ def _extract_variable(raw_var, cmor_info, attrs, filepath, out_dir): _fix_time_coord(cube) utils.fix_var_metadata(cube, cmor_info) utils.convert_timeunits(cube, 1950) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) utils.set_global_atts(cube, attrs) - utils.flip_dim_coord(cube, 'latitude') utils.save_variable(cube, var, out_dir, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py b/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py index 5e2829af07..a74938be86 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py @@ -84,10 +84,7 @@ def _fix_units(cube, definition): def _fix_coordinates(cube, definition, cmor_info): - # fix flipped latitude - utils.flip_dim_coord(cube, 'latitude') - # fix other coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) if 'height2m' in cmor_info.dimensions: utils.add_height2m(cube) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ndp.py b/esmvaltool/cmorizers/data/formatters/datasets/ndp.py index 76d82cdf27..0e393a452b 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/ndp.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/ndp.py @@ -61,7 +61,7 @@ def _extract_variable(cmor_info, attrs, var_file, out_dir, cfg): cube.convert_units('kg m-2') utils.fix_var_metadata(cube, cmor_info) utils.convert_timeunits(cube, 1950) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) utils.set_global_atts(cube, attrs) utils.save_variable(cube, cmor_info.short_name, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/noaa_ersstv5.py b/esmvaltool/cmorizers/data/formatters/datasets/noaa_ersstv5.py index b9f6421e63..c01783724c 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/noaa_ersstv5.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/noaa_ersstv5.py @@ -69,7 +69,7 @@ def _extract_variable(raw_var, cmor_info, attrs, filepaths, out_dir): cube = iris.util.squeeze(cube) utils.fix_var_metadata(cube, cmor_info) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) utils.set_global_atts(cube, attrs) utils.save_variable(cube, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/oceansoda_ethz.py b/esmvaltool/cmorizers/data/formatters/datasets/oceansoda_ethz.py index a818af0424..2e8baf2c8f 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/oceansoda_ethz.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/oceansoda_ethz.py @@ -42,12 +42,14 @@ def _fix_coords(cube, cmor_info): time_coord.points = time_coord.units.date2num(new_dates) cube.coord('lat').standard_name = 'latitude' cube.coord('lon').standard_name = 'longitude' - utils.fix_coords(cube) + cube = utils.fix_coords(cube) # Scalar coordinates if cmor_info.short_name in ('fgco2', 'spco2'): utils.add_scalar_depth_coord(cube) + return cube + def _fix_data(cube, var): """Fix data.""" @@ -109,7 +111,7 @@ def _extract_variable(var_info, cmor_info, attrs, filepath, out_dir): _fix_var_metadata(var_info, cmor_info, attrs, cube) # Fix coordinates - _fix_coords(cube, cmor_info) + cube = _fix_coords(cube, cmor_info) # Fix global metadata utils.set_global_atts(cube, attrs) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/persiann_cdr.py b/esmvaltool/cmorizers/data/formatters/datasets/persiann_cdr.py index 323422b9a5..1b72aaddb5 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/persiann_cdr.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/persiann_cdr.py @@ -113,7 +113,7 @@ def _extract_variable(short_name, var, cfg, input_files, out_dir): cube.units = 'kg m-2 s-1' # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) # Fix metadata attrs = cfg['attributes'] diff --git a/esmvaltool/cmorizers/data/formatters/datasets/phc.py b/esmvaltool/cmorizers/data/formatters/datasets/phc.py index a554ebff7c..84a924d48d 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/phc.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/phc.py @@ -101,7 +101,7 @@ def extract_variable(var_info, raw_info, out_dir, attrs): cube = _fix_data(xr_time, var) fix_var_metadata(cube, var_info) - fix_coords(cube) + cube = fix_coords(cube) set_global_atts(cube, attrs) print(out_dir) if var != "areacello": diff --git a/esmvaltool/cmorizers/data/formatters/datasets/regen.py b/esmvaltool/cmorizers/data/formatters/datasets/regen.py index a26971f8a8..f38424ae20 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/regen.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/regen.py @@ -44,7 +44,7 @@ def _extract_variable(short_name, var, cfg, file_path, out_dir): utils.convert_timeunits(cube, 1950) # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) # Fix metadata attrs = cfg['attributes'] @@ -72,7 +72,7 @@ def _extract_variable(short_name, var, cfg, file_path, out_dir): attrs['mip'] = 'Amon' # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) # Save variable utils.save_variable(cube, diff --git a/esmvaltool/cmorizers/data/formatters/datasets/scripps_co2_kum.py b/esmvaltool/cmorizers/data/formatters/datasets/scripps_co2_kum.py index bae7423e86..6a3ccf6ac0 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/scripps_co2_kum.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/scripps_co2_kum.py @@ -93,7 +93,7 @@ def _extract_variable(short_name, var, cfg, filepath, out_dir): # Fix metadata utils.convert_timeunits(cube, 1950) - utils.fix_coords(cube) + cube = utils.fix_coords(cube) cmor_info = cfg['cmor_table'].get_variable(var['mip'], short_name) cube.convert_units(cmor_info.units) attrs = cfg['attributes'] diff --git a/esmvaltool/cmorizers/data/formatters/datasets/wfde5.py b/esmvaltool/cmorizers/data/formatters/datasets/wfde5.py index b61a043f04..0cc467e161 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/wfde5.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/wfde5.py @@ -72,7 +72,7 @@ def _extract_variable(var, cfg, filenames, out_dir): _fix_time_coord(cube, var) # Fix coordinates - utils.fix_coords(cube) + cube = utils.fix_coords(cube) if 'height2m' in cmor_info.dimensions: utils.add_height2m(cube) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/woa.py b/esmvaltool/cmorizers/data/formatters/datasets/woa.py index cac388a0fd..35db6d810d 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/woa.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/woa.py @@ -110,7 +110,7 @@ def extract_variable(in_files, out_dir, attrs, raw_info, cmor_table): calendar='gregorian') fix_var_metadata(cube, var_info) - fix_coords(cube) + cube = fix_coords(cube) _fix_data(cube, var, attrs['version']) set_global_atts(cube, attrs) save_variable(cube, var, out_dir, attrs, unlimited_dimensions=['time']) diff --git a/esmvaltool/cmorizers/data/utilities.py b/esmvaltool/cmorizers/data/utilities.py index 853ebd8526..ed8b9a9af9 100644 --- a/esmvaltool/cmorizers/data/utilities.py +++ b/esmvaltool/cmorizers/data/utilities.py @@ -94,6 +94,21 @@ def add_scalar_height_coord(cube: Cube, height: float = 2.0) -> None: cube.add_aux_coord(height_coord, ()) +def add_typebare(cube, value='bare_ground'): + """Add scalar coordinate 'typebare' with value of `value`.""" + logger.debug("Adding typebare coordinate (%s)", value) + typebare_coord = iris.coords.AuxCoord(value, + var_name='typebare', + standard_name='area_type', + long_name='surface type', + units=Unit('no unit')) + try: + cube.coord('area_type') + except iris.exceptions.CoordinateNotFoundError: + cube.add_aux_coord(typebare_coord, ()) + return cube + + @contextmanager def constant_metadata(cube): """Do cube math without modifying units, attributes etc. @@ -204,14 +219,7 @@ def fix_coords(cube, if cube_coord.var_name == 'lon': logger.info("Fixing longitude...") if cube_coord.ndim == 1: - if cube_coord.points[0] < 0. and \ - cube_coord.points[-1] < 181.: - cube_coord.points = \ - cube_coord.points + 180. - cube.attributes['geospatial_lon_min'] = 0. - cube.attributes['geospatial_lon_max'] = 360. - nlon = len(cube_coord.points) - roll_cube_data(cube, nlon // 2, -1) + cube = cube.intersection(longitude=(0.0, 360.0)) if overwrite_lon_bounds or not cube_coord.has_bounds(): fix_bounds(cube, cube_coord) @@ -220,6 +228,8 @@ def fix_coords(cube, logger.info("Fixing latitude...") if overwrite_lat_bounds or not cube.coord('latitude').has_bounds(): fix_bounds(cube, cube.coord('latitude')) + if cube_coord.core_points()[0] > cube_coord.core_points()[-1]: + cube = iris.util.reverse(cube, cube_coord) # fix depth if cube_coord.var_name == 'lev': @@ -326,7 +336,10 @@ def save_variable(cube, var, outdir, attrs, **kwargs): except iris.exceptions.CoordinateNotFoundError: time_suffix = None else: - if len(time.points) == 1 and "mon" not in cube.attributes.get('mip'): + if ( + len(time.points) == 1 and + "mon" not in cube.attributes.get('mip') + ) or cube.attributes.get("frequency") == "yr": year = str(time.cell(0).point.year) time_suffix = '-'.join([year + '01', year + '12']) else: diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index b3cca9e028..f846bbfb9f 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -235,8 +235,8 @@ diagnostics: treeFrac: additional_datasets: - {dataset: ESACCI-LANDCOVER, project: OBS, mip: Lmon, tier: 2, - type: sat, version: L4-LCCS-Map-300m-P5Y-aggregated-0.500000Deg, - start_year: 1998, end_year: 2012} + type: sat, version: v2.0.8, frequency: yr, + start_year: 1992, end_year: 2020} scripts: null ESACCI-LST: diff --git a/esmvaltool/references/esacci-landcover.bibtex b/esmvaltool/references/esacci-landcover.bibtex index ca6380e61b..44757b1d04 100644 --- a/esmvaltool/references/esacci-landcover.bibtex +++ b/esmvaltool/references/esacci-landcover.bibtex @@ -1,7 +1,8 @@ @misc{esacci-landcover, - url = {http://catalogue.ceda.ac.uk/uuid/4761751d7c844e228ec2f5fe11b2e3b0}, - title = {IPSL IPSL-CM6A-LR model output prepared for CMIP6 CMIP abrupt-4xCO2}, - publisher = {ESA Land Cover Climate Change Initiative (Land_Cover_cci): Global Land Cover Maps, Version 1.6.1.}, - year = {2016}, - author = {P. Defourny} + doi = {10.5194/essd-15-1465-2023}, + url = {https://catalogue.ceda.ac.uk/uuid/26a0f46c95ee4c29b5c650b129aab788/}, + title = {A 29-year time series of annual 300 m resolution plant-functional-type maps for climate models}, + publisher = {Earth System Science Data}, + year = {2023}, + author = { Kandice L. Harper, Céline Lamarche, Andrew Hartley, Philippe Peylin, Catherine Ottlé, Vladislav Bastrikov, Rodrigo San Martín, Sylvia I. Bohnenstengel, Grit Kirches, Martin Boettcher, Roman Shevchuk, Carsten Brockmann, and Pierre Defourny } } diff --git a/tests/unit/cmorizers/test_utilities.py b/tests/unit/cmorizers/test_utilities.py index 156a3507c0..f5823aa734 100644 --- a/tests/unit/cmorizers/test_utilities.py +++ b/tests/unit/cmorizers/test_utilities.py @@ -8,6 +8,7 @@ import iris.coords import iris.cube import iris.fileformats +import iris.util import numpy as np import pytest from cf_units import Unit @@ -194,8 +195,9 @@ def test_fix_coords(): cube.coord("longitude").units = "m" cube.coord("latitude").units = "K" cube_2 = cube.copy() - cube_2.coord("depth").bounds = [[0., 2.5], [2.5, 25.], [25., 250.]] - utils.fix_coords(cube) + + cube = utils.fix_coords(cube) + assert cube.coord("time").var_name == "time" assert cube.coord("longitude").var_name == "lon" assert cube.coord("latitude").var_name == "lat" @@ -217,24 +219,31 @@ def test_fix_coords(): # both cf-units <= 3.1.0 and later versions, we list both variants in the # following assertion. assert cube.coord("time").units.calendar in ("standard", "gregorian") - assert cube.coord("longitude").points[0] == 178.5 - assert cube.coord("longitude").points[1] == 179.5 + assert cube.coord("longitude").points[0] == 358.5 + assert cube.coord("longitude").points[1] == 359.5 assert cube.coord("longitude").has_bounds() - assert cube.coord("longitude").bounds[1][1] == 180. - assert cube.data[1, 1, 1, 0] == 22. + assert cube.coord("longitude").bounds[1][1] == 360.0 + assert cube.data[1, 1, 1, 1] == 22. assert cube.coord("latitude").has_bounds() assert cube.coord("depth").has_bounds() assert cube.coord('latitude').coord_system is None assert cube.coord('longitude').coord_system is None - utils.fix_coords(cube_2, - overwrite_time_bounds=False, - overwrite_lon_bounds=False, - overwrite_lat_bounds=False, - overwrite_lev_bounds=False) + + cube_2.coord("depth").bounds = [[0., 2.5], [2.5, 25.], [25., 250.]] + cube_2 = iris.util.reverse(cube_2, "latitude") + np.testing.assert_allclose(cube_2.coord('latitude').points, [2.5, 1.5]) + cube_2 = utils.fix_coords( + cube_2, + overwrite_time_bounds=False, + overwrite_lon_bounds=False, + overwrite_lat_bounds=False, + overwrite_lev_bounds=False, + ) assert cube_2.coord("time").bounds[0][1] == 30. - assert cube_2.coord("longitude").bounds[1][1] == 180. + assert cube_2.coord("longitude").bounds[1][1] == 360.0 assert cube_2.coord("latitude").bounds[1][1] == 3. assert cube_2.coord("depth").bounds[1][1] == 25. + np.testing.assert_allclose(cube_2.coord('latitude').points, [1.5, 2.5]) def test_fix_var_metadata(): From 6155acf1f652649286dbc1fc8b1b1642038dfca0 Mon Sep 17 00:00:00 2001 From: Axel Lauer Date: Wed, 2 Oct 2024 01:29:52 +0200 Subject: [PATCH 38/87] CMORizer for JRA-55 (#3141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémi Kazeroni Co-authored-by: Rémi Kazeroni Co-authored-by: Romain Beucher Co-authored-by: Felicity Chun <32269066+flicj191@users.noreply.github.com> --- doc/sphinx/source/input.rst | 2 + environment.yml | 1 + environment_osx.yml | 1 + .../cmorizers/data/cmor_config/JRA-55.yml | 103 ++++++++++ esmvaltool/cmorizers/data/datasets.yml | 9 + .../data/downloaders/datasets/jra_55.py | 115 ++++++++++++ esmvaltool/cmorizers/data/downloaders/wget.py | 14 ++ .../data/formatters/datasets/jra_55.py | 176 ++++++++++++++++++ .../recipes/examples/recipe_check_obs.yml | 24 +++ esmvaltool/references/jra_55.bibtex | 10 + setup.py | 1 + 11 files changed, 456 insertions(+) create mode 100644 esmvaltool/cmorizers/data/cmor_config/JRA-55.yml create mode 100644 esmvaltool/cmorizers/data/downloaders/datasets/jra_55.py create mode 100644 esmvaltool/cmorizers/data/formatters/datasets/jra_55.py create mode 100644 esmvaltool/references/jra_55.bibtex diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index 1a56e4fcd5..65aef57cd8 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -366,6 +366,8 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | JRA-25 | clt, hus, prw, rlut, rlutcs, rsut, rsutcs (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| JRA-55 | cli, clivi, clw, clwvi, clt, prw, rlus, rlut, rlutcs, rsus, rsuscs, rsut, rsutcs, ta, tas, wap (Amon)| 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | Kadow2020 | tasa (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | LAI3g | lai (Lmon) | 3 | Python | diff --git a/environment.yml b/environment.yml index 681783e7b4..0864f750d2 100644 --- a/environment.yml +++ b/environment.yml @@ -14,6 +14,7 @@ dependencies: - cdo >=2.3.0 - cdsapi - cf-units + - cfgrib - cftime - cmocean - curl <8.10 diff --git a/environment_osx.yml b/environment_osx.yml index d89556b593..baffec74d2 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -14,6 +14,7 @@ dependencies: - cdo >=2.3.0 - cdsapi - cf-units + - cfgrib - cftime - cmocean - cython diff --git a/esmvaltool/cmorizers/data/cmor_config/JRA-55.yml b/esmvaltool/cmorizers/data/cmor_config/JRA-55.yml new file mode 100644 index 0000000000..a4f4c8b379 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/JRA-55.yml @@ -0,0 +1,103 @@ +--- +# Common global attributes for Cmorizer output +attributes: + dataset_id: JRA-55 + version: '1' + tier: 2 + modeling_realm: reanaly + project_id: OBS6 + source: 'https://rda.ucar.edu/datasets/ds628.1/' + reference: 'jra_55' + comment: | + '' + +# Variables to cmorize +variables: + cli: + short_name: cli + mip: Amon + file: fcst_p125.229_ciwc.{year}01_{year}12.grb + + clivi: + short_name: clivi + mip: Amon + file: fcst_column125.058_cice.{year}01_{year}12.grb + + clw: + short_name: clw + mip: Amon + file: fcst_p125.228_clwc.{year}01_{year}12.grb + + clwvi: + short_name: clwvi + mip: Amon + operator: sum + files: + - 'fcst_column125.058_cice.{year}01_{year}12.grb' + - 'fcst_column125.227_cw.{year}01_{year}12.grb' + + clt: + short_name: clt + mip: Amon + file: fcst_surf125.071_tcdc.{year}01_{year}12.grb + + prw: + short_name: prw + mip: Amon + file: fcst_column125.054_pwat.{year}01_{year}12.grb + + rlus: + short_name: rlus + mip: Amon + typeOfLevel: surface + file: fcst_phy2m125.212_ulwrf.{year}01_{year}12.grb + + rlut: + short_name: rlut + mip: Amon + typeOfLevel: nominalTop + file: fcst_phy2m125.212_ulwrf.{year}01_{year}12.grb + + rlutcs: + short_name: rlutcs + mip: Amon + file: fcst_phy2m125.162_csulf.{year}01_{year}12.grb + + rsus: + short_name: rsus + mip: Amon + typeOfLevel: surface + file: fcst_phy2m125.211_uswrf.{year}01_{year}12.grb + + rsuscs: + short_name: rsuscs + mip: Amon + typeOfLevel: surface + file: fcst_phy2m125.160_csusf.{year}01_{year}12.grb + + rsut: + short_name: rsut + mip: Amon + typeOfLevel: nominalTop + file: fcst_phy2m125.211_uswrf.{year}01_{year}12.grb + + rsutcs: + short_name: rsutcs + mip: Amon + typeOfLevel: nominalTop + file: fcst_phy2m125.160_csusf.{year}01_{year}12.grb + + ta: + short_name: ta + mip: Amon + file: anl_p125.011_tmp.{year}01_{year}12.grb + + tas: + short_name: tas + mip: Amon + file: anl_surf125.011_tmp.{year}01_{year}12.grb + + wap: + short_name: wap + mip: Amon + file: anl_p125.039_vvel.{year}01_{year}12.grb diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index 7add495dad..8fcb6adc21 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -808,6 +808,15 @@ datasets: mon/atmos/rsut/rsut_Amon_reanalysis_JRA-25_197901-201312.nc mon/atmos/rsutcs/rsutcs_Amon_reanalysis_JRA-25_197901-201312.nc + JRA-55: + tier: 2 + source: https://rda.ucar.edu/datasets/ds628.1/ + last_access: 2023-03-22 + info: | + Create an account on the research data archive (RDA) in order to be able + to download the data (1.25 degree, pressure levels). See + https://rda.ucar.edu/login/register/ for more details. + Kadow2020: tier: 2 source: http://users.met.fu-berlin.de/~ChristopherKadow/ diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/jra_55.py b/esmvaltool/cmorizers/data/downloaders/datasets/jra_55.py new file mode 100644 index 0000000000..a5dc5b851c --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/jra_55.py @@ -0,0 +1,115 @@ +"""Script to download JRA-55 from RDA.""" +import logging +import os + +from datetime import datetime + +from dateutil import relativedelta + +from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader + + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + downloader = WGetDownloader( + config=config, + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + + os.makedirs(downloader.local_folder, exist_ok=True) + + user = os.environ.get("rda-user") + if user is None: + user = str(input("RDA user name? ")) + if user == "": + errmsg = ("A RDA account is required to download JRA-55 data." + " Please visit https://rda.ucar.edu/login/register/" + " to create an account at the Research Data Archive" + " (RDA) if needed.") + logger.error(errmsg) + raise ValueError + + passwd = os.environ.get("rda-passwd") + if passwd is None: + passwd = str(input("RDA password? ")) + + if start_date is None: + start_date = datetime(1958, 1, 1) + if end_date is None: + end_date = datetime(2022, 12, 31) + loop_date = start_date + + options = ["-O", "Authentication.log", "--save-cookies=auth.rda_ucar_edu", + f"--post-data=\"email={user}&passwd={passwd}&action=login\""] + + # login to Research Data Archive (RDA) + + downloader.login("https://rda.ucar.edu/cgi-bin/login", options) + + # download files + + url = "https://data.rda.ucar.edu/ds628.1" + download_options = ["--load-cookies=auth.rda_ucar_edu"] + + # define variables to download + + var = [["011_tmp", "anl_p125"], + ["011_tmp", "anl_surf125"], + ["039_vvel", "anl_p125"], + ["071_tcdc", "fcst_surf125"], + ["054_pwat", "fcst_column125"], + ["058_cice", "fcst_column125"], + ["160_csusf", "fcst_phy2m125"], + ["162_csulf", "fcst_phy2m125"], + ["211_uswrf", "fcst_phy2m125"], + ["212_ulwrf", "fcst_phy2m125"], + ["227_cw", "fcst_column125"], + ["228_clwc", "fcst_p125"], + ["229_ciwc", "fcst_p125"]] + + # download data + + while loop_date <= end_date: + year = loop_date.year + + for item in var: + varname = item[0] + channel = item[1] + fname = f"{channel}.{varname}.{year}01_{year}12" + # download file + downloader.download_file(url + f"/{channel}/{year}/" + + fname, download_options) + # add file extension ".grb" + os.rename(downloader.local_folder + "/" + fname, + downloader.local_folder + "/" + fname + ".grb") + + loop_date += relativedelta.relativedelta(years=1) + + # clean up temporary files + + if os.path.exists("Authentication.log"): + os.remove("Authentication.log") + if os.path.exists("auth.rda_ucar_edu"): + os.remove("auth.rda_ucar_edu") diff --git a/esmvaltool/cmorizers/data/downloaders/wget.py b/esmvaltool/cmorizers/data/downloaders/wget.py index 8544e1d727..2afcca1d5a 100644 --- a/esmvaltool/cmorizers/data/downloaders/wget.py +++ b/esmvaltool/cmorizers/data/downloaders/wget.py @@ -54,6 +54,20 @@ def download_file(self, server_path, wget_options): logger.debug(command) subprocess.check_output(command) + def login(self, server_path, wget_options): + """Login. + + Parameters + ---------- + server_path: str + Path to remote file + wget_options: list(str) + Extra options for wget + """ + command = ['wget'] + wget_options + [server_path] + logger.debug(command) + subprocess.check_output(command) + @property def overwrite_options(self): """Get overwrite options as configured in downloader.""" diff --git a/esmvaltool/cmorizers/data/formatters/datasets/jra_55.py b/esmvaltool/cmorizers/data/formatters/datasets/jra_55.py new file mode 100644 index 0000000000..16125d4c2f --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/jra_55.py @@ -0,0 +1,176 @@ +""" +ESMValTool CMORizer for JRA-55 data. + +Tier + Tier 2: other freely-available dataset. + +Source + Research Data Archive (RDA): + https://rda.ucar.edu/datasets/ds628.1/ + +Last access + 20230322 + +Download and processing instructions + see download script cmorizers/data/downloaders/datasets/jra_55.py +""" + +import copy +import logging +import os +import xarray as xr + +from cf_units import Unit + +import iris + +from esmvaltool.cmorizers.data import utilities as utils + +logger = logging.getLogger(__name__) + + +def _load_jra55_grib(filenames, var): + """Load data from GRIB file and return list of cubes.""" + leveltype = var.get('typeOfLevel') + cubelist = [] + if leveltype is not None: + dataset = xr.open_mfdataset(filenames, engine="cfgrib", + filter_by_keys={'typeOfLevel': leveltype}) + else: + dataset = xr.open_mfdataset(filenames, engine="cfgrib") + varnames = list(dataset.data_vars) + for varname in varnames: + da_tmp = dataset[varname] + # conversion to Iris cubes requires a valid standard_name + da_tmp.attrs['standard_name'] = var['standard_name'] + cube = da_tmp.to_iris() + # remove auxiliary coordinate 'time' + cube.remove_coord('time') + # rename coordinate from 'forecast_reference_time' to 'time + timecoord = cube.dim_coords[0] + timecoord.rename("time") + # convert unit string to cf_unit object + # (calendar (calendar=coord.units.calendar) must be irgnored + # or conversion fails + timecoord.units = Unit(timecoord.units) + # add forecast period to time coordinate to get the actual time + # for which the data are valid + forecast = cube.coord('forecast_period') # forecast period in hours + timecoord.points = timecoord.points + forecast.points * 3600 + # remove unneeded scalar variables to prevent warnings + auxcoordnames = ['step', 'entireAtmosphere', 'number', 'isobaricLayer', + 'surface', 'nominalTop', 'heightAboveGround'] + for aux_coord in cube.coords(dim_coords=False): + if aux_coord.var_name in auxcoordnames: + cube.remove_coord(aux_coord) + cubelist.append(cube) + + return cubelist + + +def _extract_variable(short_name, var, in_files, cfg, out_dir): + """Extract variable.""" + # load data (returns a list of cubes) + cmor_info = cfg['cmor_table'].get_variable(var['mip'], short_name) + var['standard_name'] = cmor_info.standard_name + cubes = _load_jra55_grib(in_files, var) + + # apply operators (if any) + if len(cubes) > 1: + if var.get('operator', '') == 'sum': + # Multiple variables case using sum operation + cube = None + for in_cube in cubes: + if cube is None: + cube = in_cube + else: + cube += in_cube + elif var.get('operator', '') == 'diff': + # two variables case using diff operation + if len(cubes) != 2: + errmsg = (f'operator diff selected for variable {short_name} ' + f'expects exactly two input variables and two input ' + f'files') + raise ValueError(errmsg) + cube = cubes[0] - cubes[1] + else: + oper = var.get('operator') + raise ValueError( + f'multiple input files found for variable {short_name} ' + f'with unknown operator {oper}') + else: + cube = cubes[0] + + # Fix metadata + attrs = copy.deepcopy(cfg['attributes']) + attrs['mip'] = var['mip'] + utils.fix_var_metadata(cube, cmor_info) + + if cube.var_name in ['hfls', 'hfss', 'rlus', 'rlut', 'rlutcs', 'rsus', + 'rsuscs', 'rsut', 'rsutcs']: + attrs['positive'] = 'up' + + if cube.var_name in ['rlds', 'rldscs', 'rsds', 'rsdscs', 'rsdt', 'rtmt', + 'tauu', 'tauv']: + attrs['positive'] = 'down' + + # fix longitudes and z-coordinate (if present) + for coord in cube.dim_coords: + coord_type = iris.util.guess_coord_axis(coord) + if coord_type == 'X': + # -> shift longitude coordinate by one grid box + # to match obs4mips/CREATE-IP grid + coord.points = coord.points + 360 / len(coord.points) + if coord_type == 'Z': + coord.standard_name = 'air_pressure' + coord.long_name = 'pressure' + coord.var_name = 'plev' + coord.attributes['positive'] = 'down' + if coord.units == "hPa": + coord.convert_units('Pa') + utils.flip_dim_coord(cube, coord.standard_name) + + utils.fix_dim_coordnames(cube) + utils.fix_coords(cube) + if 'height2m' in cmor_info.dimensions: + utils.add_height2m(cube) + utils.set_global_atts(cube, attrs) + + # Save variable + utils.save_variable(cube, + short_name, + out_dir, + attrs, + unlimited_dimensions=['time'], + local_keys=['positive']) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorization func call.""" + # Run the cmorization + if start_date is None: + start_date = 1958 + else: + start_date = start_date.year + if end_date is None: + end_date = 2022 + else: + end_date = end_date.year + for (short_name, var) in cfg['variables'].items(): + short_name = var['short_name'] + filename = [] + for year in range(start_date, end_date + 1): + if 'file' in var: + filename.append(os.path.join(in_dir, + var['file'].format(year=year))) + elif 'files' in var: + for file in var['files']: + filename.append(os.path.join(in_dir, + file.format(year=year))) + else: + raise ValueError(f"No input file(s) specified for variable " + f"{short_name}.") + + logger.info("CMORizing variable '%s' from file '%s'", short_name, + filename) + _extract_variable(short_name, var, filename, cfg, out_dir) diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index f846bbfb9f..fd08dcadbc 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -548,6 +548,30 @@ diagnostics: type: reanaly, version: 1, start_year: 1979, end_year: 2007} scripts: null + JRA-55: + description: JRA-55 check + variables: + cli: + clivi: + clw: + clwvi: + clt: + prw: + rlus: + rlut: + rlutcs: + rsus: + rsuscs: + rsut: + rsutcs: + ta: + tas: + wap: + additional_datasets: + - {dataset: JRA-55, project: OBS6, mip: Amon, tier: 2, + type: reanaly, version: 1, start_year: 1958, end_year: 2022} + scripts: null + Kadow2020: description: Kadow2020 check variables: diff --git a/esmvaltool/references/jra_55.bibtex b/esmvaltool/references/jra_55.bibtex new file mode 100644 index 0000000000..d979a6c9cc --- /dev/null +++ b/esmvaltool/references/jra_55.bibtex @@ -0,0 +1,10 @@ +@article{jra_55, + doi = {https://doi.org/10.5065/D60G3H5B}, + title={The JRA-55 Reanalysis: General Specifications and Basic Characteristics}, + author={Kobayashi, S. and Y. Ota and Y. Harada and A. Ebita and M. Moriya and H. Onoda and K. Onogi and H. Kamahori and C. Kobayashi and H. Endo and K. Miyaoka and K. Takahashi}, + journal={J. Met. Soc. Jap.}, + volume={93}, + number={1}, + pages={5-48}, + year={2015} +} diff --git a/setup.py b/setup.py index df8477d27f..33ec620fbf 100755 --- a/setup.py +++ b/setup.py @@ -25,6 +25,7 @@ 'cdo', 'cdsapi', 'cf-units', + 'cfgrib', 'cftime', 'cmocean', 'dask!=2024.8.0', # https://github.com/dask/dask/issues/11296 From 8c6b882154a1b8fcb64c7068b16e5ddd0d743ca6 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Wed, 2 Oct 2024 16:16:58 +0100 Subject: [PATCH 39/87] Remove obsolete utility `esmvt_rose_wrapper` and its documentation and very obsolete `mip_convert` cmorizer (#3759) --- doc/sphinx/source/utils.rst | 61 -- .../mip_convert/config-mipconv-user.yml | 22 - .../mip_convert/esmvt_mipconv_setup.py | 527 ------------------ .../mip_convert/recipe_mip_convert.yml | 51 -- .../mip_convert/rose-suite-template.conf | 20 - .../utils/rose-cylc/esmvt_rose_wrapper.py | 258 --------- setup.py | 2 - 7 files changed, 941 deletions(-) delete mode 100644 esmvaltool/cmorizers/mip_convert/config-mipconv-user.yml delete mode 100644 esmvaltool/cmorizers/mip_convert/esmvt_mipconv_setup.py delete mode 100644 esmvaltool/cmorizers/mip_convert/recipe_mip_convert.yml delete mode 100644 esmvaltool/cmorizers/mip_convert/rose-suite-template.conf delete mode 100644 esmvaltool/utils/rose-cylc/esmvt_rose_wrapper.py diff --git a/doc/sphinx/source/utils.rst b/doc/sphinx/source/utils.rst index 03e2793dca..71de0e01f6 100644 --- a/doc/sphinx/source/utils.rst +++ b/doc/sphinx/source/utils.rst @@ -152,67 +152,6 @@ Next, get started with `cylc `. -Using Rose and cylc -------------------- -It is possible to run more than one recipe in one go: currently this relies on the user -having access to a HPC that has ``rose`` and ``cylc`` installed since the procedure involves -installing and submitting a Rose suite. The utility that allows you to do this is -``esmvaltool/utils/rose-cylc/esmvt_rose_wrapper.py``. - -Base suite -.......... -The base suite to run esmvaltool via rose-cylc is `u-bd684`; you can find -this suite in the Met Office Rose repository at: - -https://code.metoffice.gov.uk/svn/roses-u/b/d/6/8/4/trunk/ - -When ``rose`` will be working with python3.x, this location will become -default and the pipeline will aceess it independently of user, unless, of -course the user will specify ``-s $SUITE_LOCATION``; until then the user needs -to grab a copy of it in ``$HOME`` or specify the default location via ``-s`` option. - -Environment -........... -We will move to a unified and centrally-installed esmvaltool environment; -until then, the user will have to alter the env_setup script: - -``u-bd684/app/esmvaltool/env_setup`` - -with the correct pointers to esmvaltool installation, if desired. - -To be able to submit to cylc, you need to have the `/metomi/` suite in path -AND use a `python2.7` environment. Use the Jasmin-example below for guidance. - -Jasmin-example -.............. -This shows how to interact with rose-cylc and run esmvaltool under cylc -using this script: - -.. code:: bash - - export PATH=/apps/contrib/metomi/bin:$PATH - export PATH=/home/users/valeriu/miniconda2/bin:$PATH - mkdir esmvaltool_rose - cd esmvaltool_rose - cp ESMValTool/esmvaltool/utils/rose-cylc/esmvt_rose_wrapper.py . - svn checkout https://code.metoffice.gov.uk/svn/roses-u/b/d/6/8/4/trunk/ ~/u-bd684 - [enter Met Office password] - [configure ~/u-bd684/rose_suite.conf] - [configure ~/u-bd684/app/esmvaltool/env_setup] - python esmvt_rose_wrapper.py -c config-user.yml \ - -r recipe_autoassess_stratosphere.yml recipe_OceanPhysics.yml \ - -d $HOME/esmvaltool_rose - rose suite-run u-bd684 - -Note that you need to pass FULL PATHS to cylc, no `.` or `..` because all -operations are done remotely on different nodes. - -A practical actual example of running the tool can be found on JASMIN: -``/home/users/valeriu/esmvaltool_rose``. -There you will find the run shell: ``run_example``, as well as an example -how to set the configuration file. If you don't have Met Office credentials, -a copy of `u-bd684` is always located in ``/home/users/valeriu/roses/u-bd684`` on Jasmin. - .. _utils_batch_jobs: Using the scripts in `utils/batch-jobs` diff --git a/esmvaltool/cmorizers/mip_convert/config-mipconv-user.yml b/esmvaltool/cmorizers/mip_convert/config-mipconv-user.yml deleted file mode 100644 index 93362f92d7..0000000000 --- a/esmvaltool/cmorizers/mip_convert/config-mipconv-user.yml +++ /dev/null @@ -1,22 +0,0 @@ -############################################################################### -# User's configuration file for the ESMValTool with mip_convert -# For further details see the README document; current sections are -# mandatory and should be populated with valid entries. -# Author: V. Predoi / UREAD / November 2018 -############################################################################### ---- -# root to directory where mip_convert rose suites will be run -# make this different than your usual /roses/ dir -ROSES_ROOT: "/home/users/$USER/roses_mipconv" -# root to directory where mip_convert rose suites will write output -ROSES_OUTPUT: "/home/users/$USER/roses_mipconv_output" -# map dataset name to relevant UM suite -DATASET_TO_SUITE: {"UKESM1-0-LL": "u-ar766a"} -# map variable standard name to stream definition -STREAM_MAP: {"ps": "ap4", "ta": "ap4", "va": "ap4", "ua": "ap5", "mrsos": "ap5", "toz":"apm"} -# root directory where PP data lives -# this directory is in Jasmin/Archer structure; this one here -# is an actual directory with data -INPUT_DIR: "/group_workspaces/jasmin4/ncas_cms/valeriu/MASS_DATA" -# map streams to realm components -STREAM_COMPONENTS: {"ap4": ["atmos-physics", "land"], "apm": ["atmos-physics"], "ap5": ["land"]} diff --git a/esmvaltool/cmorizers/mip_convert/esmvt_mipconv_setup.py b/esmvaltool/cmorizers/mip_convert/esmvt_mipconv_setup.py deleted file mode 100644 index 8868827d5d..0000000000 --- a/esmvaltool/cmorizers/mip_convert/esmvt_mipconv_setup.py +++ /dev/null @@ -1,527 +0,0 @@ -""" -Run the first communication between esmvaltool's recipe and mip_convert. - -Description: ------------- - -This script sets up the correct rose suite directories to run mip_convert -on different UM suite data. You can run this tool in three different ways: - - (with -m --mode option) setup-only: will set up the mip convert rose - directories only; it will use the -c configuration file for user options; - - (with -m --mode option) setup-run-suites: will set up the mip convert rose - suites and will go ahead and submit them to cylc via rose suite-run; - - (with -m --mode option) postproc: will symlink newly created netCDF data - into a directory per esmvaltool recipe; note that for now, there is no - DRS-like path set up in that directory; - -Usage: ------- --c --config-file: [REQUIRED] user specific configuration file; --r --recipe-file: [REQUIRED] single or multiple (space-sep) recipe files; --m --mode: [OPTIONAL] running mode (setup-only, setup-run-suites, - postproc), default=setup-only --l --log-level: [OPTIONAL] log level, default=info - -Environment ------------ -current JASMIN rose/cyclc need python2.7; esmvaltool needs python3.x -So it is impossible at the moment to run this script as executable from an -esmvaltool environment. Instead, you can run it as a stand-alone tool in a -python 2.7 environment, intwo stages: - -[set up mip_convert suites and run them] -python esmvt_mipconv_setup.py -c config.yml -r recipe.yml -m setup-run-suites -[check succesful completion of mip_convert suites] -[run the symlinking] -python esmvt_mipconv_setup.py -c config.yml -r recipe.yml -m postproc - -A practical example of running the tool can be found on JASMIN: -/home/users/valeriu/esmvaltool_mip_convert -There you will find the two component shells: run_conversion -and run_symlink, as well as an example how to set the configuration file. - -The suite used is now on MOSRS (as of 3 December 2018): u-bd681 -You can use the default location on Jasmin: -DEFAULT_SUITE_LOCATION = "/home/users/valeriu/roses/u-bd681" -alternatively this can be turned off, should you want to check out the suite -off MOSRS and use it locally. - -Contact: --------- -author: Valeriu Predoi (UREAD, valeriu.predoi@ncas.ac.uk) -""" -import argparse -import configparser -import datetime -import logging -import os -import shutil -import subprocess -import socket - -import yaml - -#################### -# global variables # -#################### - -# the tool uses a specially tailored mip_convert Rose suite -# locations of the suite depends on the host -host_name = socket.gethostname().split('.') -if len(host_name) > 1: - if host_name[1] == 'ceda': - # default location for mip_convert suite on JASMIN: - # previous suite: u-ak283_esmvt; new one u-bd681 - # DEFAULT_SUITE_LOCATION = "/home/users/valeriu/roses/u-ak283_esmvt" - DEFAULT_SUITE_LOCATION = "/home/users/valeriu/roses/u-bd681" - # note that you can fcm checkout it straight from the MOSRS - -# stream mapping; taken from hadsdk.streams -# these are used to set defaults if not overrides -STREAM_MAP = { - 'CMIP5': { - '3hr': 'apk', - '6hrPlev': 'apc', - '6hrlev': 'apg', - 'Amon': 'apm', - 'Lmon': 'apm', - 'LImon': 'apm', - 'Oday': 'opa', - 'Omon': 'opm', - 'Oyr': 'opy', - 'CF3hr': 'apk', - 'CFday': 'apa', - 'CFmon': 'apm', - 'CFsubhr': 'ape', - 'day': 'apa' - }, - 'CMIP6': { - '3hr': 'ap8', - '6hrLev': 'ap7', - '6hrPlev': 'ap7', - '6hrPlevPt': 'ap7', - 'AERday': 'ap6', - 'AERhr': 'ap9', - 'AERmon': 'ap4', - 'AERmonZ': 'ap4', - 'Amon': 'ap5', - 'CF3hr': 'ap8', - 'CFday': 'ap6', - 'CFmon': 'ap5', - 'E1hr': 'ap9', - 'E1hrClimMon': 'ap9', - 'E3hr': 'ap8', - 'E3hrPt': 'ap8', - 'E6hrZ': 'ap7', - 'Eday': 'ap6', - 'EdayZ': 'ap6', - 'Efx': 'ancil', - 'Emon': 'ap5', - 'EmonZ': 'ap5', - 'Esubhr': 'ap8', - 'Eyr': 'ap5', - 'LImon': 'ap5', - 'Lmon': 'ap5', - 'Oday': 'ond', - 'Ofx': 'ancil', - 'Omon': 'onm', - 'SIday': 'ind', - 'SImon': 'inm', - 'day': 'ap6', - 'fx': 'ancil', - 'prim1hrpt': 'ap9', - 'prim3hr': 'ap8', - 'prim3hrpt': 'ap8', - 'prim6hr': 'ap7', - 'prim6hrpt': 'ap7', - 'primDay': 'ap6', - 'primMon': 'ap5', - 'primSIday': 'ap6' - } -} - -# set up logging -logger = logging.getLogger(__name__) - -# print the header -HEADER = r""" -______________________________________________________________________ - - ESMValTool + mip_convert: linking mip_convert to ESMValTool -______________________________________________________________________ - -""" + __doc__ - - -def get_args(): - """Define the `esmvaltool` command line.""" - # parse command line args - parser = argparse.ArgumentParser( - description=HEADER, - formatter_class=argparse.RawDescriptionHelpFormatter) - parser.add_argument( - '-c', - '--config-file', - default=os.path.join(os.path.dirname(__file__), 'config-user.yml'), - help='Configuration file') - parser.add_argument( - '-r', - '--recipe-files', - type=str, - nargs='+', - help='Recipe files (list or single file)') - parser.add_argument( - '-m', - '--mode', - default='setup-only', - choices=['setup-only', 'setup-run-suites', 'postproc'], - help='How to run: setup: sets up mipconvert suites only;\n' + - 'or setup-run-suites: sets up suites and runs them as well;\n' + - 'or postproc: grab the output from mip_convert and use it.') - parser.add_argument( - '-l', - '--log-level', - default='info', - choices=['debug', 'info', 'warning', 'error']) - args = parser.parse_args() - return args - - -def _set_logger(logging, out_dir, log_file, log_level): - # set logging for screen and file output - root_logger = logging.getLogger() - out_fmt = "%(asctime)s %(levelname)-8s %(name)s,%(lineno)s\t%(message)s" - logging.basicConfig( - filename=os.path.join(out_dir, log_file), - filemode='a', - format=out_fmt, - datefmt='%H:%M:%S', - level=logging.DEBUG) - root_logger.setLevel(log_level.upper()) - logfmt = logging.Formatter(out_fmt) - console_handler = logging.StreamHandler() - console_handler.setFormatter(logfmt) - root_logger.addHandler(console_handler) - - -def read_yaml_file(yaml_file): - """Read recipe into a dictionary.""" - with open(yaml_file, 'r') as yfile: - loaded_file = yaml.safe_load(yfile) - return loaded_file - - -def map_var_to_stream(diagnostics, stream_map): - """Map variable standard name to stream string.""" - stream_list = [] - for _, diag in diagnostics.items(): - for var in diag['variables']: - stream = stream_map[var] - stream_list.append(stream) - stream_list = list(set(stream_list)) - return stream_list - - -def write_rose_conf(rose_config_template, recipe_file, config_file, log_level): - """Write the new rose conf file per suite.""" - # Build the ConfigParser object - config = configparser.ConfigParser() - config.optionxform = str - config.read(rose_config_template) - recipe_object = read_yaml_file(recipe_file) - conf_file = read_yaml_file(config_file) - datasets = recipe_object['datasets'] - - # check if dataset needs analysis - datasets_to_analyze = [] - for dataset in datasets: - if dataset['dataset'] not in conf_file['DATASET_TO_SUITE']: - logger.warning("Dataset %s has no mapping to suite", - dataset['dataset']) - logger.warning("Assuming data retrival from elsewhere.") - else: - datasets_to_analyze.append(dataset) - diagnostics = recipe_object['diagnostics'] - active_streams = map_var_to_stream(diagnostics, conf_file['STREAM_MAP']) - - # set stream overrides to None and set components - # also set CYCLING_FREQUENCIES to P1Y overall - stream_overrides = {} - stream_components = {} - cycling_frequencies = {} - for stream in active_streams: - stream_overrides[stream] = 'None' - stream_components[stream] = conf_file['STREAM_COMPONENTS'][stream] - cycling_frequencies[stream] = 'P1Y' - - # set the logger to start outputting - if not os.path.exists(conf_file['ROSES_OUTPUT']): - os.makedirs(conf_file['ROSES_OUTPUT']) - _set_logger(logging, conf_file['ROSES_OUTPUT'], 'rose_suites_setup.log', - log_level) - logger.info(HEADER) - - # store the rose suite locations - rose_suite_locations = [] - - # loop through datasets (different suites for different datasets) - for dataset in datasets_to_analyze: - - # set correct paths - rose_suite = os.path.join( - conf_file['ROSES_ROOT'], - conf_file['DATASET_TO_SUITE'][dataset['dataset']]) - rose_suite_locations.append(rose_suite) - rose_output = os.path.join( - conf_file['ROSES_OUTPUT'], - conf_file['DATASET_TO_SUITE'][dataset['dataset']]) - if os.path.exists(rose_suite): - shutil.rmtree(rose_suite) - if os.path.exists(DEFAULT_SUITE_LOCATION): - shutil.copytree(DEFAULT_SUITE_LOCATION, rose_suite) - else: - logger.error("Default Suite Location not found: %s", - DEFAULT_SUITE_LOCATION) - break - if not os.path.exists(rose_output): - os.makedirs(rose_output) - new_mipconv_config = os.path.join(rose_suite, 'mip_convert_config') - - # start logging - logger.info("Working on dataset: %s", dataset) - logger.info("Mapping dataset to suite: %s", rose_suite) - logger.info("Output and logs written to: %s", rose_output) - logger.info("Creating rose suite directories...") - logger.info("Use rose-suite.conf template %s", rose_config_template) - logger.info("Use user config file %s", config_file) - - # write the file - config.set('jinja2:suite.rc', 'INPUT_DIR', - '"' + conf_file['INPUT_DIR'] + '"') - config.set('jinja2:suite.rc', 'OUTPUT_DIR', '"' + rose_output + '"') - config.set('jinja2:suite.rc', 'CDDS_DIR', - '"' + DEFAULT_SUITE_LOCATION + '"') - config.set('jinja2:suite.rc', 'MIP_CONVERT_CONFIG_DIR', - '"' + new_mipconv_config + '"') - config.set('jinja2:suite.rc', 'ACTIVE_STREAMS', str(active_streams)) - config.set('jinja2:suite.rc', 'STREAM_TIME_OVERRIDES', - str(stream_overrides)) - config.set('jinja2:suite.rc', 'FIRST_YEAR', str(dataset['start_year'])) - config.set('jinja2:suite.rc', 'REF_YEAR', str(dataset['start_year'])) - config.set('jinja2:suite.rc', 'FINAL_YEAR', str(dataset['end_year'])) - config.set('jinja2:suite.rc', 'STREAM_COMPONENTS', - str(stream_components)) - config.set('jinja2:suite.rc', 'CYCLING_FREQUENCIES', - str(cycling_frequencies)) - config.set( - 'jinja2:suite.rc', 'TARGET_SUITE_NAME', - '"' + conf_file['DATASET_TO_SUITE'][dataset['dataset']] + '"') - with open(os.path.join(rose_suite, 'rose-suite.conf'), 'w') as r_c: - logger.info("Writing rose-suite.conf file %s", - os.path.join(rose_suite, 'rose-suite.conf')) - config.write(r_c) - - # now that we have to conf file set up we need to - # edit the mip_convert configuration file with the correct data - for key, values in conf_file['STREAM_COMPONENTS'].items(): - for comp in values: - mipconv_config = os.path.join(new_mipconv_config, - 'mip_convert.cfg.' + comp) - _edit_mip_convert_config(mipconv_config, conf_file, dataset, - key) - - return rose_suite_locations - - -def _edit_mip_convert_config(mipconv_config, conf_file, dataset, stream): - """Edit the mip_convert file for correct runs.""" - # set the correct variables - base_date = str(dataset['start_year']) + '-01-01-00-00-00' - suite_id = conf_file['DATASET_TO_SUITE'][dataset['dataset']] - cdds_dir = os.path.join(DEFAULT_SUITE_LOCATION, 'mip_convert_aux') - - # Build the ConfigParser object - config = configparser.ConfigParser() - config.optionxform = str - config.read(mipconv_config) - - # set the correct fields - config.set('COMMON', 'cdds_dir', cdds_dir) - config.set('request', 'base_date', base_date) - config.set('request', 'suite_id', suite_id) - stream_section = '_'.join(['stream', stream]) - # add the section if not there already - if not config.has_section(stream_section): - config.add_section(stream_section) - if 'mip' not in dataset: - # can work without any mip in dataset - # will not take it from diagnostic (will assemble - # all possible mappings instead) - logger.warning("No mip in the recipe dataset section.") - logger.warning("Assigning mapping from default dictionary.") - stream_map_default = STREAM_MAP[dataset['project']] - variables = [] - cmip_types = [] - for key, val in conf_file['STREAM_MAP'].items(): - for key_def, val_def in stream_map_default.items(): - if val == val_def: - cmip_types.append('_'.join([dataset['project'], key_def])) - variables.append(key) - str_variables = ' '.join(list(set([v for v in variables]))) - if variables: - for cmip_type in cmip_types: - config.set(stream_section, cmip_type, str_variables) - else: - cmip_type = '_'.join([dataset['project'], dataset['mip']]) - all_vars = conf_file['STREAM_MAP'].keys() - str_variables = ' '.join( - [v for v in all_vars if conf_file['STREAM_MAP'][v] == stream]) - config.set(stream_section, cmip_type, str_variables) - - # write to file - with open(mipconv_config, 'w') as r_c: - logger.info("Writing mip_convert config file %s", mipconv_config) - config.write(r_c) - - -def _put_in_env(env_script): - """Put new system vars in environment.""" - logger.info("Setting environment for suite submission...") - - # First make it executable. - chmod_command = ["chmod", "+x", env_script] - proc = subprocess.Popen(chmod_command, stdout=subprocess.PIPE) - proc.communicate() - logger.info("Script %s is now executable.", env_script) - - # set the environment - for line in open(env_script, 'r'): - if line.split("=")[0] == 'export PATH': - logger.info("Appending %s to path...", - line.split("=")[1].strip("\n")) - add_path = line.split("=")[1].strip("\n").strip(":$PATH") - os.environ["PATH"] += os.pathsep + add_path - elif line.split("=")[0] == 'export PYTHONPATH': - logger.info("Exporting %s as PYTHONPATH...", - line.split("=")[1].strip("\n")) - os.environ["PYTHONPATH"] = line.split("=")[1].strip("\n") - - # print and check - logger.info("New path: %s", str(os.environ["PATH"])) - logger.info("mip_convert PYTHONPATH: %s", str(os.environ["PYTHONPATH"])) - proc = subprocess.Popen(["which", "rose"], stdout=subprocess.PIPE) - out, err = proc.communicate() - logger.info("rose: %s %s", out, err) - proc = subprocess.Popen(["which", "mip_convert"], stdout=subprocess.PIPE) - out, err = proc.communicate() - logger.info("mip_convert: %s %s", out, err) - - -def _source_envs(suite): - """Source relevant environments.""" - # source the Met Office rose/cylc environment - # and the suite specific environment - suite_env = os.path.join(suite, 'env_setup_command_line.sh') # suite env - env_file_mo = os.path.join(suite, 'sourcepaths.sh') # metomi env - _put_in_env(suite_env) - _put_in_env(env_file_mo) - - -def _run_suite(suite): - """Run the mip_convert suite.""" - os.chdir(suite) - logger.info("Submitting suite from %s", suite) - proc = subprocess.Popen(["rose", "suite-run"], stdout=subprocess.PIPE) - out, err = proc.communicate() - logger.info("Rose communications: %s %s", str(out), str(err)) - - -def symlink_data(recipe_file, config_file, log_level): - """Grab the mip_converted output and manage it for ESMValTool.""" - # get configuration and recipe - recipe_object = read_yaml_file(recipe_file) - conf_file = read_yaml_file(config_file) - datasets = recipe_object['datasets'] - - # create directory that stores all the output netCDF files - now = datetime.datetime.utcnow().strftime("%Y%m%d_%H%M%S") - new_subdir = '_'.join((recipe_file.strip('.yml'), now)) - sym_output_dir = os.path.join(conf_file['ROSES_OUTPUT'], - 'mip_convert_symlinks', new_subdir) - if not os.path.exists(sym_output_dir): - os.makedirs(sym_output_dir) - - # set the logger to start outputting - _set_logger(logging, conf_file['ROSES_OUTPUT'], 'file_simlink.log', - log_level) - logger.info(HEADER) - - # loop through all datasets to symlink output - for dataset in datasets: - rose_output = os.path.join( - conf_file['ROSES_OUTPUT'], - conf_file['DATASET_TO_SUITE'][dataset['dataset']]) - logger.info("Working on dataset: %s", dataset) - logger.info("Output and logs written to: %s", rose_output) - - # create the dataset dir - dataset_output = os.path.join(sym_output_dir, dataset['dataset']) - if os.path.exists(dataset_output): - shutil.rmtree(dataset_output) - os.makedirs(dataset_output) - - # loop through files - for root, _, files in os.walk(rose_output): - for xfile in files: - real_file = os.path.join(root, xfile) - imag_file = os.path.join(dataset_output, xfile) - - # symlink it if nc file - if real_file.endswith('.nc') and \ - xfile.split('_')[2] == dataset['dataset']: - if not os.path.islink(imag_file): - logger.info("File to symlink: %s", real_file) - logger.info("Symlinked file: %s", imag_file) - os.symlink(real_file, imag_file) - else: - logger.info("Symlinked file exists...") - logger.info("Original file: %s", real_file) - logger.info("Symlinked file: %s", imag_file) - - -def main(): - """Run the the meat of the code.""" - logger.info("Running main function...") - args = get_args() - rose_config_template = os.path.join( - os.path.dirname(__file__), "rose-suite-template.conf") - - # make sure the file is retrieved nonetheless - if not os.path.isfile(rose_config_template): - logger.info("Fetching rose template config from suite %s", - DEFAULT_SUITE_LOCATION) - rose_config_template = os.path.join(DEFAULT_SUITE_LOCATION, - "rose-suite-template.conf") - - recipe_files = args.recipe_files - config_file = args.config_file - log_level = args.log_level - for recipe_file in recipe_files: - if args.mode == 'setup-only': - # set up the rose suites - write_rose_conf(rose_config_template, recipe_file, config_file, - log_level) - elif args.mode == 'setup-run-suites': - # setup roses - roses = write_rose_conf(rose_config_template, recipe_file, - config_file, log_level) - # set up the environment and submit - for rose in roses: - _source_envs(rose) - _run_suite(rose) - elif args.mode == 'postproc': - symlink_data(recipe_file, config_file, log_level) - - -if __name__ == '__main__': - main() diff --git a/esmvaltool/cmorizers/mip_convert/recipe_mip_convert.yml b/esmvaltool/cmorizers/mip_convert/recipe_mip_convert.yml deleted file mode 100644 index 8d5168a975..0000000000 --- a/esmvaltool/cmorizers/mip_convert/recipe_mip_convert.yml +++ /dev/null @@ -1,51 +0,0 @@ -#### summary -# Example of ESMValTool recipe that can be used with the mip_convert capability -# Data for this recipe exists in pp format on JASMIN, ready for mip_convert-ion -# The recipe is no different than any typical ESMValTool recipes, but can be used -# for a test run of mip_convert capability; see the README document and the included -# config-mipconv-user.yml configuration file. -# Author: V. Predoi (Uni Reading, valeriu.predoi@ncas.ac.uk) -# Date: first draft/November 2018 -########################################################################################################### ---- - -datasets: - - {dataset: UKESM1-0-LL, project: CMIP6, mip: Amon, exp: piControl-spinup, ensemble: r1i1p1f1_gn, start_year: 1850, end_year: 1860} - -preprocessors: - pp_rad: - regrid: - target_grid: 1x1 - scheme: linear - -diagnostics: - validation_mip_convert: - description: "Test with mip convert" - variables: - # mapping of standard_name to stream for CMIP6 - # see the associated config file for input - # "ps": "ap4", "ta": "ap4", "va": "ap4", "ua": "ap5", "mrsos": "ap5", "toz":"apm" - ps: - preprocessor: pp_rad - field: T2Ms - ta: - preprocessor: pp_rad - field: T2Ms - va: - preprocessor: pp_rad - field: T2Ms - ua: - preprocessor: pp_rad - field: T2Ms - toz: - preprocessor: pp_rad - field: T2Ms - scripts: - meridional_mean: - script: validation.py - title: "" - control_model: UKESM1-0-LL - exper_model: UKESM1-0-LL - analysis_type: meridional_mean - seasonal_analysis: True - diff --git a/esmvaltool/cmorizers/mip_convert/rose-suite-template.conf b/esmvaltool/cmorizers/mip_convert/rose-suite-template.conf deleted file mode 100644 index 5562333fed..0000000000 --- a/esmvaltool/cmorizers/mip_convert/rose-suite-template.conf +++ /dev/null @@ -1,20 +0,0 @@ -[jinja2:suite.rc] -ACTIVE_STREAMS = -CONCATENATE = "FALSE" -CYCLING_FREQUENCIES = -DUMMY_RUN = "FALSE" -FINAL_YEAR = -FIRST_YEAR = -REF_YEAR = -INPUT_DIR = -LOCATION = "LOTUS" -MEMORY = "70000" -MIP_CONVERT_CONFIG_DIR = -OUTPUT_DIR = -PARALLEL_TASKS = "20" -NTHREADS_CONCATENATE = "6" -CDDS_DIR = -STREAM_COMPONENTS = -STREAM_TIME_OVERRIDES = -TARGET_SUITE_NAME = -WALL_TIME = "6:00:00" diff --git a/esmvaltool/utils/rose-cylc/esmvt_rose_wrapper.py b/esmvaltool/utils/rose-cylc/esmvt_rose_wrapper.py deleted file mode 100644 index 5965877717..0000000000 --- a/esmvaltool/utils/rose-cylc/esmvt_rose_wrapper.py +++ /dev/null @@ -1,258 +0,0 @@ -r""" -Install and run u-bd684 - the esmvaltool rose-cylc suite. - -Usage: ------- --c --config-file: [REQUIRED] user specific configuration file; --r --recipe-file: [REQUIRED] single or multiple (space-sep) recipe files; --d --main-dir: [OPTIONAL] main run dir name (full path); - defaults to $HOME/ESMVALTOOL_ROSE; --s --suite-dir [OPTIONAL] u-bd684 dir full path; can be set by user; - defaults to $HOME/u-bd684; --n --no-submit [OPTIONAL] if specified, will not submit suite to cylc; --l --log-level: [OPTIONAL] log level, default=info - -Example: --------- -python esmvt_rose_wrapper.py -c /home/users/valeriu/input/config-user.yml \ - -r /home/users/valeriu/recipes/recipe1.yml \ - /home/users/valeriu/recipes/recipe2.yml \ - -d /home/users/valeriu/esmvat_WRAPPER \ - -s /home/users/valeriu/u-bd684/ \ - -n - -Base suite: ------------ -The base suite to run esmvaltool via rose-cylc is u-bd684; you can find -this suite in the Met Office Rose repository at: - -https://code.metoffice.gov.uk/svn/roses-u/b/d/6/8/4/trunk/ - -When rose (exec.) will be working with python3.x, this location will become -default and the pipeline will aceess it independently of user, unless, of -course the user will specify -s $SUITE_LOCATION; until then the user needs -to grab a copy of it in $HOME or specify the default location via -s option. - -Environment: ------------- -We will move to a unified and centrally-installed esmvaltool environment; -until then, the user will have to alter the env_setup script: - -u-bd684/app/esmvaltool/env_setup - -with the correct pointers to esmvaltool installation, if desired; -NOTE that the defaults are working pointers for an install on CEDA-Jasmin. - -To be able to submit to cylc, you need to have the /metomi/ suite in path -AND use a python2.7 environment. Use the Jasmin-example below for guidance. - -Jasmin-example: ---------------- -This shows how to interact with rose-cylc and run esmvaltool under cylc -using this script: - -export PATH=/apps/contrib/metomi/bin:$PATH -export PATH=/home/users/valeriu/miniconda2/bin:$PATH -mkdir esmvaltool_rose -cd esmvaltool_rose -cp $esmvaltool/utils/rose-cylc/esmvt_rose_wrapper.py . -[get u-bd684 in $HOME, get your recipes and the config] -python esmvt_rose_wrapper.py -c config-user.yml \ --r recipe_autoassess_stratosphere.yml recipe_OceanPhysics.yml \ --d $HOME/esmvaltool_rose - -Note that you need to pass FULL PATHS to cylc, no . or .. because all -operations are done remotely on different nodes. - -A practical actual example of running the tool can be found on JASMIN: -/home/users/valeriu/esmvaltool_rose -There you will find the run shell: run_example, as well as an example -how to set the configuration file. A copy of u-bd684 is always located -in /home/users/valeriu/roses/u-bd684. - -Contact: --------- -author: Valeriu Predoi (UREAD, valeriu.predoi@ncas.ac.uk) -""" -import argparse -import configparser -import logging -import os -import subprocess -import shutil - -import yaml - - -# set up logging -logger = logging.getLogger(__name__) - -# print the header -HEADER = r""" -______________________________________________________________________ - - ESMValTool Rose-Cylc Wrapper -______________________________________________________________________ - -""" + __doc__ - - -def get_args(): - """Define the `esmvaltool` command line.""" - # parse command line args - parser = argparse.ArgumentParser( - description=HEADER, - formatter_class=argparse.RawDescriptionHelpFormatter) - parser.add_argument( - '-c', - '--config-file', - default=os.path.join(os.path.dirname(__file__), 'config-user.yml'), - help='Configuration file') - parser.add_argument( - '-r', - '--recipe-files', - type=str, - nargs='+', - help='Recipe files (list or single file)') - parser.add_argument( - '-d', - '--main-dir', - default=os.path.join(os.environ['HOME'], 'ESMVALTOOL_ROSE'), - help='Main analysis directory; default to $HOME/ESMVALTOOL_ROSE') - parser.add_argument( - '-s', - '--suite-dir', - default=os.path.join(os.environ['HOME'], 'u-bd684'), - help='u-bd684 suite directory; default to $HOME/u-bd684') - parser.add_argument( - '-n', - '--no-submit', - action='store_true', - help="Flag to NOT submit the Rose suite.") - parser.add_argument( - '-l', - '--log-level', - default='info', - choices=['debug', 'info', 'warning', 'error']) - args = parser.parse_args() - return args - - -def _set_logger(logging, out_dir, log_file, log_level): - # set logging for screen and file output - root_logger = logging.getLogger() - out_fmt = "%(asctime)s %(levelname)-8s %(name)s,%(lineno)s\t%(message)s" - logging.basicConfig( - filename=os.path.join(out_dir, log_file), - filemode='a', - format=out_fmt, - datefmt='%H:%M:%S', - level=logging.DEBUG) - root_logger.setLevel(log_level.upper()) - logfmt = logging.Formatter(out_fmt) - console_handler = logging.StreamHandler() - console_handler.setFormatter(logfmt) - root_logger.addHandler(console_handler) - - -def read_yaml_file(yaml_file): - """Read recipe into a dictionary.""" - with open(yaml_file, 'r') as yfile: - loaded_file = yaml.safe_load(yfile) - return loaded_file - - -def _setup_work(rose_config_template, recipe_files, - config_file, main_dir, default_suite, log_level): - """Write the new rose conf file per suite.""" - # Build the ConfigParser object - config = configparser.ConfigParser() - config.optionxform = str - config.read(rose_config_template) - - # set the main work dir - if not os.path.exists(main_dir): - os.makedirs(main_dir) - - # assemble work tree - if not os.path.isfile(os.path.join(main_dir, config_file)): - shutil.copy2(config_file, main_dir) - if not os.path.exists(os.path.join(main_dir, 'recipes')): - os.makedirs(os.path.join(main_dir, 'recipes')) - if not os.path.exists(os.path.join(main_dir, - os.path.basename(config_file))): - shutil.copy2(config_file, main_dir) - recipes_field = [] - for recipe in recipe_files: - if not os.path.exists(os.path.join(main_dir, 'recipes', - os.path.basename(recipe))): - shutil.copy2(recipe, os.path.join(main_dir, 'recipes')) - recipes_field.append(os.path.basename(recipe).strip('.yml')) - rose_suite = os.path.join(main_dir, 'u-bd684') - if os.path.exists(rose_suite): - shutil.rmtree(rose_suite) - shutil.copytree(default_suite, rose_suite) - out_dir = os.path.join(main_dir, 'output') - if not os.path.exists(out_dir): - os.makedirs(out_dir) - - # set logging - _set_logger(logging, out_dir, 'setup.log', log_level) - logger.info(HEADER) - - # start logging - logger.info("Main working directory: %s", main_dir) - logger.info("Using Rose-Cylc suite base: %s", default_suite) - logger.info("Output and logs written to: %s", out_dir) - logger.info("Creating rose suite directories...") - logger.info("Use rose-suite.conf template %s", rose_config_template) - logger.info("Use user config file %s", config_file) - - # write the file - config.set('jinja2:suite.rc', 'INPUT_DIR', - '"' + main_dir + '"') - config.set('jinja2:suite.rc', 'OUTPUT_DIR', '"' + out_dir + '"') - config.set('jinja2:suite.rc', 'RECIPES', str(recipes_field)) - with open(os.path.join(rose_suite, 'rose-suite.conf'), 'w') as r_c: - logger.info("Writing rose-suite.conf file %s", - os.path.join(rose_suite, 'rose-suite.conf')) - config.write(r_c) - - return rose_suite - - -def _run_suite(suite): - """Run the mip_convert suite.""" - os.chdir(suite) - logger.info("Submitting suite from %s", suite) - proc = subprocess.Popen(["rose", "suite-run"], stdout=subprocess.PIPE) - out, err = proc.communicate() - logger.info("Rose communications: %s %s", str(out), str(err)) - - -def main(): - """Run the the meat of the code.""" - logger.info("Running main function...") - args = get_args() - # rose suite default location - if args.suite_dir: - default_suite = args.suite_dir - rose_config_template = os.path.join(default_suite, "rose-suite.conf") - - # get command line arguments - recipe_files = args.recipe_files - config_file = args.config_file - main_dir = args.main_dir - log_level = args.log_level - - # setup rose suite - run_rose = _setup_work(rose_config_template, recipe_files, - config_file, main_dir, default_suite, log_level) - - # submit to cylc - if not args.no_submit: - _run_suite(run_rose) - - -if __name__ == '__main__': - main() diff --git a/setup.py b/setup.py index 33ec620fbf..d2bccff2c9 100755 --- a/setup.py +++ b/setup.py @@ -246,8 +246,6 @@ def read_description(filename): }, entry_points={ 'console_scripts': [ - 'mip_convert_setup = ' - 'esmvaltool.cmorizers.mip_convert.esmvt_mipconv_setup:main', 'nclcodestyle = esmvaltool.utils.nclcodestyle.nclcodestyle:_main', 'test_recipe = ' 'esmvaltool.utils.testing.recipe_settings.install_expand_run:main', From 1de5bf6c7ffda867819aa6ce8fdc53b7d6d23a64 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 3 Oct 2024 11:17:55 +0100 Subject: [PATCH 40/87] remove obsolete and inactive `tests/system` tests (#3760) --- tests/system/__init__.py | 1 - tests/system/config-test.yml | 44 ------ tests/system/data_simulator.py | 114 --------------- tests/system/esmvaltool_testlib.py | 227 ----------------------------- tests/system/test_recipes.py | 35 ----- 5 files changed, 421 deletions(-) delete mode 100644 tests/system/__init__.py delete mode 100644 tests/system/config-test.yml delete mode 100644 tests/system/data_simulator.py delete mode 100644 tests/system/esmvaltool_testlib.py delete mode 100644 tests/system/test_recipes.py diff --git a/tests/system/__init__.py b/tests/system/__init__.py deleted file mode 100644 index 5f7877c08d..0000000000 --- a/tests/system/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Test running esmvaltool""" diff --git a/tests/system/config-test.yml b/tests/system/config-test.yml deleted file mode 100644 index ec25dec23d..0000000000 --- a/tests/system/config-test.yml +++ /dev/null @@ -1,44 +0,0 @@ -############################################################################### -# Diagnostic test configuration file for the ESMValTool -# -# './setup.py test' will look for this file in the following locations -# and use the first config-test.yml file found: -# - current working directory -# - ~/.esmvaltool/ -# - ESMValTool/tests/test_diagnostics/ -# -############################################################################### ---- - -test: - # Execute system/diagnostic tests [false]/true - run: false - # Simulate input data using the dummydata module [true]/false - simulate_input: true - # Limit testing/generating reference data to the following recipes - # An empty list means any recipe in esmvaltool/nml - recipes: [ - recipe_MyVar.yml, - ] - -# Reference data configuration -reference: - # Directory containing reference output - output: ~/esmvaltool_reference_output - # Generate reference data instead of checking [false]/true - generate: false - -# Template for the user configuration file -user: - log_level: warning - exit_on_warning: false - output_file_type: pdf - save_intermediary_cubes: true - - rootpath: - CMIP5: ~/esmvaltool_simulated_input - OBS: ~/esmvaltool_simulated_input - default: ~/esmvaltool_simulated_input - - drs: - CMIP5: default diff --git a/tests/system/data_simulator.py b/tests/system/data_simulator.py deleted file mode 100644 index 203816ca0e..0000000000 --- a/tests/system/data_simulator.py +++ /dev/null @@ -1,114 +0,0 @@ -"""Simulate test data for `esmvaltool`.""" -import os -import sys -import tempfile -import time - -import numpy as np - -from esmvalcore import __version__ as core_ver -from packaging import version -if version.parse(core_ver) < version.parse('2.8.0'): - from esmvalcore._config import read_config_user_file -else: - from esmvalcore.config import CFG -if version.parse(core_ver) <= version.parse('2.7.1'): - from esmvalcore._recipe import read_recipe_file -else: - from esmvalcore._recipe.recipe import read_recipe_file - - -def get_input_filename(variable, rootpath, drs): - """Get a valid input filename.""" - # TODO: implement this according to esmvalcore._data_finder.py - # or patch get_input_filelist there. - return tempfile.NamedTemporaryFile().name + '.nc' - - -def write_data_file(short_name, filename, field, start_year, end_year): - """Write a file containing simulated data.""" - from dummydata.model2 import Model2 - from dummydata.model3 import Model3 - - if 'T2M' in field: - writer = Model2 - elif 'T3M' in field: - writer = Model3 - else: - raise NotImplementedError( - "Cannot create a model from field {}".format(field)) - - # TODO: Maybe this should be made configurable per diagnostic or model - cfg = { - 'ta': { - 'method': 'gaussian_blobs', - 'low': 223, - 'high': 303, - }, - 'pr': { - 'method': 'gaussian_blobs', - 'low': 1e-7, - 'high': 2e-4, - } - } - - kwargs = cfg[short_name] if short_name in cfg else {} - - writer( - var=short_name, - oname=filename, - start_year=start_year, - stop_year=end_year, - **kwargs) - - -def simulate_input_data(recipe_file, config_user_file=None): - """Simulate data for variables defined in recipe""" - if config_user_file: - if version.parse(core_ver) <= version.parse('2.8.0'): - user_config = read_config_user_file( - config_file=config_user_file, recipe_name='') - else: - user_config = CFG.load_from_file( - config_file=config_user_file, recipe_name='') - else: - user_config = { - 'rootpath': { - 'default': '.', - }, - 'drs': {}, - } - - recipe = read_recipe_file(recipe_file, user_config, initialize_tasks=False) - - start_time = time.time() - - for diagnostic in recipe.diagnostics.values(): - np.random.seed(0) - for variables in diagnostic['variables'].values(): - for variable in variables: - filename = get_input_filename( - variable=variable, - rootpath=user_config['rootpath'], - drs=user_config['drs']) - dirname = os.path.dirname(filename) - if not os.path.exists(dirname): - print("Creating {}".format(dirname)) - os.makedirs(dirname) - - print("Writing {}".format(filename)) - write_data_file( - short_name=variable['short_name'], - filename=filename, - field=variable['field'], - start_year=variable['start_year'], - end_year=variable['end_year'], - ) - - print( - "Simulating data took {:.0f} seconds".format(time.time() - start_time)) - - -if __name__ == '__main__': - for path in sys.argv[1:]: - simulate_input_data(recipe_file=path, config_user_file=None) diff --git a/tests/system/esmvaltool_testlib.py b/tests/system/esmvaltool_testlib.py deleted file mode 100644 index f73c639a89..0000000000 --- a/tests/system/esmvaltool_testlib.py +++ /dev/null @@ -1,227 +0,0 @@ -"""Provide a class for testing esmvaltool.""" - -import glob -import os -import shutil -import sys -from unittest import SkipTest - -import numpy as np -import yaml -# from easytest import EasyTest - -import esmvaltool - - -def _load_config(filename=None): - """Load test configuration""" - if filename is None: - # look in default locations for config-test.yml - config_file = 'config-test.yml' - default_locations = [ - '.', - '~/.esmvaltool', - os.path.dirname(__file__), - ] - for path in default_locations: - filepath = os.path.join(os.path.expanduser(path), config_file) - if os.path.exists(filepath): - filename = os.path.abspath(filepath) - break - - with open(filename, 'r') as file: - cfg = yaml.safe_load(file) - - cfg['configfile'] = filename - cfg['reference']['output'] = os.path.abspath( - os.path.expanduser(cfg['reference']['output'])) - - if cfg['test'].get('recipes', []) == []: - script_root = esmvaltool.get_script_root() - recipe_glob = os.path.join(script_root, 'nml', 'recipe_*.yml') - cfg['test']['recipes'] = glob.glob(recipe_glob) - - return cfg - - -_CFG = _load_config() - -RECIPES = _CFG['test']['recipes'] - - -def _create_config_user_file(output_directory): - """Write a config-user.yml file. - - Write a configuration file for running ESMValTool - such that it writes all output to `output_directory`. - """ - cfg = _CFG['user'] - - cfg['output_dir'] = output_directory - - # write to file - filename = os.path.join(output_directory, 'config-user.yml') - with open(filename, 'w') as file: - yaml.safe_dump(cfg, file) - - return filename - - -class ESMValToolTest: # was ESMValToolTest(EasyTest) - """Main class for ESMValTool test runs.""" - - def __init__(self, recipe, output_directory, ignore='', **kwargs): - """ - Create ESMValToolTest instance - - recipe: str - The filename of the recipe that should be tested. - output_directory : str - The name of a directory where results can be stored. - ignore: str or iterable of str - Glob patterns of files to be ignored when testing. - """ - if not _CFG['test']['run']: - raise SkipTest("System tests disabled in {}".format( - _CFG['configfile'])) - - self.ignore = (ignore, ) if isinstance(ignore, str) else ignore - - script_root = esmvaltool.get_script_root() - - # Set recipe path - if not os.path.exists(recipe): - recipe = os.path.join( - os.path.dirname(script_root), 'recipes', recipe) - self.recipe_file = os.path.abspath(recipe) - - # Simulate input data? - self.simulate_input = _CFG['test']['simulate_input'] - - # Create reference output? - self.create_reference_output = _CFG['reference']['generate'] - - # Define reference output path - reference_dir = os.path.join( - _CFG['reference']['output'], - os.path.splitext(os.path.basename(self.recipe_file))[0]) - - # If reference data is neither available nor should be generated, skip - if not (os.path.exists(reference_dir) or self.create_reference_output): - raise SkipTest( - "No reference data available for recipe {} in {}".format( - recipe, _CFG['reference']['output'])) - - # Write ESMValTool configuration file - self.config_user_file = _create_config_user_file(output_directory) - - super(ESMValToolTest, self).__init__( - exe='esmvaltool', - args=['-n', self.recipe_file, '-c', self.config_user_file], - output_directory=output_directory, - refdirectory=reference_dir, - **kwargs) - - def run(self, **kwargs): - """Run tests or generate reference data.""" - if self.simulate_input: - from .data_simulator import simulate_input_data - simulate_input_data( - recipe_file=self.recipe_file, - config_user_file=self.config_user_file) - - if self.create_reference_output: - self.generate_reference_output() - raise SkipTest("Generated reference data instead of running test") - else: - super(ESMValToolTest, self).run_tests(**kwargs) - - def generate_reference_output(self): - """Generate reference output. - - Generate reference data by executing the recipe and then moving - results to the output directory. - """ - if not os.path.exists(self.refdirectory): - self._execute() - shutil.move(self.output_directory, - os.path.dirname(self.refdirectory)) - else: - print("Warning: not generating reference data, reference " - "directory {} already exists.".format(self.refdirectory)) - - def _execute(self): - """Execute ESMValTool - - Override the _execute method because we want to run in our own - Python instance to get coverage reporting and we want to update - the location of `self.output_directory` afterwards. - """ - # run ESMValTool - sys.argv[1:] = self.args - esmvaltool.main.run() - - # Update the output directory to point to the output of the run - output_directory = self.output_directory # noqa - - output = [] - for path in os.listdir(output_directory): - path = os.path.join(output_directory, path) - if os.path.isdir(path): - output.append(path) - - if not output: - raise OSError( - "Output directory not found in location {}. " - "Probably ESMValTool failed to create any output.".format( - output_directory)) - - if len(output) > 1: - print("Warning: found multiple output directories:\n{}\nin output " - "location {}\nusing the first one.".format( - output, output_directory)) - - self.output_directory = output[0] + os.sep # noqa - - def _get_files_from_refdir(self): - """Get a list of files from reference directory. - - Ignore files that match patterns in self.ignore. - - Override this method of easytest.EasyTest to be able to ignore certain - files. - """ - from fnmatch import fnmatchcase - - matches = [] - for root, _, filenames in os.walk(self.refdirectory): - for filename in filenames: - path = os.path.join(root, filename) - relpath = os.path.relpath(path, start=self.refdirectory) - for pattern in self.ignore: - if fnmatchcase(relpath, pattern): - break - else: - matches.append(path) - - return matches - - def _compare_netcdf_values(self, f1, f2, allow_subset=False): - """Compare two netCDF4 Dataset instances. - - Check if dataset2 contains the same variable values as dataset1. - - Override this method of easytest.EasyTest because it is broken - for the case where value1 and value2 have no length. - """ - if allow_subset: # allow that only a subset of data is compared - raise NotImplementedError - - for key in f1.variables: - values1 = f1.variables[key][:] - values2 = f2.variables[key][:] - - if not np.array_equal(values1, values2): - return False - - return True diff --git a/tests/system/test_recipes.py b/tests/system/test_recipes.py deleted file mode 100644 index 0825707bd4..0000000000 --- a/tests/system/test_recipes.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Test script to compare the output of ESMValTool against previous runs.""" - -import shutil -import tempfile - -import pytest - -from .esmvaltool_testlib import RECIPES, ESMValToolTest - - -@pytest.fixture -def output_directory(): - """Create a directory for storing ESMValTool output.""" - tmp = tempfile.mkdtemp() - yield tmp - shutil.rmtree(tmp, ignore_errors=True) - - -@pytest.mark.parametrize("recipe", RECIPES) -def test_recipe(output_directory, recipe): # noqa - """Create a test for each recipe in RECIPES and run those.""" - test = ESMValToolTest( - recipe=recipe, - output_directory=output_directory, - ignore=['tmp/*/*', '*log*.txt', '*.log'], - checksum_exclude=['pdf', 'ps', 'png', 'eps', 'epsi', 'nc']) - - test.run( - graphics=None, - files='all', - check_size_gt_zero=True, - checksum_files='all', - check_file_content=['nc']) - - assert test.sucess From 1d3dbd497f1326142561e0bc0308b9a823ee5756 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Wed, 9 Oct 2024 18:08:50 +0100 Subject: [PATCH 41/87] Add support for Python=3.12 (#3501) Co-authored-by: Bouwe Andela --- .github/workflows/create-condalock-file.yml | 2 +- .github/workflows/install-from-conda.yml | 2 +- .../workflows/install-from-condalock-file.yml | 2 +- .github/workflows/install-from-source.yml | 2 +- .github/workflows/pypi-build-and-deploy.yml | 4 +-- .github/workflows/run-tests-monitor.yml | 4 +-- .github/workflows/test-development.yml | 2 +- .github/workflows/test.yml | 6 ++-- environment.yml | 29 ++++++++++--------- environment_osx.yml | 27 ++++++++--------- .../climate_metrics/feedback_parameters.py | 2 +- setup.py | 15 +++++----- 12 files changed, 51 insertions(+), 46 deletions(-) diff --git a/.github/workflows/create-condalock-file.yml b/.github/workflows/create-condalock-file.yml index a88f919c17..7e1431f56f 100644 --- a/.github/workflows/create-condalock-file.yml +++ b/.github/workflows/create-condalock-file.yml @@ -27,7 +27,7 @@ jobs: with: auto-update-conda: true activate-environment: esmvaltool-fromlock - python-version: "3.11" + python-version: "3.12" miniforge-version: "latest" miniforge-variant: Mambaforge use-mamba: true diff --git a/.github/workflows/install-from-conda.yml b/.github/workflows/install-from-conda.yml index b08390040d..e80dc09748 100644 --- a/.github/workflows/install-from-conda.yml +++ b/.github/workflows/install-from-conda.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] name: Linux Python ${{ matrix.python-version }} steps: - uses: conda-incubator/setup-miniconda@v3 diff --git a/.github/workflows/install-from-condalock-file.yml b/.github/workflows/install-from-condalock-file.yml index a03e297a80..0f11cddc6e 100644 --- a/.github/workflows/install-from-condalock-file.yml +++ b/.github/workflows/install-from-condalock-file.yml @@ -30,7 +30,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] fail-fast: false name: Linux Python ${{ matrix.python-version }} steps: diff --git a/.github/workflows/install-from-source.yml b/.github/workflows/install-from-source.yml index 3d7456337b..81ba158184 100644 --- a/.github/workflows/install-from-source.yml +++ b/.github/workflows/install-from-source.yml @@ -19,7 +19,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] fail-fast: false name: Linux Python ${{ matrix.python-version }} steps: diff --git a/.github/workflows/pypi-build-and-deploy.yml b/.github/workflows/pypi-build-and-deploy.yml index 4dff1e4d69..d6df3626e6 100644 --- a/.github/workflows/pypi-build-and-deploy.yml +++ b/.github/workflows/pypi-build-and-deploy.yml @@ -17,10 +17,10 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Set up Python 3.11 + - name: Set up Python 3.12 uses: actions/setup-python@v1 with: - python-version: "3.11" + python-version: "3.12" - name: Install pep517 run: >- python -m diff --git a/.github/workflows/run-tests-monitor.yml b/.github/workflows/run-tests-monitor.yml index 168d8940e5..7576befa8c 100644 --- a/.github/workflows/run-tests-monitor.yml +++ b/.github/workflows/run-tests-monitor.yml @@ -23,7 +23,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] name: Linux Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v4 @@ -67,7 +67,7 @@ jobs: runs-on: "macos-latest" strategy: matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} diff --git a/.github/workflows/test-development.yml b/.github/workflows/test-development.yml index 2dba36577d..ce80793236 100644 --- a/.github/workflows/test-development.yml +++ b/.github/workflows/test-development.yml @@ -26,7 +26,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] name: Linux Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f3822e5449..05905a4dac 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] name: Linux Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v4 @@ -45,6 +45,8 @@ jobs: run: conda list - name: Install ESMValTool run: pip install -e .[develop] 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/install.txt + - name: Examine conda environment + run: conda list - name: Install Julia dependencies run: esmvaltool install Julia - name: Export Python minor version @@ -72,7 +74,7 @@ jobs: runs-on: "macos-latest" strategy: matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} diff --git a/environment.yml b/environment.yml index 0864f750d2..b8f16074e4 100644 --- a/environment.yml +++ b/environment.yml @@ -23,12 +23,13 @@ dependencies: - distributed - ecmwf-api-client - eofs - - esmpy >=8.6.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 + - esmpy # <8.6 safe https://github.com/SciTools/iris-esmf-regrid/issues/415 - esmvalcore 2.11.* - fiona - fire - fsspec - - gdal + - gdal >=3.9.0 + - importlib_metadata <8 # https://github.com/ESMValGroup/ESMValTool/issues/3699 only for Python 3.10/11 and esmpy<8.6 - iris >=3.6.1 - iris-esmf-regrid >=0.10.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - jinja2 @@ -40,24 +41,24 @@ dependencies: - nc-time-axis - netCDF4 - numba - - numpy !=1.24.3 # severe masking bug + - numpy !=1.24.3,<2.0 # severe masking bug - openpyxl - packaging - - pandas !=2.2.0,!=2.2.1,!=2.2.2 # github.com/ESMValGroup/ESMValCore/pull/2305 + - pandas==2.1.4 # unpin when ESMValCore released with https://github.com/ESMValGroup/ESMValCore/pull/2529 - pip !=21.3 - progressbar2 - prov - - psyplot - - psy-maps - - psy-reg - - psy-simple + - psyplot >=1.5.0 + - psy-maps >=1.5.0 + - psy-reg >=1.5.0 + - psy-simple >=1.5.0 - pyproj >=2.1 - pys2index # only from conda-forge - - python >=3.10 + - python >=3.10,<3.13 - python-cdo - python-dateutil - pyyaml - - rasterio + - rasterio >=1.3.10 - requests - ruamel.yaml - scikit-image @@ -65,14 +66,14 @@ dependencies: - scipy - seaborn - seawater - - shapely >=2 + - shapely >=2.0.2 - xarray >=0.12.0 - xesmf >=0.7.1 - xgboost >1.6.1 # github.com/ESMValGroup/ESMValTool/issues/2779 - xlsxwriter - zarr # Python packages needed for unit testing - - flake8 ==5.0.4 + - flake8 >=6 - pytest >=3.9,!=6.0.0rc1,!=6.0.0 - pytest-cov - pytest-env @@ -91,14 +92,14 @@ dependencies: - imagehash - isort ==5.13.2 - pre-commit - - prospector + - prospector >=1.12 # earliest support for Python 3.12 - pyroma # - vprof not on conda-forge - yamllint ==1.35.1 - yapf ==0.32.0 # NCL and dependencies - - ncl + - ncl >=6.6.2 - cdo - imagemagick - nco diff --git a/environment_osx.yml b/environment_osx.yml index baffec74d2..79701df88c 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -22,12 +22,13 @@ dependencies: - distributed - ecmwf-api-client - eofs - - esmpy >=8.6.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 + - esmpy # <8.6 safe https://github.com/SciTools/iris-esmf-regrid/issues/415 - esmvalcore 2.11.* - fiona - fire - fsspec - - gdal + - gdal >=3.9.0 + - importlib_metadata <8 # https://github.com/ESMValGroup/ESMValTool/issues/3699 only for Python 3.10/11 and esmpy<8.6 - iris >=3.6.1 - iris-esmf-regrid >=0.10.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - jinja2 @@ -39,24 +40,24 @@ dependencies: - nc-time-axis - netCDF4 - numba - - numpy !=1.24.3 # severe masking bug + - numpy !=1.24.3,<2.0 # severe masking bug - openpyxl - packaging - - pandas !=2.2.0,!=2.2.1,!=2.2.2 # github.com/ESMValGroup/ESMValCore/pull/2305 + - pandas==2.1.4 # unpin when ESMValCore released with https://github.com/ESMValGroup/ESMValCore/pull/2529 - pip !=21.3 - progressbar2 - prov - - psyplot - - psy-maps - - psy-reg - - psy-simple + - psyplot >=1.5.0 + - psy-maps >=1.5.0 + - psy-reg >=1.5.0 + - psy-simple >=1.5.0 - pyproj >=2.1 - pys2index # only from conda-forge - - python >=3.10 + - python >=3.10,<3.13 - python-cdo - python-dateutil - pyyaml - - rasterio + - rasterio >=1.3.10 - requests - ruamel.yaml - scikit-image @@ -64,14 +65,14 @@ dependencies: - scipy - seaborn - seawater - - shapely >=2 + - shapely >=2.0.2 - xarray >=0.12.0 - xesmf >=0.7.1 - xgboost >1.6.1 # github.com/ESMValGroup/ESMValTool/issues/2779 - xlsxwriter - zarr # Python packages needed for unit testing - - flake8 ==5.0.4 + - flake8 >=6 - pytest >=3.9,!=6.0.0rc1,!=6.0.0 - pytest-cov - pytest-env @@ -90,7 +91,7 @@ dependencies: - imagehash - isort ==5.13.2 - pre-commit - - prospector + - prospector >=1.12 # earliest support for Python 3.12 - pyroma # - vprof not on conda-forge - yamllint ==1.35.1 diff --git a/esmvaltool/diag_scripts/climate_metrics/feedback_parameters.py b/esmvaltool/diag_scripts/climate_metrics/feedback_parameters.py index db350982a2..d6bd28b0fb 100644 --- a/esmvaltool/diag_scripts/climate_metrics/feedback_parameters.py +++ b/esmvaltool/diag_scripts/climate_metrics/feedback_parameters.py @@ -365,7 +365,7 @@ def _create_regression_plot(tas_cube, y_reg = reg.slope * x_reg + reg.intercept # Plot data - title = (f'{FEEDBACK_PARAMETERS.get(var,var)} TOA radiance for ' + title = (f'{FEEDBACK_PARAMETERS.get(var, var)} TOA radiance for ' f'{dataset_name}') filename = f'{var}_regression_{dataset_name}' if description is not None: diff --git a/setup.py b/setup.py index d2bccff2c9..8da8fb0d18 100755 --- a/setup.py +++ b/setup.py @@ -51,17 +51,17 @@ 'numpy!=1.24.3', # severe masking bug 'openpyxl', 'packaging', - 'pandas!=2.2.0,!=2.2.1,!=2.2.2', # ESMValCore PR2305 + 'pandas==2.1.4', # see note in environment.yml 'progressbar2', - 'psyplot', - 'psy-maps', - 'psy-reg', - 'psy-simple', + 'psyplot>=1.5.0', # psy*<1.5.0 are not py312 compat + 'psy-maps>=1.5.0', + 'psy-reg>=1.5.0', + 'psy-simple>=1.5.0', 'pyproj>=2.1', 'pys2index', 'python-dateutil', 'pyyaml', - 'rasterio', + 'rasterio>=1.3.10', 'requests', 'ruamel.yaml', 'scikit-image', @@ -104,7 +104,7 @@ 'imagehash', 'isort', 'pre-commit', - 'prospector[with_pyroma]!=1.1.6.3,!=1.1.6.4', + 'prospector[with_pyroma]>=1.12', 'vprof', 'yamllint', 'yapf', @@ -224,6 +224,7 @@ def read_description(filename): 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', 'Topic :: Scientific/Engineering', 'Topic :: Scientific/Engineering :: Atmospheric Science', 'Topic :: Scientific/Engineering :: GIS', From 7b1cd473e62326ca26e084c16d57da79644a6d11 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 10 Oct 2024 16:32:53 +0100 Subject: [PATCH 42/87] Pin cartopy to `cartopy<0.24` (#3768) --- environment.yml | 2 +- environment_osx.yml | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/environment.yml b/environment.yml index b8f16074e4..270f0f6ecd 100644 --- a/environment.yml +++ b/environment.yml @@ -10,7 +10,7 @@ channels: dependencies: - aiohttp - - cartopy + - cartopy <0.24 # https://github.com/ESMValGroup/ESMValTool/issues/3767 - cdo >=2.3.0 - cdsapi - cf-units diff --git a/environment_osx.yml b/environment_osx.yml index 79701df88c..07fdf96de7 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -10,7 +10,7 @@ channels: dependencies: - aiohttp - - cartopy + - cartopy <0.24 # https://github.com/ESMValGroup/ESMValTool/issues/3767 - cdo >=2.3.0 - cdsapi - cf-units diff --git a/setup.py b/setup.py index 8da8fb0d18..6b4636d1f7 100755 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ # Use with pip install . to install from source 'install': [ 'aiohttp', - 'cartopy', + 'cartopy<0.24', # github.com/ESMValGroup/ESMValTool/issues/3767 'cdo', 'cdsapi', 'cf-units', From 2dbeb8d5ffa01913460d68a864e3a0853a0c42ab Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Tue, 15 Oct 2024 16:30:55 +0100 Subject: [PATCH 43/87] retire Mambaforge (#3774) --- .github/workflows/create-condalock-file.yml | 1 - .github/workflows/install-from-conda.yml | 1 - .github/workflows/install-from-source.yml | 1 - .github/workflows/run-tests-monitor.yml | 2 -- .github/workflows/test-development.yml | 1 - .github/workflows/test.yml | 2 -- doc/sphinx/source/quickstart/installation.rst | 6 +++--- 7 files changed, 3 insertions(+), 11 deletions(-) diff --git a/.github/workflows/create-condalock-file.yml b/.github/workflows/create-condalock-file.yml index 7e1431f56f..87cfb5d86f 100644 --- a/.github/workflows/create-condalock-file.yml +++ b/.github/workflows/create-condalock-file.yml @@ -29,7 +29,6 @@ jobs: activate-environment: esmvaltool-fromlock python-version: "3.12" miniforge-version: "latest" - miniforge-variant: Mambaforge use-mamba: true - name: Show conda config run: | diff --git a/.github/workflows/install-from-conda.yml b/.github/workflows/install-from-conda.yml index e80dc09748..185add02a8 100644 --- a/.github/workflows/install-from-conda.yml +++ b/.github/workflows/install-from-conda.yml @@ -27,7 +27,6 @@ jobs: with: python-version: ${{ matrix.python-version }} miniforge-version: "latest" - miniforge-variant: Mambaforge use-mamba: true - run: mkdir -p conda_install_linux_artifacts_python_${{ matrix.python-version }} - name: Record versions diff --git a/.github/workflows/install-from-source.yml b/.github/workflows/install-from-source.yml index 81ba158184..018fcb2a0a 100644 --- a/.github/workflows/install-from-source.yml +++ b/.github/workflows/install-from-source.yml @@ -32,7 +32,6 @@ jobs: environment-file: environment.yml python-version: ${{ matrix.python-version }} miniforge-version: "latest" - miniforge-variant: Mambaforge use-mamba: true - run: mkdir -p source_install_linux_artifacts_python_${{ matrix.python-version }} - name: Record versions diff --git a/.github/workflows/run-tests-monitor.yml b/.github/workflows/run-tests-monitor.yml index 7576befa8c..1fc657e387 100644 --- a/.github/workflows/run-tests-monitor.yml +++ b/.github/workflows/run-tests-monitor.yml @@ -35,7 +35,6 @@ jobs: environment-file: environment.yml python-version: ${{ matrix.python-version }} miniforge-version: "latest" - miniforge-variant: Mambaforge use-mamba: true - run: mkdir -p test_linux_artifacts_python_${{ matrix.python-version }} - name: Record versions @@ -82,7 +81,6 @@ jobs: environment-file: environment_osx.yml python-version: ${{ matrix.python-version }} miniforge-version: "latest" - miniforge-variant: Mambaforge use-mamba: true # - name: Install libomp with homebrew # run: brew install libomp diff --git a/.github/workflows/test-development.yml b/.github/workflows/test-development.yml index ce80793236..f6718a866e 100644 --- a/.github/workflows/test-development.yml +++ b/.github/workflows/test-development.yml @@ -38,7 +38,6 @@ jobs: environment-file: environment.yml python-version: ${{ matrix.python-version }} miniforge-version: "latest" - miniforge-variant: Mambaforge use-mamba: true - run: mkdir -p develop_test_linux_artifacts_python_${{ matrix.python-version }} - name: Record versions diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 05905a4dac..8b3c9ceb39 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,7 +32,6 @@ jobs: environment-file: environment.yml python-version: ${{ matrix.python-version }} miniforge-version: "latest" - miniforge-variant: Mambaforge use-mamba: true - run: mkdir -p test_linux_artifacts_python_${{ matrix.python-version }} - name: Record versions @@ -89,7 +88,6 @@ jobs: environment-file: environment_osx.yml python-version: ${{ matrix.python-version }} miniforge-version: "latest" - miniforge-variant: Mambaforge use-mamba: true # - name: Install libomp with homebrew # run: brew install libomp diff --git a/doc/sphinx/source/quickstart/installation.rst b/doc/sphinx/source/quickstart/installation.rst index 4fb75b2f4f..891494348b 100644 --- a/doc/sphinx/source/quickstart/installation.rst +++ b/doc/sphinx/source/quickstart/installation.rst @@ -72,15 +72,15 @@ https://mamba.readthedocs.io/en/latest/installation.html. installation. First download the installation file for -`Linux `_ +`Linux `_ or -`MacOSX `_. +`MacOSX `_. After downloading the installation file from one of the links above, execute it by running (Linux example): .. code-block:: bash - bash Mambaforge-Linux-x86_64.sh + bash Miniforge3-Linux-x86_64.sh and follow the instructions on your screen. From 83035302f29d62089578f93429b33a07c91f6ac0 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Wed, 16 Oct 2024 15:04:46 +0100 Subject: [PATCH 44/87] Retire mambaforge - addendum to 3774 (#3778) --- .circleci/config.yml | 10 +++++----- doc/sphinx/source/quickstart/installation.rst | 6 +++--- doc/sphinx/source/utils.rst | 2 +- docker/Dockerfile | 2 +- docker/Dockerfile.dev | 2 +- docker/Dockerfile.exp | 2 +- esmvaltool/utils/batch-jobs/generate.py | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5957a5e7e3..eb13a0ef08 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -158,7 +158,7 @@ jobs: test_installation_from_source_test_mode: # Test installation from source docker: - - image: condaforge/mambaforge:latest + - image: condaforge/miniforge3:latest resource_class: large steps: - test_installation_from_source: @@ -167,7 +167,7 @@ jobs: test_installation_from_source_develop_mode: # Test development installation docker: - - image: condaforge/mambaforge:latest + - image: condaforge/miniforge3:latest resource_class: large steps: - test_installation_from_source: @@ -179,7 +179,7 @@ jobs: # purpose of this test to discover backward-incompatible changes early on in # the development cycle. docker: - - image: condaforge/mambaforge:latest + - image: condaforge/miniforge3:latest resource_class: large steps: - run: @@ -233,7 +233,7 @@ jobs: build_documentation: # Test building documentation docker: - - image: condaforge/mambaforge:latest + - image: condaforge/miniforge3:latest resource_class: medium steps: - checkout @@ -257,7 +257,7 @@ jobs: test_installation_from_conda: # Test conda package installation docker: - - image: condaforge/mambaforge:latest + - image: condaforge/miniforge3:latest resource_class: large steps: - run: diff --git a/doc/sphinx/source/quickstart/installation.rst b/doc/sphinx/source/quickstart/installation.rst index 891494348b..9f66c1f670 100644 --- a/doc/sphinx/source/quickstart/installation.rst +++ b/doc/sphinx/source/quickstart/installation.rst @@ -99,7 +99,7 @@ later by running: source /etc/profile.d/conda.sh where ```` is the installation location of mamba (e.g. -``/home/$USER/mambaforge`` if you chose the default installation path). +``/home/$USER/miniforge3`` if you chose the default installation path). If you use another shell than Bash, have a look at the available configurations in the ``/etc/profile.d`` directory. @@ -111,7 +111,7 @@ You can check that mamba installed correctly by running which mamba this should show the path to your mamba executable, e.g. -``~/mambaforge/bin/mamba``. +``~/miniforge3/bin/mamba``. It is recommended to update both mamba and conda after installing: @@ -489,7 +489,7 @@ To check that the installation was successful, run this should show the directory of the source code that you just downloaded. If the command above shows a directory inside your conda environment instead, -e.g. ``~/mambaforge/envs/esmvaltool/lib/python3.11/site-packages/esmvalcore``, +e.g. ``~/miniforge3/envs/esmvaltool/lib/python3.11/site-packages/esmvalcore``, you may need to manually remove that directory and run ``pip install --editable '.[develop]'`` again. diff --git a/doc/sphinx/source/utils.rst b/doc/sphinx/source/utils.rst index 71de0e01f6..49c3df7aef 100644 --- a/doc/sphinx/source/utils.rst +++ b/doc/sphinx/source/utils.rst @@ -177,7 +177,7 @@ The following parameters have to be set in the script in order to make it run: * ``submit``, *bool*: Whether or not to automatically submit the job after creating the launch script. Default value is ``False``. * ``account``, *str*: Name of the DKRZ account in which the job will be billed. * ``outputs``, *str*: Name of the directory in which the job outputs (.out and .err files) are going to be saved. The outputs will be saved in `/home/user/`. -* ``conda_path``, *str*: Full path to the `mambaforge/etc/profile.d/conda.sh` executable. +* ``conda_path``, *str*: Full path to the `miniforge3/etc/profile.d/conda.sh` executable. Optionally, the following parameters can be edited: diff --git a/docker/Dockerfile b/docker/Dockerfile index 9ee3ddf0f8..9670028c7b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,6 @@ # To build this container, go to ESMValTool root folder and execute: # docker build -t esmvaltool:latest . -f docker/Dockerfile -FROM condaforge/mambaforge +FROM condaforge/miniforge3 WORKDIR /src/ESMValTool COPY environment.yml . diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index 65f1a34ea5..b7204abaa7 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -1,6 +1,6 @@ # To build this container, go to ESMValTool root folder and execute: # docker build -t esmvaltool:development . -f docker/Dockerfile.dev -FROM condaforge/mambaforge +FROM condaforge/miniforge3 WORKDIR /src/ESMValTool RUN apt update && DEBIAN_FRONTEND=noninteractive apt install -y curl git ssh && apt clean diff --git a/docker/Dockerfile.exp b/docker/Dockerfile.exp index a522995fc4..062a64b8ab 100644 --- a/docker/Dockerfile.exp +++ b/docker/Dockerfile.exp @@ -1,6 +1,6 @@ # To build this container, go to ESMValTool root folder and execute: # docker build -t esmvaltool:experimental . -f docker/Dockerfile.exp -FROM condaforge/mambaforge +FROM condaforge/miniforge3 RUN apt update && apt install -y git && apt clean WORKDIR /src/ESMValTool diff --git a/esmvaltool/utils/batch-jobs/generate.py b/esmvaltool/utils/batch-jobs/generate.py index afba37906f..d1ceeffaa0 100644 --- a/esmvaltool/utils/batch-jobs/generate.py +++ b/esmvaltool/utils/batch-jobs/generate.py @@ -46,9 +46,9 @@ memory = '64G' # Default walltime time = '04:00:00' -# Full path to the mambaforge/etc/profile.d/conda.sh executable +# Full path to the miniforge3/etc/profile.d/conda.sh executable # Set the path to conda -conda_path = 'PATH_TO/mambaforge/etc/profile.d/conda.sh' +conda_path = 'PATH_TO/miniforge3/etc/profile.d/conda.sh' # Full path to config_file # If none, ~/.esmvaltool/config-user.yml is used config_file = '' From aa56eaadcc3cf4da59ee3b41e1ee3177b25e8c29 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Wed, 16 Oct 2024 19:10:11 +0100 Subject: [PATCH 45/87] Pin mamba<2 for conda-lock: solution by Ben Mares @maresb (#3771) --- .github/workflows/create-condalock-file.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-condalock-file.yml b/.github/workflows/create-condalock-file.yml index 87cfb5d86f..4ae10de3e2 100644 --- a/.github/workflows/create-condalock-file.yml +++ b/.github/workflows/create-condalock-file.yml @@ -36,7 +36,8 @@ jobs: conda --version # setup-miniconda@v3 installs an old conda and mamba # forcing a modern mamba updates both mamba and conda - conda install -c conda-forge "mamba>=1.4.8" + # pin <2 due to https://github.com/ESMValGroup/ESMValTool/pull/3771 + conda install -c conda-forge "mamba>=1.4.8,<2" conda config --show-sources conda config --show conda --version From b6f62ab1a2a45cba2e8ca70a8c70208c55342854 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 17 Oct 2024 17:05:38 +0100 Subject: [PATCH 46/87] update Docker builds badge in README (#3783) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aba76671cc..4ac7d694ee 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![CircleCI](https://circleci.com/gh/ESMValGroup/ESMValTool/tree/main.svg?style=svg)](https://circleci.com/gh/ESMValGroup/ESMValTool/tree/main) [![Test in Full Development Mode](https://github.com/ESMValGroup/ESMValTool/actions/workflows/test-development.yml/badge.svg)](https://github.com/ESMValGroup/ESMValTool/actions/workflows/test-development.yml) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/79bf6932c2e844eea15d0fb1ed7e415c)](https://app.codacy.com/gh/ESMValGroup/ESMValTool/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) -[![Docker Build Status](https://img.shields.io/docker/cloud/build/esmvalgroup/esmvaltool.svg)](https://hub.docker.com/r/esmvalgroup/esmvaltool/) +[![Docker Build Status](https://img.shields.io/docker/automated/esmvalgroup/esmvaltool)](https://hub.docker.com/r/esmvalgroup/esmvaltool/) [![Anaconda-Server Badge](https://img.shields.io/conda/vn/conda-forge/ESMValTool?color=blue&label=conda-forge&logo=conda-forge&logoColor=white)](https://anaconda.org/conda-forge/esmvaltool) ![stand with Ukraine](https://badgen.net/badge/stand%20with/UKRAINE/?color=0057B8&labelColor=FFD700) From c8d0ffb55737cecfeddd6c493262f647cf7c18a1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 13:01:35 +0100 Subject: [PATCH 47/87] [Condalock] Update Linux condalock file (#3786) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 624 ++++++++++++++++++++++---------------------- 1 file changed, 314 insertions(+), 310 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 4666bce730..5535cdcaa0 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,50 +1,53 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 6e839dcc54104cc7c8d7d0b0165df84d0b927a0baf129e4169a57ac283fe3f98 +# input_hash: fafc256cb40a5d6ebcbc180cb08e91d1bd9ca77a04c258188faad5c05c60f1b9 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/_py-xgboost-mutex-2.0-gpu_0.tar.bz2#7702188077361f43a4d61e64c694f850 https://conda.anaconda.org/conda-forge/noarch/_r-mutex-1.0.1-anacondar_1.tar.bz2#19f9db5f4f1b7f5ef5f6d67207f25f38 -https://conda.anaconda.org/conda-forge/noarch/_sysroot_linux-64_curr_repodata_hack-3-h69a702a_16.conda#1c005af0c6ff22814b7c52ee448d4bea https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda#670f0e1593b8c1d84f57ad5fe5256799 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 -https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.4-ha770c72_0.conda#61c94057aaa5ae6145137ce1fddb2c04 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 +https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_17.conda#285931bd28b3b8f176d46dd9fd627a09 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.5-ha770c72_0.conda#2889e6b9c666c3a564ab90cedc5832fd https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd -https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.7-0.tar.bz2#23acfc5a339a6a34cc2241f64e4111be +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-h4a8ded7_16.conda#ff7f38675b226cfb855aebfc32a13e31 -https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.1.0-h5d3d1c9_101.conda#713834677de996ac1bc1b0b305ba46ba -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 -https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.1.0-h5d3d1c9_101.conda#e007246a554aaf42f73fbfd4be8db3e4 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda#83e1364586ceb8d0739fbc85b5c95837 +https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.2.0-h41c2201_101.conda#fb126e22f5350c15fec6ddbd062f4871 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 +https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.2.0-h41c2201_101.conda#60b9a16fd147f7184b5a964aa08f3b0f +https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_17.conda#f58cb23983633068700a756f0b5f165a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_1.conda#5f354010f194e85dc681dec92405ef9e https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_16.conda#223fe8a3ff6d5e78484a9d58eb34d055 -https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-ha1999f0_7.conda#3f840c7ed70a96b5ebde8044b2f36f32 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda#1b53af320b24547ce0fb8196d2604542 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda#2b780c0338fc0ffa678ac82c54af51fd https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 -https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_1.conda#cd0fbfe1f70b630a94e40007dae3328d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda#33405d2a66b1411db9f7242c8b97c9e7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024b-hb9d3cd8_0.conda#db124840386e1f842f93372897d1b857 -https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-hb9d3cd8_1003.conda#32623b33f2047dbc9ae2f2e8fd3880e9 -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-hb9d3cd8_1003.conda#e87bfacb110d85e1eb6099c9ed8e7236 -https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-hb9d3cd8_1003.conda#bf90782559bce8447609933a7d45995a +https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda#19608a9656912805b2b9a2f6bd257b04 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda#77cbc488235ebbaab2b6e912d3934bae +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-hb9d3cd8_1008.conda#a63f5b66876bb1ec734ab4bdc4d11e86 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.15-hd590300_0.conda#ad8955a300fd09e97e76c38638ac7157 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda#7c21106b851ec72c037b162c216d8f05 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda#f301eb944d297fc879c441fffe461d8a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda#5e08c385a1b8a79b52012b74653bbb99 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda#bfe6623096906d2502c78ccdbfc3bc7a +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h756ea98_11.conda#eadcc12bedac44f13223a2909c0e5bcc https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 @@ -58,154 +61,162 @@ https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda#5aea https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-he02047a_3.conda#efab66b82ec976930b96d62a976de8e7 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 -https://conda.anaconda.org/conda-forge/linux-64/libnl-3.10.0-h4bc722e_0.conda#6221e705f55cf0533f0777ae54ad86c6 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2#e728e874159b042d92b90238a3cb0dc2 https://conda.anaconda.org/conda-forge/linux-64/libopenlibm4-0.8.1-hd590300_1.conda#e6af610e01d04927a5060c95ce4e0875 -https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.1.0-hcba0ae0_1.conda#b56e6664bb9a57a29fd91df582223409 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 +https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.2.0-h2a3dede_1.conda#160623b9425f5c04941586da43bd1a9c https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e -https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.7-he02047a_1.conda#2ca22c3c01cf286675450d3c455c717e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2#ede4266dc02e875fe1ea77b25dd43747 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda#049b7df8bae5e184d1de42cdf64855f8 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 -https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda#40ccb8318df2500f83bd868dd8fcd201 +https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-hd0bcaf9_1007.conda#28eb714416de4eb83e2cbc47e99a1b45 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda#1bee70681f504ea424fb07cdb090c001 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.12-h06160fa_0.conda#bf1899cfd6dea061a220fa7e96a1f4bd +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.5-h3931f03_0.conda#334dba9982ab9f5d62033c61698a8683 https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 -https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.10-h5888daf_0.conda#040f0ca9f518151897759ad09ea98b2d https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.0.7-h0b41bf4_0.conda#49e8329110001f04923fe7e864990b0c +https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h5888daf_2.conda#e0409515c467b87176b070bff5d9442e +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.2-h5888daf_0.conda#135fd3c66bccad3d2254f50f9809e86a https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.11-heb1d5e4_0.conda#98784bb35b316e2ba8698f4a75326e9a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-hce8ee76_3.conda#b19224a5179ecb512c4aac9f8a6d57a7 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.15-hce8ee76_3.conda#0c4f0205a1ae4ca6c89af922ec54271c -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-hce8ee76_3.conda#9aa734a17b9b0b793c7696435fe7789a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda#700f1883f5a0a28c30fd98c43d4d946f https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/bwidget-1.9.14-ha770c72_1.tar.bz2#5746d6202ba2abad4a4707f2a2462795 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 -https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.1.0-h3c94d91_1.conda#4e32ec060bf4a30c6fff81a920dc0ec9 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 +https://conda.anaconda.org/conda-forge/linux-64/fmt-11.0.2-h434a139_0.conda#995f7e13598497691c1dc476d889bc04 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.2.0-h6b349bd_1.conda#0551d01d65027359bf011c049f9c6401 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-he02047a_1.conda#aab9195bc018b82dc77a84584b36cce9 https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/gtest-1.14.0-h434a139_2.conda#89971b339bb4dfbf3759f1f2528d81b1 -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda#c48fc56ec03229f294176923c3265c05 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda#4fab9799da9571266d05ca5503330655 https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 +https://conda.anaconda.org/conda-forge/linux-64/libde265-1.0.15-h00ab1b0_0.conda#407fee7a5d7ab2dca12c9ca7f62310ad https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-he02047a_3.conda#9aba7960731e6b4547b3a52f812ed801 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda#0a7f4cd238267c88e5d69f7826a407eb +https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda#73301c133ded2bf71906aa2104edae8b https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d +https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.20.0-h0e7cc3e_1.conda#d0ed81c4591775b70384f4cc78e05cd1 https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2#a730b2badd586580c5752cc73842e068 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h59595ed_0.conda#a7b444a6e008b804b35521895e3440e2 -https://conda.anaconda.org/conda-forge/linux-64/nccl-2.22.3.1-hee583db_1.conda#f6ec6886214a80beace66f0b9fdf7e4b +https://conda.anaconda.org/conda-forge/linux-64/nccl-2.23.4.1-h03a54cd_0.conda#84df066b3b35c59a697af6066137b2a6 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.8.1-hd590300_1.conda#6eba22eb06d69e53d0ca01eef42bc675 https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/rdma-core-53.0-he02047a_0.conda#d60e9a23682287a041a4428927ea7aa5 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-hdb0a2a9_1.conda#78b8b85bdf1f42b8a2b3cb577d8742d1 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda#0d9c441855be3d8dfdb2e800fe755059 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h8bc8fbc_6.conda#dff3627fec2c0584ded391205295abf0 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 +https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda#05a8ea5f446de33006171a7afe6ae857 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda#0b666058a179b744a622d0a4a0c56353 https://conda.anaconda.org/conda-forge/linux-64/xorg-makedepend-1.0.9-h59595ed_0.conda#71c756cfcc6649ed7614eb07712bfce0 -https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-hac33072_1.conda#df96b7266e49529d82de467b23977452 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.7-hbfbeace_6.conda#d6382461de9a91a2665e964f92d8da0a -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h235a6dd_1.conda#c05358e3a231195f7f0b3f592078bb0c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.9-h5e77a74_0.conda#d7714013c40363f45850a25113e2cb05 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/bwidget-1.9.14-ha770c72_1.tar.bz2#5746d6202ba2abad4a4707f2a2462795 -https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.12.0-hb4ffafa_0.conda#1a9b16afb84d734a1bb2d196c308d477 +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.1-hc57e6cf_0.conda#5f84961d86d0ef78851cb34f9d5e31fe https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda#ee3e687b78b778db7b304e5b00a4dca6 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.1.0-he4a1faa_1.conda#0ae35a9298e2475dc877da9adaa8e490 -https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.1.0-h8d00ecb_1.conda#6ae4069622b29253444c3326613a8e1a -https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-hebf79cf_1003.conda#23bb57b64a629bc3b33379beece7f0d7 +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.2.0-hc73f493_1.conda#131a59b3bb1dbbfc63ec0f21eb0e8c65 +https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.2.0-h2c03514_1.conda#41664acd4c99ef4d192e12950ff68ca6 +https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-h3e53b52_1004.conda#c21dc684e0e8efa507aba61a030f65e7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h104a339_1.conda#9ef052c2eee74c792833ac2e820e481e -https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.7.1-hca3a8ce_0.conda#6af97ac284ffaf76d8f63cc1f9d64f7a +https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.8.1-he8d1d4c_1.conda#febd0520afc041dd938acdce0f26d71b +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda#13e8e54035ddd2b91875ba399f0f7c04 +https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.0-hdb8da77_2.conda#9c4554fafc94db681543804037e65de2 https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hf539b9f_1021.conda#e8c7620cc49de0c6a2349b6dd6e39beb https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.28-pthreads_h3e26593_0.conda#2bd7dc48907a3b6bf766ed87867f3459 -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-hd5b35b9_1.conda#06def97690ef90781a91b786cb48a0a9 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 -https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.conda#264f9a3a4ea52c8f4d3e8ae1213a3335 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.1-cuda118_h09a87be_2.conda#1ef0261ebd8ecdab6ca149ef568ba0bf -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 +https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hc670b87_16.conda#3d9f3a2e5d7213c34997e4464d2f938c +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.1-cuda118_h09a87be_4.conda#b11b225202c3fd2ac6767ddc7e5d094f +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.104-hd34e28f_0.conda#0664e59f6937a660eba9f3d2f9123fa8 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_0_cpython.conda#43a02ff0a2dafe8a8a1b6a9eacdbd2cc +https://conda.anaconda.org/conda-forge/linux-64/nss-3.105-hd34e28f_0.conda#28d7602527b76052422aaf5d6fd7ad81 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda#0515111a9cdf69f83278f7c197db9807 https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 +https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.14.1-hed91bc2_1.conda#909188c8979846bac8e586908cf1ca6a https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 -https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h8bc8fbc_6.conda#dff3627fec2c0584ded391205295abf0 -https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-ha691c75_8.conda#3f9bc6137b240642504a6c9b07a10c25 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-h988505b_2.conda#9dda9667feba914e0e80b95b82f7402b +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda#a7a49a8b85122b49214798321e2e96b4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hb9d3cd8_2.conda#d8602724ac0d276c380b97e9eb0f814b https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_0.conda#ae5f4ad87126c55ba3f690ef07f81d64 -https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.0-pyhd8ed1ab_0.conda#0482cd2217e27b3ce47676d570ac3d45 +https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.3-pyhd8ed1ab_0.conda#ec763b0a58960558ca0ad7255a51a237 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda#7d78a232029458d0077ede6cda30ed0c https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 +https://conda.anaconda.org/conda-forge/linux-64/astroid-3.3.5-py312h7900ff3_0.conda#e1ed4d572a4a16b97368ab00fd646487 +https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h01f5eca_8.conda#afb85fc0f01032d115c57c961950e7d8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-hdb68c23_10.conda#cb6065938167da2d2f078c2f08473b84 -https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py311h38be061_9.conda#6ba5ba862ef1fa30e87292df09e6b73b -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.30-hec5e740_0.conda#bc1b9f70ea7fa533aefa6a8b6fbe8da7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.5-h0009854_0.conda#d393d0a6c9b993771fbc67a998fccf6c +https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py312h7900ff3_9.conda#6df4f61b215587c40ec93810734778ca +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda#a374efa97290b8799046df7c5ca17164 https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda#c88ca2bb7099167912e3b26463fff079 https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-pyhd8ed1ab_0.conda#6e67fa19bedafa7eb7d6ea91de53e03d https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda#0d07dc29b1c1cc973f76b74beb44915f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py311hfdbb021_2.conda#e0ee31128372cd4c6873372a756964bb +https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py312h8fd2918_3.conda#21e433caf1bb1e4c95832f8bb731d64c https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda#78745f157d56877a2c6e7b386f66f3e2 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 +https://conda.anaconda.org/conda-forge/noarch/dill-0.3.9-pyhd8ed1ab_0.conda#27faec84454995f6774786c7e5833cd6 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda#fe521c1608280cc2803ebd26dc252212 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073f7446c90f417b0787122f5b https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_0.tar.bz2#15621abf59053e184114d3e1d4f9d01e @@ -216,324 +227,280 @@ https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#1 https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h743c826_0.conda#12e6988845706b2cfbc3bc35c9a61a95 -https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h9ecbd09_1.conda#4605a44155b0c25da37e8f40318c78a4 +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py312h66e93f0_1.conda#0ad3232829b9509599d8f981c12c9d05 https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_0.tar.bz2#6b1f32359fc5d2ab7b491d0029bfffeb https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e +https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd8ed1ab_6.conda#2ed1fe4b9079da97c44cfe9c2e5078fd https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 +https://conda.anaconda.org/conda-forge/noarch/isodate-0.7.2-pyhd8ed1ab_0.conda#d68d25aca67d1a06bf6f5b43aea9430d https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda#ff7ca04134ee8dde1d7cf491a78ef7c7 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 -https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.10.0-py311h459d7ec_0.conda#d39020c78fd00ed774ff9c876e8aba07 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda#80aea6603a6813b16ec119d00382b772 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f +https://conda.anaconda.org/conda-forge/linux-64/libheif-1.18.2-gpl_hffcb242_100.conda#76ac2c07b62d45c192940f010eea11fa https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a -https://conda.anaconda.org/conda-forge/linux-64/libllvm16-16.0.6-hb3ce162_3.conda#a4d48c40dd5c60edbab7fd69c9a88967 -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h2d7952a_1.conda#7e3173fd1299939a02ebf9ec32aa77c4 -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-hdffd6e0_0.conda#a8661c87c873d8c8f90479318ebf0a17 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda#80030debaa84cfc31755d53742df3ca6 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 -https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py311h9c9ff8c_1.conda#9ab40f5700784bf16ff7cf8012a646e8 +https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda#ed6ead7e9ab9469629c6cfb363b5c6e2 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py311h2cbdf9a_1.conda#867a4aa23ae6c0e9c84cf9aa4f2df0fe -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h9ecbd09_1.conda#c30e9e5aef9e9ff7fb593736ce2a4546 +https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py312hb3f7f12_1.conda#b99d90ef4e77acdab74828f79705a919 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda#a755704ea0e2503f8c227d84829a8e81 https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2#34fc335fc50eef0b5ea708f2b5f54e0c https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py311hd18a35c_0.conda#682f76920687f7d9283039eb542fdacf -https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h9ecbd09_0.conda#afada76949d16eb7d7128ca1dc7d2f10 -https://conda.anaconda.org/conda-forge/noarch/munch-4.0.0-pyhd8ed1ab_0.conda#376b32e8f9d3eacbd625f37d39bd507d +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py312h68727a3_0.conda#5c9b020a3f86799cdc6115e55df06146 +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_1.conda#e397d9b841c37fc3180b73275ce7e990 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhd8ed1ab_0.conda#70959cd1db3cf77b2a27a0836cfd08a7 -https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda#d335fd5704b46f4efb89a6774e81aef0 +https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.1-pyhd8ed1ab_0.conda#4994669899eb2e84ab855edcb71efc58 https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.28-pthreads_h3d04fff_0.conda#eb2736b14329cf5650917caa43a549c6 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.0-h1e5e2c1_0.conda#53e8f030579d34e1a36a735d527c021f +https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.2-h669347b_0.conda#1e6c10f7d749a490612404efeb179eb8 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda#17064acba08d3686f1135b5ec1b32b12 https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h9ecbd09_1.conda#493e283ab843404fa36add81fcc49f6c -https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.9.1-pyhd8ed1ab_0.tar.bz2#0191dd7efe1a94262812770183b68892 +https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py312h66e93f0_2.conda#2c6c0c68f310bc33972e7c83264d7786 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py312h66e93f0_2.conda#e6d115113d912f9c2cc8cddddac20d61 +https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda#72453e39709f38d0494d096bb5f678b7 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pyflakes-2.5.0-pyhd8ed1ab_0.tar.bz2#1b3bef4313288ae8d35b1dfba4cd84a3 +https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda#0cf7fef6aa123df28adb21a590065e3d https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda#035c17fbf099f50ff60bf2eb303b0a83 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.20.0-pyhd8ed1ab_0.conda#b98d2018c01ce9980c03ee2850690fab -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda#abeb54d40f439b86f75ea57045ab8496 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda#986287f89929b2d629bd6ef6497dc307 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py311h9e33e62_1.conda#3989f9a93796221aff20be94300e3b93 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py311h459d7ec_0.conda#7865c897d89a39abc0056d89e37bd9e9 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py312h12e396e_1.conda#9ae193ac9c1ead5024d5a4ee0024e9a6 +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py312h66e93f0_1.conda#532c3e5d0280be4fea52396ec1fa7d5d https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-74.1.2-pyhd8ed1ab_0.conda#56c9c11d004428e81d02eeb730fc6336 -https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.3-py311h9ecbd09_1.conda#b208b9b6336362211c787547f92a5464 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda#d5cd48392c67fb6849ba459c2c2b671f +https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.3-py312h66e93f0_1.conda#c8d1a609d5f3358d715c2273011d9f4d https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 -https://conda.anaconda.org/conda-forge/noarch/sqlparse-0.5.1-pyhd8ed1ab_0.conda#e8af29e73e8b5906d8882c1f67222d34 https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f https://conda.anaconda.org/conda-forge/noarch/tenacity-9.0.0-pyhd8ed1ab_0.conda#42af51ad3b654ece73572628ad2882ae -https://conda.anaconda.org/conda-forge/noarch/termcolor-2.4.0-pyhd8ed1ab_0.conda#a5033708ad9283907c3b1bc1f90d0d0d +https://conda.anaconda.org/conda-forge/noarch/termcolor-2.5.0-pyhd8ed1ab_0.conda#29a5d22565b850099cd9959862d1b154 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd -https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.16.3-hf0b6e87_3.conda#1e28da846782f91a696af3952a2472f9 https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda#e977934e00b355ff55ed154904044727 https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda#0062a5f3347733f67b0f33ca48cc21dd -https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h9ecbd09_1.conda#616fed0b6f5c925250be779b05d1d7f7 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda#34feccdd4177f2d3d53c73fc44fd9a37 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda#af648b62462794649066366af4ecd5b0 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.9.12-pyhd8ed1ab_0.conda#fc9f0a4706e95a21daa3c17287e93865 +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.16-pyhd8ed1ab_0.conda#dfd9748c73bc264c3f634d1345ee8210 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py311hfdbb021_1.conda#273cf8bedf58f24aec8d960831f89c5a +https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py312h2ec8cdc_1.conda#96226f62dddc63226472b7477d783967 https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_1.conda#6042b782b893029aa40335782584a092 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 https://conda.anaconda.org/conda-forge/noarch/webob-1.8.8-pyhd8ed1ab_0.conda#ae69b699c308c3bd20388219764235b0 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py311h9ecbd09_1.conda#810ae646bcc50a017380336d874e4014 https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.2.0-pyhd8ed1ab_0.conda#a1f7264726115a2f8eac9773b1f27eba -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hd590300_1.conda#ae92aab42726eb29d16488924f7312cb +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.2.1-hb9d3cd8_1.conda#f35a9a2da717ade815ffa70c0e8bdfbd https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.9.0-pyhd8ed1ab_0.conda#156c91e778c1d4d57b709f8c5333fd06 https://conda.anaconda.org/conda-forge/noarch/yapf-0.32.0-pyhd8ed1ab_0.tar.bz2#177cba0b4bdfacad5c5fbb0ed31504c4 -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-ha4adb4c_5.conda#e8372041ebb377237db9d0d24c7b5962 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_6.conda#113506c8d2d558e733f5c38f6bf08c50 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 -https://conda.anaconda.org/conda-forge/noarch/asgiref-3.8.1-pyhd8ed1ab_0.conda#b5c2e1034ccc76fb14031637924880eb -https://conda.anaconda.org/conda-forge/linux-64/astroid-2.15.8-py311h38be061_0.conda#46d70fcb74472aab178991f0231ee3c6 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.17-he0b1f16_2.conda#ea6d998135d5f8932cffc91381104690 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.3-h50844eb_4.conda#e72fdd8942f266ea79c70ec085661d6c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.5-hbaf354b_4.conda#2cefeb144de7712995d1b52cc6a3864c +https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.13.0-h935415a_0.conda#debd1677c2fea41eb2233a260f48a298 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.3.0-hbdc6101_0.conda#797554b8b7603011e8677884381fbcc5 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 +https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.1-hf8ad068_0.conda#1b7a01fd02d11efe0eb5a676842a7b7d https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h9ecbd09_1.conda#a36ccf0f3d2eb95a0ecc293f5f56e080 -https://conda.anaconda.org/conda-forge/linux-64/curl-8.10.1-hbbe4b11_0.conda#73c561c6b84bda71776c9fa21517e7eb -https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.3-py312h178313f_1.conda#2621104ac246594948615017c1254c66 +https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.1-h18eb788_0.conda#2e7dedf73dfbfcee662e2a0f6175e4bb +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.0-py312h66e93f0_1.conda#a921e2fe122e7f38417b9b17c7a13343 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a -https://conda.anaconda.org/conda-forge/noarch/fire-0.6.0-pyhd8ed1ab_0.conda#e9ed10aa8fa1dd6782940b95c942a6ae -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h9ecbd09_1.conda#89ed1820af1523df84171049199ed915 +https://conda.anaconda.org/conda-forge/noarch/fire-0.7.0-pyhd8ed1ab_0.conda#c8eefdf1e822c56a6034602e67bc92a5 +https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda#a25e5df6b26be3c2d64be307c1ef0b37 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h66e93f0_0.conda#e311030d9322f6f77e71e013490c83b2 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b +https://conda.anaconda.org/conda-forge/linux-64/git-2.46.0-pl5321hb5640b7_0.conda#825d146359bc8b85083d92259d0a0e1b https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 +https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyhd8ed1ab_1.conda#51862c722035f53c5d99ae99a78ea569 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.1-pyha770c72_0.conda#b9f5330c0853ccabc39a9878c6f1a2ab https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda#c808991d29b9838fb4d96ce8267ec9ec -https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py311h38be061_0.conda#f85e78497dfed6f6a4b865191f42de2e +https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda#f5b8822297c9c790cec0795ca1fc9be6 -https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-he9388d3_8.conda#f3abc6e6ab60fa404c23094f5a03ec9b -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.1-hebfc3b9_0.conda#ddd09e8904fde46b85f41896621803e6 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda#fd540578678aefe025705f4b58b36b2e https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b -https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py311hcfaa980_1.conda#b76d6a1a47942ad2021a9d3d7fe527bd +https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py312he28fd5a_1.conda#4bc1e0dda9208b8934333d878dde4996 https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 -https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py311h50c5138_1.conda#7d777fcd827bbd67fd1b8b01b7f8f333 +https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda#dcd0ed5147d8876b0848a552b416ce76 +https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h710cb58_1.conda#69a8838436435f59d72ddcb8dfd24a28 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda#385f46a4df6f97892503a841121a9acf https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.1-pyhd8ed1ab_0.conda#81bb643d6c3ab4cbeaf724e9d68d0a6a -https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.4-hb2eb5c0_1.conda#1aaec5dbae29b3f0a2c20eeb84e9e38a -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece +https://conda.anaconda.org/conda-forge/linux-64/poppler-24.08.0-h47131b8_1.conda#0854b9ff0cc10a1f6f67b0f352b8e75a +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 -https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.1.0-pyhd8ed1ab_0.conda#03736d8ced74deece64e54be348ddd3e +https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyh7850678_0.conda#5003da197661e40a2509e9c4651f1eea https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.2-pyhd8ed1ab_0.conda#89703b4f38bd1c0353881f085bc8fdaa -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py311h7deb3e3_2.conda#5d3fc8b5c5765e1f207c53554a713907 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda#746ce19f0829ec3e19c93007b1a224d3 https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 +https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.3.1-pyhd8ed1ab_0.conda#f921ea6a1138cc7edee77de8ed12b226 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-pyhd8ed1ab_3.conda#1f7482562f2082f1b2abf8a3e2a41b63 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py311h459d7ec_0.conda#4dccc0bc3bb4d6e5c30bccbd053c4f90 +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py312h66e93f0_1.conda#28ed869ade5601ee374934a31c9d628e https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda#ee6f7fd1e76061ef1fa307d41fa86a96 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda#c6e94fc2b2ec71ea33fe7c7da259acb4 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.5-pyhd8ed1ab_0.conda#949a6778521278cb96d7491bd99a5418 -https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-hac6953d_0.conda#63b80ca78d29380fe69e69412dcbe4ac -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.1.3-h4ab18f5_1.conda#4d6c9925cdcda27e9d022e40eb3eac05 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hd590300_0.conda#12bf78e12f71405775e1c092902959d3 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda#a6ed1227ba6ec37cfc2b25e6512f729f +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hb9d3cd8_1.conda#f35bec7fface97f67f44ca952fc740b7 https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c089f90a086b6214c5606368d0d3bad0 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda#a1240b99a7ccd953879dc63111823986 -https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h9ecbd09_1.conda#c09ed3ac47970f4cabcefc330365d158 -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.5-py311h9ecbd09_1.conda#7940686d7b134b80dce8cd9ba652fe3e -https://conda.anaconda.org/conda-forge/linux-64/arpack-3.7.0-hdefa2d7_2.tar.bz2#8763fe86163198ef1778d1d8d22bb078 -https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.7-hb7bd14b_1.conda#82bd3d7da86d969c62ff541bab19526a -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.1-pyhd8ed1ab_0.conda#2ab100a58c45feb12e2b79a61bb3458a -https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.1-py311hafd3f86_0.conda#2653b58a992032d6c3ff4d82fc1c6c82 -https://conda.anaconda.org/conda-forge/noarch/django-5.1.1-pyhd8ed1ab_0.conda#d1e2ab198eca6bf9fcd81f6fd790e2c5 -https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.15.5-py312h66e93f0_0.conda#a17fd28f7b4b77527218535fddb8acf5 +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.10-py312h178313f_0.conda#d2f9e490ab2eae3e661b281346618a82 +https://conda.anaconda.org/conda-forge/linux-64/arpack-3.9.1-nompi_h77f6705_101.conda#ff39030debb47f6b53b45bada38e0903 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.2-h6c0439f_6.conda#4e472c316d08af60faeb71f86d7563e1 +https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hd126650_2.conda#36df3cf05459de5d0a41c77c4329634b +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.7.0-h10ac4d7_1.conda#ab6d507ad16dbe2157920451d662e4a1 +https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.2-pyhd8ed1ab_0.conda#ac582de2324988b79870b50c89c91c75 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.3-py312hda17c39_0.conda#2abada8c216dd6e32514535a3fa245d4 +https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h6c15284_3.conda#06f97c8b69157d91993af0c4f2e16bdc -https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-hee599c5_13.conda#8c55dacddd589be64b2bd6a5d4264be6 -https://conda.anaconda.org/conda-forge/linux-64/git-2.42.0-pl5321h86e50cf_0.conda#96ad24c67e0056d171385859c43218a2 +https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-hf7fa9e8_2.conda#1d6bdc6b2c62c8cc90c67b50142d7b7f https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda#0b2154c1818111e17381b1df5b4b0176 https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de -https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hf1a501a_15.conda#d2e16a32f41d67c7d280da11b2846328 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.1-hd8ed1ab_0.conda#d6c936d009aa63e5f82d216c95cdcaee +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_0.conda#720745920222587ef942acfbc578b584 https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_0.conda#a14218cfb29662b4a19ceb04e93e298e https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hf8d3e68_2.conda#ffe68c611ae0ccfda4e7a605195e22b3 https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_1.conda#4809b9f4c6ce106d443c3f90b8e10db2 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.22.0-h9be4e54_1.conda#4b4e36a91e7dabf7345b82d85767a7c3 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_0.conda#2c51703b4d775f8943c08a361788131b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c -https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h090f1da_1.conda#9a2d6acaa8ce6d53a150248e7b11165e -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda#392cae2a58fbcb9db8c2147c6d6d1620 +https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h15fa968_9.conda#4957a903bd6a68cc2e53e47476f9c6f4 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f +https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_0.conda#6f9eb38d0a87898cf5a7c91adaccd691 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba -https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_4.conda#75d504c6787edc377ebdba087a26a61b +https://conda.anaconda.org/conda-forge/noarch/pylint-3.3.1-pyhd8ed1ab_0.conda#2a3426f75e2172c932131f4e3d51bcf4 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h9211aeb_9.conda#173afeb0d112c854fd1a9fcac4b5cce3 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.5-pyhd8ed1ab_0.conda#ecd5e850bcd3eca02143e7df030ee50f https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_0.conda#52b91ecba854d55b28ad916a8b10da24 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 -https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2-pyhd8ed1ab_0.conda#7309d5de1e4e866df29bcd8ea5550035 -https://conda.anaconda.org/conda-forge/noarch/rdflib-7.0.0-pyhd8ed1ab_0.conda#44d14ef95495b3d4438f28998e0296a9 -https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.2.2-pyhd8ed1ab_0.conda#6626918380d99292df110f3c91b6e5ec -https://conda.anaconda.org/conda-forge/linux-64/suitesparse-5.10.1-h5a4f163_3.conda#f363554b9084fb9d5e3366fbbc0d18e0 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.14-h7f98852_1.tar.bz2#45b68dc2fc7549c16044d533ceaf340e -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.6-hf567797_4.conda#ffb662b31aef333e68a00dd17fda2027 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa +https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2.post1-pyhff2d567_0.conda#bd5ae3c630d5eed353badb091fd3e603 +https://conda.anaconda.org/conda-forge/noarch/rdflib-6.2.0-pyhd8ed1ab_0.tar.bz2#b9acd5fbaf467f7447746b1ecac50e83 +https://conda.anaconda.org/conda-forge/linux-64/suitesparse-7.8.2-hb42a789_0.conda#b7d1ce5a599ec2caf69673f5beff7696 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.16-hb9d3cd8_0.conda#7c0a9bf62d573409d12ad14b362a96e5 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.379-h5a9005d_9.conda#5dc18b385893b7991a3bbeb135ad7c3e +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.12.0-hd2e3451_0.conda#61f1c193452f0daa582f39634627ea33 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_1.conda#f709f23e2b1b93b3b6a20e9e7217a258 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_2.conda#ff28f374b31937c048107521c814791e +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.10.0-pyhd8ed1ab_0.conda#7823092a3cf14e98a52d2a2875c47c80 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.38.0-h8bb6dbc_0.conda#30ca97df26e33cd48444586e9d088e9a https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 -https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2023.9.18-py311h9b38416_0.conda#67bed2bd92ffa76b20506d83427706ae -https://conda.anaconda.org/conda-forge/noarch/imageio-2.35.1-pyh12aca89_0.conda#b03ff3631329c8ef17bae35d2bb216f7 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py312h6d9a048_4.conda#a810fadedc4edc06b4282d1222467837 +https://conda.anaconda.org/conda-forge/noarch/imageio-2.36.0-pyh12aca89_1.conda#36349844ff73fcd0140ee7f30745f0bf https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/linux-64/julia-1.9.3-h06b7c97_0.conda#6214d0563598ae0cc9b954344b9f9c10 +https://conda.anaconda.org/conda-forge/linux-64/julia-1.10.4-hf18f99d_1.conda#cc0ef9c191bab16211970a29b6787d69 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.22.0-hc7a4891_1.conda#7811f043944e010e54640918ea82cecd +https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.9.2-h353785f_1.conda#c363d0b330b4b21b4c1b10e0981d3a99 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda#9e7960f0b9ab3895ef73d92477c47dae +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda#83f045969988f5c7a65f3950b95a8b35 https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h22f9119_106.conda#5b911bfe75855326bae6857451268e59 -https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py311h4bc866e_0.conda#e32a210e9caf97383c35685fd2343512 -https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.13.0-py311h044e617_0.conda#9d783b29b6fc53e4d9a94f5befdfd34b -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py311h7db5c69_1.conda#643f8cb35133eb1be4919fb953f0a25f +https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda#e064ca33edf91ac117236c4b5dee207a +https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.13.1-py312hf9745cd_0.conda#33c27209bfd7af6766211facd24839ce +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py312hfb8ada1_0.conda#d0745ae74c2b26571b692ddde112eebb https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 -https://conda.anaconda.org/conda-forge/linux-64/poppler-23.08.0-hf2349cb_2.conda#fb75401ae7e2e3f354dff72e9da95cae -https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 +https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d +https://conda.anaconda.org/conda-forge/linux-64/postgresql-17.0-h1122569_4.conda#028ea131f116f13bb2a4a382b5863a04 +https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.8.2-pyhd8ed1ab_0.conda#84377261c09c02182d76fbe79e69c9bf https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py311h92ebd52_0.conda#ee757dff4cdb96bb972200c85b37f9e8 +https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py312hfb10629_0.conda#325cc5f0e0dc36562f3de2a4dbded572 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py311h9f3472d_1.conda#be9361437b3f5b9d79ffa6b577b1dedc -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he1f765f_0.conda#eb7e2a849cd47483d7e9eeb728c7a8c5 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py312hc0a28a1_2.conda#8300d634adec4a6aed35a87e90e9cb07 +https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h32f4cee_16.conda#feee98a221344be7a447b80b410df867 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda#b43233a9e2f62fb94affe5607ea79473 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.conda#5be02e05e1adaa42826cc6800ce399bc https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_1.conda#5abeaa41ec50d4d1421a8bc8fbc93054 https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-hbf3e495_6.conda#a6caf5a0d9ca940d95f21d40afe8f857 -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.2-pyhd8ed1ab_0.conda#38d785787ec83d0431b3855328395113 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h9f3472d_6.conda#ac7dc7f70f8d2c1d96ecb7e4cb196498 -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.9.0-pyhd8ed1ab_0.conda#2e4adbc7926d91412fec7076f14d554d -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h4441c20_3.conda#1afc1e85414e228916732df2b8c5d93b +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.11.0-h325d260_1.conda#11d926d1f4a75a1b03d1c053ca20424b +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.6.0-pyhd8ed1ab_0.conda#6728ca650187933a007b89f00ece4279 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc0a28a1_6.conda#fa4853d25b6fbfef5eb7b3e1b5616dd5 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.10.0-pyhd8ed1ab_0.conda#b3b498f7bcc9a2543ad72a3501f3d87b +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h9e768e6_3.conda#c330e87e698bae8e7381c0315cf25dd0 +https://conda.anaconda.org/conda-forge/linux-64/gdal-3.9.2-py312h1299960_7.conda#9cf27e3f9d97ea13f250db9253a25dc8 +https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda#953e31ea00d46beb7e64a79fc291ec44 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6238fc3_5.conda#2fef4283b2bb45a66f8b81099d36721e -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h2b939e6_1.conda#db431da3476c884ef08d9f42a32913b6 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-fits-3.9.2-h2db6552_7.conda#524e64f1aa0ebc87230109e684f392f4 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-grib-3.9.2-hc3b29a1_7.conda#56a7436a66a1a4636001ce4b621a3a33 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf4-3.9.2-hd5ecb85_7.conda#9c8431dc0b83d5fe9c12a2c0b6861a72 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf5-3.9.2-h6283f77_7.conda#c8c82df3aece4e23804d178a8a8b308a +https://conda.anaconda.org/conda-forge/linux-64/libgdal-jp2openjpeg-3.9.2-h1b2c38e_7.conda#f0f86f8cb8835bb91acb8c7fa2c350b0 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-pdf-3.9.2-h600f43f_7.conda#567066db0820f4983a6741e429c651d1 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-pg-3.9.2-h5e77dd0_7.conda#e86b26f53ae868565e95fde5b10753d3 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-postgisraster-3.9.2-h5e77dd0_7.conda#3392965ffc4e8b7c66a532750ce0e91f +https://conda.anaconda.org/conda-forge/linux-64/libgdal-xls-3.9.2-h03c987c_7.conda#165f12373452e8d17889e9c877431acf +https://conda.anaconda.org/conda-forge/linux-64/magics-4.15.4-h24e9adf_1.conda#9731bb0d2a3917cab718fd7c90dea857 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_1.conda#2f4f3854f23be30de29e9e4d39758349 https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311hae66bec_102.conda#87b59caea7db5b79766e0776953d8c66 -https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 -https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_1.conda#004cff3a7f6fafb0a041fb575de85185 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h21d6d8e_102.conda#9049ba34261ce7106220711d313fcf61 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda#5971cc64048943605f352f7f8612de6c https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 -https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.tar.bz2#00d8853fb1f87195722ea6a582cc9b56 +https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.6.1-pyhd8ed1ab_0.conda#d1023ccf92d8235cd4808ef53e274a5e https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b -https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h9f3472d_3.conda#a7c4169b1c920361597ddacb461350fd -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.2-py311h57cc02b_1.conda#d1b6d7a73364d9fe20d2863bd2c43e3a -https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 -https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyhd8ed1ab_0.conda#846d12530687ba836791dd54db1f45c5 -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.3-py311h9f3472d_0.conda#998bb9a06c3d669d925e9a19724940cf -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.8.30-pyhd8ed1ab_0.conda#330700f370f15c7c5660ef6865e9cc43 -https://conda.anaconda.org/conda-forge/noarch/xarray-2024.9.0-pyhd8ed1ab_0.conda#2cde8ed028a0fd8f35d7f9b44839d362 -https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda#41abde21508578e02e3fd492e82a05cd -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h7db5c69_2.conda#abbee22293e6c094fbe139615cba1572 -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.5-pyhd8ed1ab_1.conda#7ee17828b8e0472196ed1663cdc970cb -https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc -https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b -https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda#a201de7d36907f2355426e019168d337 -https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b -https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.2-py311h815a124_5.conda#84a14fd830b72b09ef886a23de557a16 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-15.0.2-h176673d_2_cpu.conda#c130ba0c765437749dbc37fa9de85ce5 -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 -https://conda.anaconda.org/conda-forge/linux-64/magics-4.14.2-haee2765_1.conda#0c46d548472ee1b043c65d4ab4ad6a83 -https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.1-pyhd8ed1ab_0.conda#4dff4abb5728f7662ecaaa8bee3a0260 -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-he3b17a9_50.conda#a37fcb5a2da31cfebe6734b0fda20bd5 -https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.8-hf7c1f58_0.conda#6cd18a9c6b8269b0cd101ba9cc3d02ab -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed -https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 -https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py311h38be061_0.conda#b980793f61c0dc532b62faa0a0f0a271 -https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.1-cuda118_pyhf54b869_2.conda#35d99c71383da3c2f88a97d471f79e1f -https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 -https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h0887e52_8.conda#34cb3750c8a6da10a490e470f87e670b -https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.9-py311h40fbdff_0.conda#dcee6ba4d1ac6af18827d0941b6a1b42 -https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py311h044e617_2.conda#5ea04101a9da03787ba90e9c741eb818 -https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 -https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.3.3-pyhd8ed1ab_0.conda#995084cc4bd45c480ddd4f1380de1d0f -https://conda.anaconda.org/conda-forge/linux-64/cdo-2.3.0-h24bcfa3_0.conda#238311a432a8e49943d3348e279af714 -https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a -https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda#786d3808394b1bdfd3f41f2e2c67279e -https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb -https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-15.0.2-hac33072_2_cpu.conda#12951edff85582aedcd2db0b79393102 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-15.0.2-hd42f311_2_cpu.conda#dcc3a1e12157bbbbae96029d9d34fd0e -https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-15.0.2-hd4ab825_2_cpu.conda#a4aa5cd69e0d1959f7c965437e7ac93d -https://conda.anaconda.org/conda-forge/linux-64/libparquet-15.0.2-h6a7eafb_2_cpu.conda#b06caaa4ef20db071dc832323701e5e3 -https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 -https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.1-py311h38be061_0.conda#65a408ecf84afc51b1d437f888d8e80f -https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.8.0-pyhd8ed1ab_0.conda#fba377622e74ee0bbeb8ccae9fa593d3 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d +https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py312hc0a28a1_3.conda#81bbcb20ea4a53b05a8cf51f31496038 https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r42hc72bb7e_1005.conda#f2744985b083b1bbffd4df19437cf1e8 https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.5.0-r42hb1dbf0f_0.conda#d879e1fbd80113312364a5db3682c789 https://conda.anaconda.org/conda-forge/noarch/r-bigmemory.sri-0.1.8-r42hc72bb7e_0.conda#383f36b5a0b7dd7c467aa1b6b5fe7307 @@ -543,7 +510,6 @@ https://conda.anaconda.org/conda-forge/linux-64/r-colorspace-2.1_0-r42h57805ef_1 https://conda.anaconda.org/conda-forge/linux-64/r-contfrac-1.1_12-r42h57805ef_1004.conda#bc308888aa4b4fb4e37a7a17fdc911c9 https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.4.7-r42hc72bb7e_0.conda#941d7bcf2b94a682419ea1fbf6789d1f https://conda.anaconda.org/conda-forge/noarch/r-crayon-1.5.3-r42hc72bb7e_0.conda#4a74a6114bbea1ad8d488e99b83df3da -https://conda.anaconda.org/conda-forge/noarch/r-dbi-1.2.3-r42hc72bb7e_0.conda#b283bb5431a4b960cfa3f82043d1437b https://conda.anaconda.org/conda-forge/linux-64/r-desolve-1.40-r42hd9ac46e_0.conda#7232f8b5707fc9739cb2f8fdc5b4b64d https://conda.anaconda.org/conda-forge/linux-64/r-digest-0.6.36-r42ha18555a_0.conda#332551d9a37018826d528cf16701bd2b https://conda.anaconda.org/conda-forge/noarch/r-docopt-0.7.1-r42hc72bb7e_3.conda#99be998b67c40ef6eb1a5af90e307c1d @@ -554,13 +520,12 @@ https://conda.anaconda.org/conda-forge/linux-64/r-farver-2.1.2-r42ha18555a_0.con https://conda.anaconda.org/conda-forge/noarch/r-functional-0.6-r42ha770c72_1004.conda#9e27c34589b883accd340d651bdeaa02 https://conda.anaconda.org/conda-forge/noarch/r-generics-0.1.3-r42hc72bb7e_2.conda#c492355d73e184353c82b62f5087a601 https://conda.anaconda.org/conda-forge/noarch/r-geomapdata-2.0_2-r42hc72bb7e_0.conda#799a671bad7a89ac1d9da5cb98f75367 -https://conda.anaconda.org/conda-forge/linux-64/r-git2r-0.33.0-r42hbae1c7c_0.conda#2cdc8746b3283f02e5ba387bcfc51aa1 +https://conda.anaconda.org/conda-forge/linux-64/r-git2r-0.30.1-r42hf72769b_1.tar.bz2#f64adeea481006f0cb22bdcc066680df https://conda.anaconda.org/conda-forge/linux-64/r-glue-1.7.0-r42h57805ef_0.conda#eab803a28d66337ae3732b04c5f5604f https://conda.anaconda.org/conda-forge/linux-64/r-goftest-1.2_3-r42h57805ef_2.conda#4210e40893bbac7533714429ac4d0fe9 https://conda.anaconda.org/conda-forge/linux-64/r-isoband-0.2.7-r42ha503ecb_2.conda#44979df954a15195470f336cd18b5eb6 https://conda.anaconda.org/conda-forge/noarch/r-iterators-1.0.14-r42hc72bb7e_2.conda#616ab7b008326d3d76d59ba35b3fb592 https://conda.anaconda.org/conda-forge/linux-64/r-jsonlite-1.8.8-r42h57805ef_0.conda#d0b27ba963de139270a7b53f897afdf6 -https://conda.anaconda.org/conda-forge/linux-64/r-kernsmooth-2.23_24-r42hc2011d3_0.conda#aac4c7efaa5f2f7013cff5dabe0255eb https://conda.anaconda.org/conda-forge/noarch/r-labeling-0.4.3-r42hc72bb7e_0.conda#b9b940011dd81d8b60859fcd0d9775f4 https://conda.anaconda.org/conda-forge/linux-64/r-lattice-0.22_6-r42h57805ef_0.conda#93cee3961cc5277443a3e437f6991010 https://conda.anaconda.org/conda-forge/linux-64/r-lazyeval-0.2.2-r42h57805ef_4.conda#109112b1c26d932414daa139a45d3a69 @@ -574,7 +539,6 @@ https://conda.anaconda.org/conda-forge/noarch/r-nbclust-3.0.1-r42hc72bb7e_2.cond https://conda.anaconda.org/conda-forge/linux-64/r-ncdf4-1.22-r42h5647f33_0.conda#d23e6cd8fe41079eb1421b6a6d1f1c67 https://conda.anaconda.org/conda-forge/linux-64/r-pcict-0.5_4.4-r42h57805ef_1.conda#6e5770da5c174a2617096cbc2b8d96f4 https://conda.anaconda.org/conda-forge/noarch/r-pkgconfig-2.0.3-r42hc72bb7e_3.conda#469b66f84a5d234689b423c9821b188c -https://conda.anaconda.org/conda-forge/linux-64/r-proxy-0.4_27-r42h57805ef_2.conda#1d2ea39d52acbcc9d7db8a0abe5fdf7b https://conda.anaconda.org/conda-forge/linux-64/r-ps-1.7.6-r42h57805ef_0.conda#3a592c79e0fade3a0c3574696fa143a3 https://conda.anaconda.org/conda-forge/noarch/r-r.methodss3-1.8.2-r42hc72bb7e_2.conda#305fe9f97f7598d9722c76d6be7bf794 https://conda.anaconda.org/conda-forge/noarch/r-r6-2.5.1-r42hc72bb7e_2.conda#1473a12b55128f8ac776ae5595a4d0cb @@ -593,21 +557,40 @@ https://conda.anaconda.org/conda-forge/noarch/r-withr-3.0.0-r42hc72bb7e_0.conda# https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.45-r42ha18555a_0.conda#9e13c392bfcee4a261e4b513d6d862e7 https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r42hc72bb7e_2.conda#2f3614450b54f222c1eff786ec2a45ec https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda#97f60a93ca12f4fdd5f44049dcee4345 -https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e -https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c -https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.1-cuda118_pyh98e67c5_2.conda#8c61e30dd8325ea1598e9d0af3eb2582 -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.3-pyhd8ed1ab_0.conda#bb748c8dcbcc48b4565459a860b13616 -https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_19-pl5321h7e74ff9_0.conda#a4a0ce7caba20cae61aac9aeacbd76c2 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-hac33072_2_cpu.conda#48c711b4e07664ec7b245a9664be60a1 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-15.0.2-h9241762_2_cpu.conda#97e46f0f20157e19487ca3e65100247a -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b -https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py311h38be061_1.conda#d7901c26884613539e958c10e9973413 -https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py311h38be061_1.conda#1077e7fc4aa594c5896cf8b8fa672f88 -https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.1-py311h38be061_1.conda#09a1fe2e68da301800bb919a24312e86 -https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.2-py312h7a48858_1.conda#6b5f4c68483bd0c22bca9094dafc606b +https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 +https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda#40d80cd9fa4cc759c6dba19ea96642db +https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda#97dc960f3d9911964d73c2cf240baea5 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.9.20-pyhd8ed1ab_0.conda#6de55c7859ed314159eaf2b7b4f19cc7 +https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.26.0-h86fa3b2_0.conda#061175d9d4c046a1cf8bffe95a359fab +https://conda.anaconda.org/conda-forge/noarch/xarray-2024.9.0-pyhd8ed1ab_1.conda#dc790d427d89b85ae12fc094e264833f +https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda#41abde21508578e02e3fd492e82a05cd +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312hf9745cd_2.conda#cc3ecff140731b46b970a7c4787b1823 +https://conda.anaconda.org/conda-forge/linux-64/cdo-2.4.1-h9fe33b1_1.conda#a326dab3d2a1a8e32c2a6f792fac3161 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.5-pyhd8ed1ab_1.conda#7ee17828b8e0472196ed1663cdc970cb +https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.14.1-pyhd8ed1ab_0.conda#1870fe8c9bd8967429e227be28ab94d2 +https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc +https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b +https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda#a201de7d36907f2355426e019168d337 +https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 +https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_39-imagemagick_hcfc5581_1.conda#1144fe07cf76921ec664b868453027d3 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h8d2e343_13_cpu.conda#dc379f362829d5df5ce6722565110029 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-kea-3.9.2-h1df15e4_7.conda#c693e703649051ee9db0fabd4fcd0483 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.9.2-hf2d2f32_7.conda#4015ef020928219acc0b5c9edbce8d30 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-tiledb-3.9.2-h4a3bace_2.conda#c3fac34ecba2fcf9d5d31a03b975d5a1 +https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.1-pyhd8ed1ab_0.conda#4dff4abb5728f7662ecaaa8bee3a0260 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc +https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 +https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.8-hf7c1f58_0.conda#6cd18a9c6b8269b0cd101ba9cc3d02ab +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/noarch/prospector-1.12.1-pyhd8ed1ab_0.conda#8621ba9cf057da26d371b87cd2264259 +https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py312h7900ff3_0.conda#9a6ebd6c124dbf39a13b2529e16ddce8 +https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.1-cuda118_pyh40095f8_4.conda#93ab068c137810f697b41b41a53cec70 +https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.1-py312h7900ff3_1.conda#c3d006b1d90fa9f5ae436ff9d6c40249 +https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r42ha503ecb_0.conda#12b6fa8fe80a6494a948c6ea2f34340d https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r42h57805ef_0.conda#9febce7369c72d991e2399d7d28f3390 -https://conda.anaconda.org/conda-forge/linux-64/r-class-7.3_22-r42h57805ef_1.conda#97476afece904fbbe73762b9cf8c4d83 https://conda.anaconda.org/conda-forge/linux-64/r-climdex.pcic-1.1_11-r42ha503ecb_2.conda#cff1d95fe315f109a1f01a7ef112fdd6 https://conda.anaconda.org/conda-forge/noarch/r-desc-1.4.3-r42hc72bb7e_0.conda#8c535581a9a3a1e2a0f5ef6d7e4d6a7f https://conda.anaconda.org/conda-forge/linux-64/r-ellipsis-0.3.2-r42h57805ef_2.conda#1673236a1895ca5cce15c888435ad2f9 @@ -628,17 +611,28 @@ https://conda.anaconda.org/conda-forge/noarch/r-rex-1.2.1-r42hc72bb7e_2.conda#b4 https://conda.anaconda.org/conda-forge/linux-64/r-sp-2.1_4-r42hb1dbf0f_0.conda#681bb0a7290d86f9f8bf8dc816f114c0 https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.10_0-r42h9f9f741_0.conda#159d8ab59a2777a26a739f8090b5a80c https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.3.0-r42ha503ecb_0.conda#3d62906e9c1fecf61370a3ad6e808e5e -https://conda.anaconda.org/conda-forge/linux-64/r-units-0.8_5-r42ha503ecb_0.conda#90b4c99051df9db2f825d6259dcf12cd -https://conda.anaconda.org/conda-forge/linux-64/r-wk-0.9.1-r42ha503ecb_0.conda#3c5ea742d2069f956ea6ff02a2aadce1 https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.6-r42hbfba7a4_1.conda#5c3d7a89a2d5e1c0885f92d1aa6fde30 https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r42h57805ef_1.conda#5367d265c0c9c151dea85f1ccb515ec1 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-15.0.2-h9241762_2_cpu.conda#c18bbb60ed10774dbf9ea86484728a74 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.4-hd8ed1ab_1.conda#ab83e3b9ca2b111d8f332e9dc8b2170f +https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py312h1df14c2_2.conda#104fecd2263afe390810307ad0bfe563 +https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 +https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.4.4-pyhd8ed1ab_0.conda#ef4a03815973391882a6f0caa797e3fb +https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a +https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-h5888daf_13_cpu.conda#b654d072b8d5da807495e49b28a0b884 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.9.2-ha770c72_7.conda#63779711c7afd4fcf9cea67538baa67a +https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h39682fd_13_cpu.conda#49c60a8dc089d8127b9368e9eb6c1a77 +https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 +https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 +https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.1-py312h7900ff3_0.conda#683ec8787a523de54b02c885e2c2aefa +https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.8.0-pyhd8ed1ab_0.conda#fba377622e74ee0bbeb8ccae9fa593d3 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h9cafe31_1_cpu.conda#235827b9c93850cafdd2d5ab359893f9 +https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_3.4-r42h61816a4_2.conda#8536251313f441c4d70ff11ad976d294 https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.6-r42hc72bb7e_0.conda#4fb1765d6dc531936db81af3f6be316a https://conda.anaconda.org/conda-forge/noarch/r-doparallel-1.0.17-r42hc72bb7e_2.conda#1cddfbaade4416f0234670391bb31ba2 -https://conda.anaconda.org/conda-forge/linux-64/r-e1071-1.7_14-r42ha503ecb_0.conda#6e147da5592263573409bce2e9c39b3c https://conda.anaconda.org/conda-forge/noarch/r-gtable-0.3.5-r42hc72bb7e_0.conda#b5cff9c0564c9fcd8b62632430a0cee5 https://conda.anaconda.org/conda-forge/noarch/r-hypergeo-1.2_13-r42hc72bb7e_1004.conda#7a207a992c606168044d13dcffd80ad4 https://conda.anaconda.org/conda-forge/noarch/r-knitr-1.47-r42hc72bb7e_0.conda#0a20a2f6546bc0cde246c53a92a7964d @@ -647,12 +641,20 @@ https://conda.anaconda.org/conda-forge/linux-64/r-lubridate-1.9.3-r42h57805ef_0. https://conda.anaconda.org/conda-forge/linux-64/r-mgcv-1.9_1-r42h316c678_0.conda#5c3d738118f5948f6cc29ccb63d6e2ff https://conda.anaconda.org/conda-forge/noarch/r-r.utils-2.12.3-r42hc72bb7e_0.conda#81f505dec8850e227d9b2a7e88fa505f https://conda.anaconda.org/conda-forge/linux-64/r-reshape-0.8.9-r42hc72bb7e_2.conda#17e75917161bf824248cc54a412b4394 -https://conda.anaconda.org/conda-forge/linux-64/r-s2-1.1.6-r42h5eac2b3_0.conda#c3835d051156c3eacce21caec8061594 https://conda.anaconda.org/conda-forge/noarch/r-scales-1.3.0-r42hc72bb7e_0.conda#0af4021fe6d0047bbf7a34bf21c50bdd https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r42h7525677_2.tar.bz2#1521b8a303852af0496245e368d3c61c +https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_45-r42hbcb9c34_0.conda#bcd96dc088f54514a54d57e6b8ed51b6 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.5-r42ha503ecb_0.conda#5689030c60302fb5bb7a48b54c11dbe8 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-15.0.2-py311h78dcc79_2_cpu.conda#6f20003320c613f2505cf248bfce48f6 -https://conda.anaconda.org/conda-forge/linux-64/r-classint-0.4_10-r42h61816a4_0.conda#668a2f3e36b373878e698b1387bea45b +https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e +https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c +https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.1-cuda118_pyh256f914_4.conda#2c026999ffd3407ddce239cac2da0972 +https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.3-pyhd8ed1ab_0.conda#bb748c8dcbcc48b4565459a860b13616 +https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py312h5aa26c2_1.conda#4a30f4277a1894928a7057d0e14c1c95 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-h5888daf_13_cpu.conda#cd2c36e8865b158b82f61c6aac28b7e1 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b +https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-h7cb714c_54.conda#7363202c15302898deb49e82ca3e5f58 +https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py312h7900ff3_1.conda#080bc8f34a9cb0ab81ae0369fd43b7ab +https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py312h7900ff3_1.conda#ea719cfcc2e5b815b137b7082ece8aeb https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.1-r42hc72bb7e_0.conda#6bd41a85dc43541400311eca03d4e2d4 https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r42hc72bb7e_1005.conda#da116b29105a8d48571975a185e9bb94 https://conda.anaconda.org/conda-forge/noarch/r-lmomco-2.5.1-r42hc72bb7e_0.conda#6efbdfe5d41b3ef5652be1ea2e0a6e3c @@ -660,23 +662,25 @@ https://conda.anaconda.org/conda-forge/noarch/r-multiapply-2.1.4-r42hc72bb7e_1.c https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r42hc72bb7e_1.conda#07d5ce8e710897745f14c951ff947cdd https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.conda#7985dada48799b7814ca069794d0b1a3 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.14-pyhd8ed1ab_0.conda#6644c676dce50d7355e5e1c7e90e999c -https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda +https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.11-py312hd177ed6_1.conda#246c5f31c607ecfe1ece1e8cc6ecc9c5 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-17.0.0-hf54134d_13_cpu.conda#46f41533959eee8826c09e55976b8c06 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.4-hd8ed1ab_1.conda#ab83e3b9ca2b111d8f332e9dc8b2170f https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 -https://conda.anaconda.org/conda-forge/linux-64/r-sf-1.0_14-r42h85a8d9e_1.conda#ad59b523759f3e8acc6fd623cfbfb5a9 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.9.0-pyhd8ed1ab_0.conda#43e08d885b7669b7605ede5bb9aa861f +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_1.conda#7e8ddbd44fb99ba376b09c4e9e61e509 https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc -https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_0.conda#b30cbc09f81d9dbaf8b74f2c8eacddc5 +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.16-pyhd8ed1ab_0.conda#81de1c44ab7f6cadab4a59b6d76dfa87 https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.3-r42hc72bb7e_0.conda#1b2b8fa85a9d0556773abac4763d8ef9 https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r42ha503ecb_1.conda#6aa1414e06dfffc39d3b5ca78b60b377 https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.5-r42hc72bb7e_0.conda#959f69b6dfd4b620a15489975fa27670 -https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.11.0-pyhd8ed1ab_0.conda#ae2c9a927475f5519d0164c542cde378 +https://conda.anaconda.org/conda-forge/noarch/dask-2024.10.0-pyhd8ed1ab_0.conda#719832923b1d98803d07b2ca38eb3baa https://conda.anaconda.org/conda-forge/linux-64/r-fields-15.2-r42h61816a4_0.conda#d84fe2f9e893e92089370b195e2263a0 https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r42hc72bb7e_1.conda#7fe060235dac0fc0b3d387f98e79d128 -https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_5-r42h57805ef_0.conda#e58ccf961b56e57d7c1e50995005b0bd +https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_1.conda#86286b197e33e3b034416c18ba0f574c +https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_0-r42h57805ef_2.conda#020534c6abdee4f1253c221e926a5341 +https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.11.0-pyhd8ed1ab_0.conda#ae2c9a927475f5519d0164c542cde378 https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r42hc72bb7e_2.conda#8079a86a913155fe2589ec0b76dc9f5e https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.13-pyhd8ed1ab_0.conda#b2f4f2f3923646802215b040e63d042e https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.5-pyhd8ed1ab_0.conda#b808b8a0494c5cca76200c73e260a060 @@ -685,5 +689,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.0.2-pyhd8ed1ab_0.conda#625004bdab1b171dfd1e29ebb30c40dd +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda#05706dd5a145a9c91861495cd435409a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e From 8d6cf2b5881681fe8f2deb07b41ec47d697669ef Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Mon, 21 Oct 2024 14:06:24 +0100 Subject: [PATCH 48/87] update comment in conda lock creation Github action (#3788) --- .github/workflows/create-condalock-file.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-condalock-file.yml b/.github/workflows/create-condalock-file.yml index 4ae10de3e2..7babd2a456 100644 --- a/.github/workflows/create-condalock-file.yml +++ b/.github/workflows/create-condalock-file.yml @@ -36,7 +36,8 @@ jobs: conda --version # setup-miniconda@v3 installs an old conda and mamba # forcing a modern mamba updates both mamba and conda - # pin <2 due to https://github.com/ESMValGroup/ESMValTool/pull/3771 + # unpin mamba after conda-lock=3 release + # see github.com/ESMValGroup/ESMValTool/issues/3782 conda install -c conda-forge "mamba>=1.4.8,<2" conda config --show-sources conda config --show From 5009b478df6888e9c7b3957ca1fd2a25bb5697ac Mon Sep 17 00:00:00 2001 From: max-anu <137736464+max-anu@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:49:55 +1100 Subject: [PATCH 49/87] Adding pr, tauu, tauv NOAA-CIRES-20CR-V2 CMORISER (#3763) Co-authored-by: Max Proft Co-authored-by: Felicity Chun <32269066+flicj191@users.noreply.github.com> --- doc/sphinx/source/input.rst | 2 +- .../data/cmor_config/NOAA-CIRES-20CR-V2.yml | 18 ++++++++++++++++++ esmvaltool/cmorizers/data/datasets.yml | 4 +++- .../downloaders/datasets/noaa_cires_20cr_v2.py | 8 +++++++- .../data/formatters/datasets/ncep_ncar_r1.py | 3 +++ .../recipes/examples/recipe_check_obs.yml | 3 +++ 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index 65aef57cd8..f3562c2507 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -410,7 +410,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NIWA-BS | toz, tozStderr (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| NOAA-CIRES-20CR-V2 | clt, clwvi, hus, prw, rlut, rsut (Amon) | 2 | Python | +| NOAA-CIRES-20CR-V2 | clt, clwvi, hus, prw, rlut, rsut, pr, tauu, tauv (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NOAA-CIRES-20CR-V3 | clt, clwvi, hus, prw, rlut, rlutcs, rsut, rsutcs (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ diff --git a/esmvaltool/cmorizers/data/cmor_config/NOAA-CIRES-20CR-V2.yml b/esmvaltool/cmorizers/data/cmor_config/NOAA-CIRES-20CR-V2.yml index 7591e99257..faded8f9d6 100644 --- a/esmvaltool/cmorizers/data/cmor_config/NOAA-CIRES-20CR-V2.yml +++ b/esmvaltool/cmorizers/data/cmor_config/NOAA-CIRES-20CR-V2.yml @@ -44,3 +44,21 @@ variables: mip: Amon raw: uswrf file: 'uswrf.ntat.mon.mean.nc' + pr_month: + short_name: pr + mip: Amon + raw: prate + file: 'prate.mon.mean.nc' + tauu_month: + short_name: tauu + mip: Amon + raw: uflx + file: 'uflx.mon.mean.nc' + make_negative: true + tauv_month: + short_name: tauv + mip: Amon + raw: vflx + file: 'vflx.mon.mean.nc' + make_negative: true + diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index 8fcb6adc21..508b18ccec 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -1054,7 +1054,9 @@ datasets: gaussian/monolevel/tcdc.eatm.mon.mean.nc gaussian/monolevel/ulwrf.ntat.mon.mean.nc gaussian/monolevel/uswrf.ntat.mon.mean.nc - + gaussian/monolevel/prate.mon.mean.nc + gaussian/monolevel/uflx.mon.mean.nc + gaussian/monolevel/vflx.mon.mean.nc NOAA-CIRES-20CR-V3: tier: 2 source: ftp.cdc.noaa.gov/Projects/20thC_ReanV3/Monthlies/ diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/noaa_cires_20cr_v2.py b/esmvaltool/cmorizers/data/downloaders/datasets/noaa_cires_20cr_v2.py index fb2d733f06..bbbd708293 100644 --- a/esmvaltool/cmorizers/data/downloaders/datasets/noaa_cires_20cr_v2.py +++ b/esmvaltool/cmorizers/data/downloaders/datasets/noaa_cires_20cr_v2.py @@ -34,7 +34,7 @@ def download_dataset(config, dataset, dataset_info, start_date, end_date, ) downloader.connect() - downloader.set_cwd("Projects/20thC_ReanV2/Monthlies/") + downloader.set_cwd("/Projects/20thC_ReanV2/Monthlies/") downloader.download_file("monolevel/cldwtr.eatm.mon.mean.nc", sub_folder='surface') downloader.download_file("monolevel/pr_wtr.eatm.mon.mean.nc", @@ -47,3 +47,9 @@ def download_dataset(config, dataset, dataset_info, start_date, end_date, sub_folder='surface_gauss') downloader.download_file("gaussian/monolevel/uswrf.ntat.mon.mean.nc", sub_folder='surface_gauss') + downloader.download_file("gaussian/monolevel/prate.mon.mean.nc", + sub_folder='surface_gauss') + downloader.download_file("gaussian/monolevel/uflx.mon.mean.nc", + sub_folder='surface_gauss') + downloader.download_file("gaussian/monolevel/vflx.mon.mean.nc", + sub_folder='surface_gauss') diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py b/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py index a74938be86..c0f33286d5 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/ncep_ncar_r1.py @@ -143,6 +143,9 @@ def _extract_variable(short_name, var, cfg, raw_filepath, out_dir): cube = _fix_coordinates(cube, definition, cmor_info) + if var.get("make_negative"): + cube.data = -1 * cube.data + utils.save_variable( cube, short_name, diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index fd08dcadbc..8c7ba0a382 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -714,6 +714,9 @@ diagnostics: prw: rlut: rsut: + pr: + tauu: + tauv: additional_datasets: - {dataset: NOAA-CIRES-20CR-V2, project: OBS6, mip: Amon, tier: 2, type: reanaly, version: v2, start_year: 1871, end_year: 2012} From 8f7982c96a6b4dfe7809f70f9d8a075a3ba76809 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:39:42 +0200 Subject: [PATCH 50/87] Adapt ESMValTool to new configuration (#3761) Co-authored-by: Bouwe Andela --- .circleci/config.yml | 4 +- config-user-example.yml | 274 ------------------ doc/sphinx/source/community/dataset.rst | 9 +- doc/sphinx/source/community/diagnostic.rst | 23 +- .../detailed_release_procedure.rst | 4 +- doc/sphinx/source/community/upgrading.rst | 6 +- doc/sphinx/source/develop/dataset.rst | 35 +-- doc/sphinx/source/faq.rst | 15 +- doc/sphinx/source/functionalities.rst | 8 +- doc/sphinx/source/input.rst | 12 +- .../source/quickstart/configuration.rst | 15 +- doc/sphinx/source/quickstart/output.rst | 33 ++- doc/sphinx/source/quickstart/running.rst | 8 +- .../source/recipes/recipe_carvalhais14nat.rst | 32 +- doc/sphinx/source/recipes/recipe_climwip.rst | 8 +- doc/sphinx/source/recipes/recipe_gier20bg.rst | 14 +- .../source/recipes/recipe_hydrology.rst | 8 +- .../source/recipes/recipe_ipccwg1ar6ch3.rst | 28 +- doc/sphinx/source/recipes/recipe_kcs.rst | 4 +- .../recipes/recipe_model_evaluation.rst | 6 +- doc/sphinx/source/recipes/recipe_monitor.rst | 6 +- doc/sphinx/source/recipes/recipe_oceans.rst | 12 +- doc/sphinx/source/recipes/recipe_rainfarm.rst | 4 +- .../source/recipes/recipe_shapeselect.rst | 2 +- .../source/recipes/recipe_wenzel14jgr.rst | 4 +- .../source/recipes/recipe_wenzel16nat.rst | 19 +- doc/sphinx/source/utils.rst | 9 +- esmvaltool/cmorizers/data/cmorizer.py | 115 ++++++-- esmvaltool/cmorizers/data/datasets.yml | 34 +-- .../download_scripts/download_era_interim.py | 9 +- .../data/downloaders/datasets/jra_55.py | 2 - .../downloaders/datasets/noaa_ersstv3b.py | 1 + .../data/downloaders/datasets/noaa_ersstv5.py | 1 + .../downloaders/datasets/nsidc_g02202_sh.py | 1 + .../data/formatters/datasets/ct2019.py | 2 +- .../data/formatters/datasets/merra.ncl | 7 +- .../data/formatters/datasets/mls_aura.py | 2 +- .../diag_scripts/kcs/local_resampling.py | 4 +- .../diag_scripts/monitor/compute_eofs.py | 4 +- esmvaltool/diag_scripts/monitor/monitor.py | 4 +- .../diag_scripts/monitor/multi_datasets.py | 4 +- .../russell18jgr/russell18jgr-fig6a.ncl | 6 +- .../russell18jgr/russell18jgr-fig6b.ncl | 13 +- .../russell18jgr/russell18jgr-fig7i.ncl | 9 +- .../russell18jgr/russell18jgr-fig9c.ncl | 9 +- esmvaltool/interface_scripts/logging.ncl | 6 +- .../recipes/examples/recipe_extract_shape.yml | 2 +- .../hydrology/recipe_hydro_forcing.yml | 4 +- .../recipes/hydrology/recipe_lisflood.yml | 3 +- .../recipes/hydrology/recipe_marrmot.yml | 3 +- .../recipe_ipccwg1ar6ch3_fig_3_42_a.yml | 2 +- esmvaltool/recipes/recipe_carvalhais14nat.yml | 2 +- esmvaltool/recipes/recipe_runoff_et.yml | 2 +- .../recipes/recipe_sea_surface_salinity.yml | 5 +- esmvaltool/recipes/recipe_shapeselect.yml | 3 +- esmvaltool/utils/batch-jobs/generate.py | 16 +- tests/integration/test_cmorizer.py | 69 ++++- tests/integration/test_diagnostic_run.py | 61 +++- 58 files changed, 462 insertions(+), 545 deletions(-) delete mode 100644 config-user-example.yml diff --git a/.circleci/config.yml b/.circleci/config.yml index eb13a0ef08..82492e724f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -216,8 +216,8 @@ jobs: conda activate esmvaltool mkdir -p ~/climate_data esmvaltool config get_config_user - echo "search_esgf: when_missing" >> ~/.esmvaltool/config-user.yml - cat ~/.esmvaltool/config-user.yml + echo "search_esgf: when_missing" >> ~/.config/esmvaltool/config-user.yml + cat ~/.config/esmvaltool/config-user.yml for recipe in esmvaltool/recipes/testing/recipe_*.yml; do esmvaltool run "$recipe" done diff --git a/config-user-example.yml b/config-user-example.yml deleted file mode 100644 index c102928db9..0000000000 --- a/config-user-example.yml +++ /dev/null @@ -1,274 +0,0 @@ -############################################################################### -# Example user configuration file for ESMValTool -############################################################################### -# -# Note for users: -# -------------- -# Site-specific entries for different HPC centers are given at the bottom of -# this file. Comment out/replace as needed. This default version of the file -# can be used in combination with the command line argument -# ``search_esgf=when_missing``. If only certain values are allowed for an -# option, these are listed after ``---``. The option in square brackets is the -# default value, i.e., the one that is used if this option is omitted in the -# file. -# -############################################################################### -# -# Note for developers: -# ------------------- -# Two identical copies of this file (``ESMValTool/config-user-example.yml`` and -# ``ESMValCore/esmvalcore/config-user.yml``) exist. If you change one of it, -# make sure to apply the changes to the other. -# -############################################################################### ---- - -# Destination directory where all output will be written -# Includes log files and performance stats. -output_dir: ~/esmvaltool_output - -# Auxiliary data directory -# Used by some recipes to look for additional datasets. -auxiliary_data_dir: ~/auxiliary_data - -# Automatic data download from ESGF --- [never]/when_missing/always -# Use automatic download of missing CMIP3, CMIP5, CMIP6, CORDEX, and obs4MIPs -# data from ESGF. ``never`` disables this feature, which is useful if you are -# working on a computer without an internet connection, or if you have limited -# disk space. ``when_missing`` enables the automatic download for files that -# are not available locally. ``always`` will always check ESGF for the latest -# version of a file, and will only use local files if they correspond to that -# latest version. -search_esgf: never - -# Directory for storing downloaded climate data -# Make sure to use a directory where you can store multiple GBs of data. Your -# home directory on a HPC is usually not suited for this purpose, so please -# change the default value in this case! -download_dir: ~/climate_data - -# Run at most this many tasks in parallel --- [null]/1/2/3/4/... -# Set to ``null`` to use the number of available CPUs. If you run out of -# memory, try setting max_parallel_tasks to ``1`` and check the amount of -# memory you need for that by inspecting the file ``run/resource_usage.txt`` in -# the output directory. Using the number there you can increase the number of -# parallel tasks again to a reasonable number for the amount of memory -# available in your system. -max_parallel_tasks: null - -# Log level of the console --- debug/[info]/warning/error -# For much more information printed to screen set log_level to ``debug``. -log_level: info - -# Exit on warning --- true/[false] -# # Only used in NCL diagnostic scripts. -exit_on_warning: false - -# Plot file format --- [png]/pdf/ps/eps/epsi -output_file_type: png - -# Remove the ``preproc`` directory if the run was successful --- [true]/false -# By default this option is set to ``true``, so all preprocessor output files -# will be removed after a successful run. Set to ``false`` if you need those -# files. -remove_preproc_dir: true - -# Use netCDF compression --- true/[false] -compress_netcdf: false - -# Save intermediary cubes in the preprocessor --- true/[false] -# Setting this to ``true`` will save the output cube from each preprocessing -# step. These files are numbered according to the preprocessing order. -save_intermediary_cubes: false - -# Path to custom ``config-developer.yml`` file -# This can be used to customise project configurations. See -# ``config-developer.yml`` for an example. Set to ``null`` to use the default. -config_developer_file: null - -# Use a profiling tool for the diagnostic run --- [false]/true -# A profiler tells you which functions in your code take most time to run. -# Only available for Python diagnostics. -profile_diagnostic: false - -# Rootpaths to the data from different projects -# This default setting will work if files have been downloaded by ESMValTool -# via ``search_esgf``. Lists are also possible. For site-specific entries and -# more examples, see below. Comment out these when using a site-specific path. -rootpath: - default: ~/climate_data - -# Directory structure for input data --- [default]/ESGF/BADC/DKRZ/ETHZ/etc. -# This default setting will work if files have been downloaded by ESMValTool -# via ``search_esgf``. See ``config-developer.yml`` for definitions. Comment -# out/replace as per needed. -drs: - CMIP3: ESGF - CMIP5: ESGF - CMIP6: ESGF - CORDEX: ESGF - obs4MIPs: ESGF - -# Example rootpaths and directory structure that showcases the different -# projects and also the use of lists -# For site-specific entries, see below. -#rootpath: -# CMIP3: [~/cmip3_inputpath1, ~/cmip3_inputpath2] -# CMIP5: [~/cmip5_inputpath1, ~/cmip5_inputpath2] -# CMIP6: [~/cmip6_inputpath1, ~/cmip6_inputpath2] -# OBS: ~/obs_inputpath -# OBS6: ~/obs6_inputpath -# obs4MIPs: ~/obs4mips_inputpath -# ana4mips: ~/ana4mips_inputpath -# native6: ~/native6_inputpath -# RAWOBS: ~/rawobs_inputpath -# default: ~/default_inputpath -#drs: -# CMIP3: default -# CMIP5: default -# CMIP6: default -# CORDEX: default -# obs4MIPs: default - -# Directory tree created by automatically downloading from ESGF -# Uncomment the lines below to locate data that has been automatically -# downloaded from ESGF (using ``search_esgf``). -#rootpath: -# CMIP3: ~/climate_data -# CMIP5: ~/climate_data -# CMIP6: ~/climate_data -# CORDEX: ~/climate_data -# obs4MIPs: ~/climate_data -#drs: -# CMIP3: ESGF -# CMIP5: ESGF -# CMIP6: ESGF -# CORDEX: ESGF -# obs4MIPs: ESGF - -# Site-specific entries: JASMIN -# Uncomment the lines below to locate data on JASMIN. -#auxiliary_data_dir: /gws/nopw/j04/esmeval/aux_data/AUX -#rootpath: -# CMIP6: /badc/cmip6/data/CMIP6 -# CMIP5: /badc/cmip5/data/cmip5/output1 -# CMIP3: /badc/cmip3_drs/data/cmip3/output -# OBS: /gws/nopw/j04/esmeval/obsdata-v2 -# OBS6: /gws/nopw/j04/esmeval/obsdata-v2 -# obs4MIPs: /gws/nopw/j04/esmeval/obsdata-v2 -# ana4mips: /gws/nopw/j04/esmeval/obsdata-v2 -# CORDEX: /badc/cordex/data/CORDEX/output -#drs: -# CMIP6: BADC -# CMIP5: BADC -# CMIP3: BADC -# CORDEX: BADC -# OBS: default -# OBS6: default -# obs4MIPs: default -# ana4mips: default - -# Site-specific entries: DKRZ-Levante -# For bd0854 members a shared download directory is available -#search_esgf: when_missing -#download_dir: /work/bd0854/DATA/ESMValTool2/download -# Uncomment the lines below to locate data on Levante at DKRZ. -#auxiliary_data_dir: /work/bd0854/DATA/ESMValTool2/AUX -#rootpath: -# CMIP6: /work/bd0854/DATA/ESMValTool2/CMIP6_DKRZ -# CMIP5: /work/bd0854/DATA/ESMValTool2/CMIP5_DKRZ -# CMIP3: /work/bd0854/DATA/ESMValTool2/CMIP3 -# CORDEX: /work/ik1017/C3SCORDEX/data/c3s-cordex/output -# OBS: /work/bd0854/DATA/ESMValTool2/OBS -# OBS6: /work/bd0854/DATA/ESMValTool2/OBS -# obs4MIPs: /work/bd0854/DATA/ESMValTool2/OBS -# ana4mips: /work/bd0854/DATA/ESMValTool2/OBS -# native6: /work/bd0854/DATA/ESMValTool2/RAWOBS -# RAWOBS: /work/bd0854/DATA/ESMValTool2/RAWOBS -#drs: -# CMIP6: DKRZ -# CMIP5: DKRZ -# CMIP3: DKRZ -# CORDEX: BADC -# obs4MIPs: default -# ana4mips: default -# OBS: default -# OBS6: default -# native6: default - -# Site-specific entries: ETHZ -# Uncomment the lines below to locate data at ETHZ. -#rootpath: -# CMIP6: /net/atmos/data/cmip6 -# CMIP5: /net/atmos/data/cmip5 -# CMIP3: /net/atmos/data/cmip3 -# OBS: /net/exo/landclim/PROJECTS/C3S/datadir/obsdir/ -#drs: -# CMIP6: ETHZ -# CMIP5: ETHZ -# CMIP3: ETHZ - -# Site-specific entries: IPSL -# Uncomment the lines below to locate data on Ciclad at IPSL. -#rootpath: -# IPSLCM: / -# CMIP5: /bdd/CMIP5/output -# CMIP6: /bdd/CMIP6 -# CMIP3: /bdd/CMIP3 -# CORDEX: /bdd/CORDEX/output -# obs4MIPs: /bdd/obs4MIPS/obs-CFMIP/observations -# ana4mips: /not_yet -# OBS: /not_yet -# OBS6: /not_yet -# RAWOBS: /not_yet -#drs: -# CMIP6: DKRZ -# CMIP5: DKRZ -# CMIP3: IPSL -# CORDEX: BADC -# obs4MIPs: IPSL -# ana4mips: default -# OBS: not_yet -# OBS6: not_yet - -# Site-specific entries: Met Office -# Uncomment the lines below to locate data at the Met Office. -#rootpath: -# CMIP5: /project/champ/data/cmip5/output1 -# CMIP6: /project/champ/data/CMIP6 -# CORDEX: /project/champ/data/cordex/output -# OBS: /data/users/esmval/ESMValTool/obs -# OBS6: /data/users/esmval/ESMValTool/obs -# obs4MIPs: /data/users/esmval/ESMValTool/obs -# ana4mips: /project/champ/data/ana4MIPs -# native6: /data/users/esmval/ESMValTool/rawobs -# RAWOBS: /data/users/esmval/ESMValTool/rawobs -#drs: -# CMIP5: BADC -# CMIP6: BADC -# CORDEX: BADC -# OBS: default -# OBS6: default -# obs4MIPs: default -# ana4mips: BADC -# native6: default - -# Site-specific entries: NCI -# Uncomment the lines below to locate data at NCI. -#rootpath: -# CMIP6: [/g/data/oi10/replicas/CMIP6, /g/data/fs38/publications/CMIP6, /g/data/xp65/public/apps/esmvaltool/replicas/CMIP6] -# CMIP5: [/g/data/r87/DRSv3/CMIP5, /g/data/al33/replicas/CMIP5/combined, /g/data/rr3/publications/CMIP5/output1, /g/data/xp65/public/apps/esmvaltool/replicas/cmip5/output1] -# CMIP3: /g/data/r87/DRSv3/CMIP3 -# OBS: /g/data/ct11/access-nri/replicas/esmvaltool/obsdata-v2 -# OBS6: /g/data/ct11/access-nri/replicas/esmvaltool/obsdata-v2 -# obs4MIPs: /g/data/ct11/access-nri/replicas/esmvaltool/obsdata-v2 -# ana4mips: /g/data/ct11/access-nri/replicas/esmvaltool/obsdata-v2 -# native6: /g/data/xp65/public/apps/esmvaltool/native6 -# -#drs: -# CMIP6: NCI -# CMIP5: NCI -# CMIP3: NCI -# CORDEX: ESGF -# obs4MIPs: default -# ana4mips: default diff --git a/doc/sphinx/source/community/dataset.rst b/doc/sphinx/source/community/dataset.rst index 424d4d4694..7a24e7c923 100644 --- a/doc/sphinx/source/community/dataset.rst +++ b/doc/sphinx/source/community/dataset.rst @@ -42,14 +42,15 @@ and run the recipe, to make sure the CMOR checks pass without warnings or errors To test a pull request for a new CMORizer script: -#. Download the data following the instructions included in the script and place - it in the ``RAWOBS`` path specified in your ``config-user.yml`` +#. Download the data following the instructions included in the script and + place it in the ``RAWOBS`` ``rootpath`` specified in your + :ref:`configuration ` #. If available, use the downloading script by running ``esmvaltool data download --config_file `` #. Run the cmorization by running ``esmvaltool data format `` #. Copy the resulting data to the ``OBS`` (for CMIP5 compliant data) or ``OBS6`` - (for CMIP6 compliant data) path specified in your - ``config-user.yml`` + (for CMIP6 compliant data) ``rootpath`` specified in your + :ref:`configuration ` #. Run ``recipes/examples/recipe_check_obs.yml`` with the new dataset to check that the data can be used diff --git a/doc/sphinx/source/community/diagnostic.rst b/doc/sphinx/source/community/diagnostic.rst index 285815f7cf..1be820f7b8 100644 --- a/doc/sphinx/source/community/diagnostic.rst +++ b/doc/sphinx/source/community/diagnostic.rst @@ -64,7 +64,7 @@ If it is just a few simple scripts or packaging is not possible (i.e. for NCL) y and paste the source code into the ``esmvaltool/diag_scripts`` directory. If you have existing code in a compiled language like -C, C++, or Fortran that you want to re-use, the recommended way to proceed is to add Python bindings and publish +C, C++, or Fortran that you want to reuse, the recommended way to proceed is to add Python bindings and publish the package on PyPI so it can be installed as a Python dependency. You can then call the functions it provides using a Python diagnostic. @@ -134,9 +134,8 @@ Diagnostic output Typically, diagnostic scripts create plots, but any other output such as e.g. text files or tables is also possible. Figures should be saved in the ``plot_dir``, either in both ``.pdf`` and -``.png`` format (preferred), or -respect the ``output_file_type`` specified in the -:ref:`esmvalcore:user configuration file`. +``.png`` format (preferred), or respect the :ref:`configuration option +` ``output_file_type`` . Data should be saved in the ``work_dir``, preferably as a ``.nc`` (`NetCDF `__) file, following the `CF-Conventions `__ as much as possible. @@ -181,7 +180,7 @@ human inspection. In addition to provenance information, a caption is also added to the plots. Provenance information from the recipe is automatically recorded by ESMValCore, whereas -diagnostic scripts must include code specifically to record provenance. See below for +diagnostic scripts must include code specifically to record provenance. See below for documentation of provenance attributes that can be included in a recipe. When contributing a diagnostic, please make sure it records the provenance, and that no warnings related to provenance are generated when running the recipe. @@ -252,7 +251,7 @@ for example plot_types: errorbar: error bar plot -To use these items, include them in the provenance record dictionary in the form +To use these items, include them in the provenance record dictionary in the form :code:`key: [value]` i.e. for the example above as :code:`'plot_types': ['errorbar']`. @@ -275,8 +274,8 @@ Always use :func:`esmvaltool.diag_scripts.shared.run_diagnostic` at the end of y with run_diagnostic() as config: main(config) -Create a ``provenance_record`` for each diagnostic file (i.e. image or data -file) that the diagnostic script outputs. The ``provenance_record`` is a +Create a ``provenance_record`` for each diagnostic file (i.e. image or data +file) that the diagnostic script outputs. The ``provenance_record`` is a dictionary of provenance items, for example: .. code-block:: python @@ -296,15 +295,15 @@ dictionary of provenance items, for example: 'statistics': ['mean'], } -To save a matplotlib figure, use the convenience function -:func:`esmvaltool.diag_scripts.shared.save_figure`. Similarly, to save Iris cubes use +To save a matplotlib figure, use the convenience function +:func:`esmvaltool.diag_scripts.shared.save_figure`. Similarly, to save Iris cubes use :func:`esmvaltool.diag_scripts.shared.save_data`. Both of these functions take ``provenance_record`` as an argument and log the provenance accordingly. Have a look at the example Python diagnostic in `esmvaltool/diag_scripts/examples/diagnostic.py `_ for a complete example. -For any other files created, you will need to make use of a +For any other files created, you will need to make use of a :class:`esmvaltool.diag_scripts.shared.ProvenanceLogger` to log provenance. Include the following code directly after the file is saved: @@ -489,7 +488,7 @@ This includes the following items: * In-code documentation (comments, docstrings) * Code quality (e.g. no hardcoded pathnames) * No Codacy errors reported -* Re-use of existing functions whenever possible +* Reuse of existing functions whenever possible * Provenance implemented Run recipe diff --git a/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst b/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst index a73643f454..d0d7f74672 100644 --- a/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst +++ b/doc/sphinx/source/community/release_strategy/detailed_release_procedure.rst @@ -49,7 +49,7 @@ and attach it in the release testing issue; to record the environment in a yaml Modifications to configuration files need to be documented as well. To test recipes, it is recommended to only use the default options and DKRZ data directories, simply by uncommenting -the DKRZ-Levante block of a newly generated ``config-user.yml`` file. +the DKRZ-Levante block of a :ref:`newly generated configuration file `. Submit run scripts - test recipe runs ------------------------------------- @@ -61,7 +61,7 @@ You will have to set the name of your environment, your email address (if you wa More information on running jobs with SLURM on DKRZ/Levante can be found in the DKRZ `documentation `_. -You can also specify the path to your ``config-user.yml`` file where ``max_parallel_tasks`` can be set. The script was found to work well with ``max_parallel_tasks=8``. Some recipes need to be run with ``max_parallel_tasks=1`` (large memory requirements, CMIP3 data, diagnostic issues, ...). These recipes are listed in `ONE_TASK_RECIPES`. +You can also specify the path to your configuration directory where ``max_parallel_tasks`` can be set in a YAML file. The script was found to work well with ``max_parallel_tasks=8``. Some recipes need to be run with ``max_parallel_tasks=1`` (large memory requirements, CMIP3 data, diagnostic issues, ...). These recipes are listed in `ONE_TASK_RECIPES`. Some recipes need other job requirements, you can add their headers in the `SPECIAL_RECIPES` dictionary. Otherwise the header will be written following the template that is written in the lines below. If you want to exclude recipes, you can do so by uncommenting the `exclude` lines. diff --git a/doc/sphinx/source/community/upgrading.rst b/doc/sphinx/source/community/upgrading.rst index 9ed7f8b5b1..9a9b37f178 100644 --- a/doc/sphinx/source/community/upgrading.rst +++ b/doc/sphinx/source/community/upgrading.rst @@ -145,7 +145,7 @@ Many operations previously performed by the diagnostic scripts, are now included The backend operations are fully controlled by the ``preprocessors`` section in the recipe. Here, a number of preprocessor sets can be defined, with different options for each of the operations. The sets defined in this section are applied in the ``diagnostics`` section to preprocess a given variable. -It is recommended to proceed step by step, porting and testing each operation separately before proceeding with the next one. A useful setting in the user configuration file (``config-private.yml``) called ``write_intermediary_cube`` allows writing out the variable field after each preprocessing step, thus facilitating the comparison with the old version (e.g., after CMORization, level selection, after regridding, etc.). The CMORization step of the new backend exactly corresponds to the operation performed by the old backend (and stored in the ``climo`` directory, now called ``preprec``): this is the very first step to be checked, by simply comparing the intermediary file produced by the new backend after CMORization with the output of the old backend in the ``climo`` directorsy (see "Testing" below for instructions). +It is recommended to proceed step by step, porting and testing each operation separately before proceeding with the next one. A useful setting in the configuration called ``write_intermediary_cube`` allows writing out the variable field after each preprocessing step, thus facilitating the comparison with the old version (e.g., after CMORization, level selection, after regridding, etc.). The CMORization step of the new backend exactly corresponds to the operation performed by the old backend (and stored in the ``climo`` directory, now called ``preprec``): this is the very first step to be checked, by simply comparing the intermediary file produced by the new backend after CMORization with the output of the old backend in the ``climo`` directorsy (see "Testing" below for instructions). The new backend also performs variable derivation, replacing the ``calculate`` function in the ``variable_defs`` scripts. If the recipe which is being ported makes use of derived variables, the corresponding calculation must be ported from the ``./variable_defs/.ncl`` file to ``./esmvaltool/preprocessor/_derive.py``. @@ -159,7 +159,7 @@ In the new version, all settings are centralized in the recipe, completely repla Make sure the diagnostic script writes NetCDF output ====================================================== -Each diagnostic script is required to write the output of the anaylsis in one or more NetCDF files. This is to give the user the possibility to further look into the results, besides the plots, but (most importantly) for tagging purposes when publishing the data in a report and/or on a website. +Each diagnostic script is required to write the output of the analysis in one or more NetCDF files. This is to give the user the possibility to further look into the results, besides the plots, but (most importantly) for tagging purposes when publishing the data in a report and/or on a website. For each of the plot produced by the diagnostic script a single NetCDF file has to be generated. The variable saved in this file should also contain all the necessary metadata that documents the plot (dataset names, units, statistical methods, etc.). The files have to be saved in the work directory (defined in `cfg['work_dir']` and `config_user_info@work_dir`, for the python and NCL diagnostics, respectively). @@ -209,7 +209,7 @@ Before submitting a pull request, the code should be cleaned to adhere to the co Update the documentation ======================== -If necessary, add or update the documentation for your recipes in the corrsponding rst file, which is now in ``doc\sphinx\source\recipes``. Do not forget to also add the documentation file to the list in ``doc\sphinx\source\annex_c`` to make sure it actually appears in the documentation. +If necessary, add or update the documentation for your recipes in the corresponding rst file, which is now in ``doc\sphinx\source\recipes``. Do not forget to also add the documentation file to the list in ``doc\sphinx\source\annex_c`` to make sure it actually appears in the documentation. Open a pull request =================== diff --git a/doc/sphinx/source/develop/dataset.rst b/doc/sphinx/source/develop/dataset.rst index f3c168a17c..f624a44feb 100644 --- a/doc/sphinx/source/develop/dataset.rst +++ b/doc/sphinx/source/develop/dataset.rst @@ -76,7 +76,7 @@ for downloading (e.g. providing contact information, licence agreements) and using the observations. The unformatted (raw) observations should then be stored in the appropriate of these three folders. -For each additional dataset, an entry needs to be made to the file +For each additional dataset, an entry needs to be made to the file `datasets.yml `_. The dataset entry should contain: @@ -92,10 +92,10 @@ of the cmorizing script (see Section `4. Create a cmorizer for the dataset`_). 3.1 Downloader script (optional) -------------------------------- -A Python script can be written to download raw observations +A Python script can be written to download raw observations from source and store the data in the appropriate tier subdirectory of the folder ``RAWOBS`` automatically. -There are many downloading scripts available in +There are many downloading scripts available in `/esmvaltool/cmorizers/data/downloaders/datasets/ `_ where several data download mechanisms are provided: @@ -108,18 +108,18 @@ Note that the name of this downloading script has to be identical to the name of the dataset. Depending on the source server, the downloading script needs to contain paths to -raw observations, filename patterns and various necessary fields to retrieve +raw observations, filename patterns and various necessary fields to retrieve the data. -Default ``start_date`` and ``end_date`` can be provided in cases where raw data +Default ``start_date`` and ``end_date`` can be provided in cases where raw data are stored in daily, monthly, and yearly files. The downloading script for the given dataset can be run with: .. code-block:: console - esmvaltool data download --config_file + esmvaltool data download --config_dir -The options ``--start`` and ``--end`` can be added to the command above to +The options ``--start`` and ``--end`` can be added to the command above to restrict the download of raw data to a time range. They will be ignored if a specific dataset does not support it (i.e. because it is provided as a single file). Valid formats are ``YYYY``, ``YYYYMM`` and ``YYYYMMDD``. By default, already downloaded data are not overwritten @@ -128,7 +128,7 @@ unless the option ``--overwrite=True`` is used. 4. Create a cmorizer for the dataset ==================================== -There are many cmorizing scripts available in +There are many cmorizing scripts available in `/esmvaltool/cmorizers/data/formatters/datasets/ `_ where solutions to many kinds of format issues with observational data are @@ -158,7 +158,7 @@ configuration file: `MTE.yml `_ in the directory ``ESMValTool/esmvaltool/cmorizers/data/cmor_config/``. Note that both the name of this configuration file and the cmorizing script have to be -identical to the name of your dataset. +identical to the name of your dataset. It is recommended that you set ``project`` to ``OBS6`` in the configuration file. That way, the variables defined in the CMIP6 CMOR table, augmented with the custom variables described above, are available to your script. @@ -188,7 +188,8 @@ The main body of the CMORizer script must contain a function called with this exact call signature. Here, ``in_dir`` corresponds to the input directory of the raw files, ``out_dir`` to the output directory of final reformatted data set, ``cfg`` to the dataset-specific configuration file, -``cfg_user`` to the user configuration file, ``start_date`` to the start +``cfg_user`` to the configuration object (which behaves basically like a +dictionary), ``start_date`` to the start of the period to format, and ``end_date`` to the end of the period to format. If not needed, the last three arguments can be ignored using underscores. The return value of this function is ignored. All @@ -256,9 +257,9 @@ The cmorizing script for the given dataset can be run with: .. code-block:: console - esmvaltool data format --config_file + esmvaltool data format --config_dir -The options ``--start`` and ``--end`` can be added to the command above to +The options ``--start`` and ``--end`` can be added to the command above to restrict the formatting of raw data to a time range. They will be ignored if a specific dataset does not support it (i.e. because it is provided as a single file). Valid formats are ``YYYY``, ``YYYYMM`` and ``YYYYMMDD``. @@ -267,12 +268,12 @@ does not support it (i.e. because it is provided as a single file). Valid format The output path given in the configuration file is the path where your cmorized dataset will be stored. The ESMValTool will create a folder - with the correct tier information + with the correct tier information (see Section `2. Edit your configuration file`_) if that tier folder is not - already available, and then a folder named after the dataset. + already available, and then a folder named after the dataset. In this folder the cmorized data set will be stored as a NetCDF file. The cmorized dataset will be automatically moved to the correct tier - subfolder of your OBS or OBS6 directory if the option + subfolder of your OBS or OBS6 directory if the option ``--install=True`` is used in the command above and no such directory was already created. @@ -284,9 +285,9 @@ the cmorizing scripts can be run in a single command with: .. code-block:: console - esmvaltool data prepare --config_file + esmvaltool data prepare --config_dir -Note that options from the ```esmvaltool data download`` and +Note that options from the ```esmvaltool data download`` and ``esmvaltool data format`` commands can be passed to the above command. 6. Naming convention of the observational data files diff --git a/doc/sphinx/source/faq.rst b/doc/sphinx/source/faq.rst index 10c72bd2cb..43251a801b 100644 --- a/doc/sphinx/source/faq.rst +++ b/doc/sphinx/source/faq.rst @@ -59,12 +59,17 @@ This is a useful functionality because it allows the user to `fix` things on-the quitting the Ipython console, code execution continues as per normal. -Use multiple config-user.yml files -================================== +Using multiple configuration directories +======================================== + +By default, ESMValTool will read YAML configuration files from the user +configuration directory ``~/.config/esmvaltool``, which can be changed with the +``ESMVALTOOL_CONFIG_DIR`` environment variable. +If required, users can specify the command line option ``--config_dir`` to +select another configuration directory, which is read **in addition** to the +user configuration directory +See the section on configuration :ref:`config_yaml_files` for details on this. -The user selects the configuration yaml file at run time. It's possible to -have several configurations files. For instance, it may be practical to have one -config file for debugging runs and another for production runs. Create a symbolic link to the latest output directory ===================================================== diff --git a/doc/sphinx/source/functionalities.rst b/doc/sphinx/source/functionalities.rst index 5b49c118a2..0098d95ded 100644 --- a/doc/sphinx/source/functionalities.rst +++ b/doc/sphinx/source/functionalities.rst @@ -12,9 +12,9 @@ that it can: - execute the workflow; and - output the desired collective data and media. -To facilitate these four steps, the user has control over the tool via -two main input files: the :ref:`user configuration file ` -and the :ref:`recipe `. The configuration file sets +To facilitate these four steps, the user has control over the tool via the +:ref:`configuration ` and the :ref:`recipe +`. The configuration sets user and site-specific parameters (like input and output paths, desired output graphical formats, logging level, etc.), whereas the recipe file sets data, preprocessing and diagnostic-specific parameters (data @@ -27,7 +27,7 @@ recyclable; the recipe file can be used for a large number of applications, since it may include as many datasets, preprocessors and diagnostics sections as the user deems useful. -Once the user configuration files and the recipe are at hand, the user +Once the configuration files and the recipe are at hand, the user can start the tool. A schematic overview of the ESMValTool workflow is depicted in the figure below. diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index f3562c2507..d743ede59f 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -76,7 +76,7 @@ For example, run to run the default example recipe and automatically download the required data to the directory ``~/climate_data``. -The data only needs to be downloaded once, every following run will re-use +The data only needs to be downloaded once, every following run will reuse previously downloaded data stored in this directory. See :ref:`esmvalcore:config-esgf` for a more in depth explanation and the available configuration options. @@ -117,7 +117,7 @@ OBS and OBS6 data is stored in the `esmeval` Group Workspace (GWS), and to be gr GWS, one must apply at https://accounts.jasmin.ac.uk/services/group_workspaces/esmeval/ ; after permission has been granted, the user is encouraged to use the data locally, and not move it elsewhere, to minimize both data transfers and stale disk usage; to note that Tier 3 data is subject to data protection restrictions; for further inquiries, -the GWS is adminstered by [Valeriu Predoi](mailto:valeriu.predoi@ncas.ac.uk). +the GWS is administered by [Valeriu Predoi](mailto:valeriu.predoi@ncas.ac.uk). Using a CMORizer script ----------------------- @@ -193,8 +193,8 @@ To CMORize one or more datasets, run: esmvaltool data format --config_file [CONFIG_FILE] [DATASET_LIST] -The path to the raw data to be CMORized must be specified in the :ref:`user -configuration file` as RAWOBS. +The ``rootpath`` to the raw data to be CMORized must be specified in the +:ref:`configuration ` as ``RAWOBS``. Within this path, the data are expected to be organized in subdirectories corresponding to the data tier: Tier2 for freely-available datasets (other than obs4MIPs and ana4mips) and Tier3 for restricted datasets (i.e., dataset which @@ -492,8 +492,8 @@ A list of all currently supported native datasets is :ref:`provided here A detailed description of how to include new native datasets is given :ref:`here `. -To use this functionality, users need to provide a path in the -:ref:`esmvalcore:user configuration file` for the ``native6`` project data +To use this functionality, users need to provide a ``rootpath`` in the +:ref:`configuration ` for the ``native6`` project data and/or the dedicated project used for the native dataset, e.g., ``ICON``. Then, in the recipe, they can refer to those projects. For example: diff --git a/doc/sphinx/source/quickstart/configuration.rst b/doc/sphinx/source/quickstart/configuration.rst index 34c29aac5c..9cea6413b6 100644 --- a/doc/sphinx/source/quickstart/configuration.rst +++ b/doc/sphinx/source/quickstart/configuration.rst @@ -1,4 +1,4 @@ -.. _config-user: +.. _config: ************* Configuration @@ -7,22 +7,23 @@ Configuration The ``esmvaltool`` command is provided by the ESMValCore package, the documentation on configuring ESMValCore can be found :ref:`here `. -In particular, it is recommended to read the section on the -:ref:`User configuration file ` -and the section on +An overview of all configuration options can be found +:ref:`here `. +In particular, it is recommended to read the section on how to :ref:`specify +configuration options ` and the section on :ref:`Finding data `. -To install the default configuration file in the default location, run +To install the default configuration in the default location, run .. code:: bash esmvaltool config get_config_user -Note that this file needs to be customized using the instructions above, so +Note that this needs to be customized using the instructions above, so the ``esmvaltool`` command can find the data on your system, before it can run a recipe. There is a lesson available in the `ESMValTool tutorial `_ -that describes how to personalize the configuration file. It can be found +that describes how to personalize the configuration. It can be found `at this site `_. diff --git a/doc/sphinx/source/quickstart/output.rst b/doc/sphinx/source/quickstart/output.rst index 4a33e8ca42..33836f1c9a 100644 --- a/doc/sphinx/source/quickstart/output.rst +++ b/doc/sphinx/source/quickstart/output.rst @@ -5,8 +5,9 @@ Output ****** ESMValTool automatically generates a new output directory with every run. The -location is determined by the output_dir option in the config-user.yml file, -the recipe name, and the date and time, using the the format: YYYYMMDD_HHMMSS. +location is determined by the :ref:`configuration option +` ``output_dir``, the recipe name, and the date and +time, using the the format: YYYYMMDD_HHMMSS. For instance, a typical output location would be: output_directory/recipe_ocean_amoc_20190118_1027/ @@ -33,13 +34,15 @@ The preprocessed datasets will be stored to the preproc/ directory. Each variable in each diagnostic will have its own the `metadata.yml`_ interface files saved in the preproc directory. -If the option ``save_intermediary_cubes`` is set to ``true`` in the -config-user.yml file, then the intermediary cubes will also be saved here. -This option is set to false in the default ``config-user.yml`` file. +If the :ref:`configuration option ` +``save_intermediary_cubes`` is set to ``true`` , then the intermediary cubes +will also be saved here. +This option is set to ``false`` by default. -If the option ``remove_preproc_dir`` is set to ``true`` in the config-user.yml -file, then the preproc directory will be deleted after the run completes. This -option is set to true in the default ``config-user.yml`` file. +If the :ref:`configuration option ` +``remove_preproc_dir`` is set to ``true`` , then the preproc directory will be +deleted after the run completes. +This option is set to ``true`` by default. Run @@ -70,8 +73,8 @@ Plots ===== The plots directory is where diagnostics save their output figures. These -plots are saved in the format requested by the option `output_file_type` in the -config-user.yml file. +plots are saved in the format requested by the :ref:`configuration option +` ``output_file_type``. Settings.yml @@ -81,10 +84,10 @@ The settings.yml file is automatically generated by ESMValCore. For each diagnos a unique settings.yml file will be produced. The settings.yml file passes several global level keys to diagnostic scripts. -This includes several flags from the config-user.yml file (such as -'write_netcdf', 'write_plots', etc...), several paths which are specific to the -diagnostic being run (such as 'plot_dir' and 'run_dir') and the location on -disk of the metadata.yml file (described below). +This includes several flags from the configuration (such as +``write_netcdf``, ``write_plots``, etc...), several paths which are specific to +the diagnostic being run (such as ``plot_dir`` and ``run_dir``) and the +location on disk of the metadata.yml file (described below). .. code-block:: yaml @@ -147,5 +150,5 @@ As you can see, this is effectively a dictionary with several items including data paths, metadata and other information. There are several tools available in python which are built to read and parse -these files. The tools are avaialbe in the shared directory in the diagnostics +these files. The tools are available in the shared directory in the diagnostics directory. diff --git a/doc/sphinx/source/quickstart/running.rst b/doc/sphinx/source/quickstart/running.rst index 7f9cadbaa1..20cb8620b0 100644 --- a/doc/sphinx/source/quickstart/running.rst +++ b/doc/sphinx/source/quickstart/running.rst @@ -39,20 +39,20 @@ from ESGF to the local directory ``~/climate_data``, run The ``--search_esgf=when_missing`` option tells ESMValTool to search for and download the necessary climate data files, if they cannot be found locally. -The data only needs to be downloaded once, every following run will re-use +The data only needs to be downloaded once, every following run will reuse previously downloaded data. If you have all required data available locally, you can run the tool with ``--search_esgf=never`` argument (the default). Note that in that case the required data should be located in the directories -specified in your user configuration file. +specified in the configuration (see :ref:`esmvalcore:config_option_rootpath`). A third option ``--search_esgf=always`` is available. With this option, the tool will first check the ESGF for the needed data, regardless of any local data availability; if the data found on ESGF is newer than the local data (if any) or the user specifies a version of the data that is available only from the ESGF, then that data will be downloaded; otherwise, local data will be used. -Recall that the chapter :ref:`Configuring ESMValTool ` -provides an explanation of how to create your own config-user.yml file. +Recall that the chapter on :ref:`configuring ESMValTool ` +provides an explanation of how to set up the configuration. See :ref:`running esmvaltool ` in the ESMValCore documentation for a more complete introduction to the ``esmvaltool`` command. diff --git a/doc/sphinx/source/recipes/recipe_carvalhais14nat.rst b/doc/sphinx/source/recipes/recipe_carvalhais14nat.rst index dc26a745e2..b551bbbdc5 100644 --- a/doc/sphinx/source/recipes/recipe_carvalhais14nat.rst +++ b/doc/sphinx/source/recipes/recipe_carvalhais14nat.rst @@ -73,7 +73,7 @@ The settings needed for loading the observational dataset in all diagnostics are provided in the recipe through `obs_info` within `obs_details` section. * ``obs_data_subdir``: subdirectory of auxiliary_data_dir (set in - config-user file) where observation data are stored {e.g., + configuration) where observation data are stored {e.g., data_ESMValTool_Carvalhais2014}. * ``source_label``: source data label {'Carvalhais2014'}. * ``variant_label``: variant of the observation {'BE'} for best estimate. @@ -112,7 +112,7 @@ Script land_carbon_cycle/diag_global_turnover.py * ``y0``: {``float``, 1.0} Y - coordinate of the upper edge of the figure. * ``wp``: {``float``, 1 / number of models} - width of each map. * ``hp``: {``float``, = wp} - height of each map. - * ``xsp``: {``float``, 0} - spacing betweeen maps in X - direction. + * ``xsp``: {``float``, 0} - spacing between maps in X - direction. * ``ysp``: {``float``, -0.03} - spacing between maps in Y -direction. Negative to reduce the spacing below default. * ``aspect_map``: {``float``, 0.5} - aspect of the maps. @@ -217,10 +217,10 @@ Due to inherent dependence of the diagnostic on uncertainty estimates in observation, the data needed for each diagnostic script are processed at different spatial resolutions (as in Carvalhais et al., 2014), and provided in 11 different resolutions (see Table 1). Note that the uncertainties were -estimated at the resolution of the selected models, and, thus, only the -pre-processed observed data can be used with the recipe. -It is not possible to use regridding functionalities of ESMValTool to regrid -the observational data to other spatial resolutions, as the uncertainty +estimated at the resolution of the selected models, and, thus, only the +pre-processed observed data can be used with the recipe. +It is not possible to use regridding functionalities of ESMValTool to regrid +the observational data to other spatial resolutions, as the uncertainty estimates cannot be regridded. Table 1. A summary of the observation datasets at different resolutions. @@ -309,7 +309,7 @@ Example plots Comparison of latitudinal (zonal) variations of pearson correlation between turnover time and climate: turnover time and precipitation, controlled for - temperature (left) and vice-versa (right). Reproduces figures 2c and 2d in + temperature (left) and vice-versa (right). Reproduces figures 2c and 2d in `Carvalhais et al. (2014)`_. .. _fig_carvalhais14nat_2: @@ -320,7 +320,7 @@ Example plots Comparison of observation-based and modelled ecosystem carbon turnover time. Along the diagnonal, tau_ctotal are plotted, above the bias, and below - density plots. The inset text in density plots indicate the correlation. + density plots. The inset text in density plots indicate the correlation. .. _fig_carvalhais14nat_3: @@ -328,11 +328,11 @@ Example plots :align: center :width: 80% - Global distributions of multimodel bias and model agreement. Multimodel bias - is calculated as the ratio of multimodel median turnover time and that from - observation. Stippling indicates the regions where only less than one - quarter of the models fall within the range of observational uncertainties - (`5^{th}` and `95^{th}` percentiles). Reproduces figure 3 in `Carvalhais et + Global distributions of multimodel bias and model agreement. Multimodel bias + is calculated as the ratio of multimodel median turnover time and that from + observation. Stippling indicates the regions where only less than one + quarter of the models fall within the range of observational uncertainties + (`5^{th}` and `95^{th}` percentiles). Reproduces figure 3 in `Carvalhais et al. (2014)`_. .. _fig_carvalhais14nat_4: @@ -341,7 +341,7 @@ Example plots :align: center :width: 80% - Comparison of latitudinal (zonal) variations of observation-based and - modelled ecosystem carbon turnover time. The zonal turnover time is - calculated as the ratio of zonal `ctotal` and `gpp`. Reproduces figures 2a + Comparison of latitudinal (zonal) variations of observation-based and + modelled ecosystem carbon turnover time. The zonal turnover time is + calculated as the ratio of zonal `ctotal` and `gpp`. Reproduces figures 2a and 2b in `Carvalhais et al. (2014)`_. diff --git a/doc/sphinx/source/recipes/recipe_climwip.rst b/doc/sphinx/source/recipes/recipe_climwip.rst index 0928ba939f..900698b85a 100644 --- a/doc/sphinx/source/recipes/recipe_climwip.rst +++ b/doc/sphinx/source/recipes/recipe_climwip.rst @@ -43,9 +43,9 @@ Using shapefiles for cutting scientific regions To use shapefiles for selecting SREX or AR6 regions by name it is necessary to download them, e.g., from the sources below and reference the file using the `shapefile` parameter. This can either be a -absolute or a relative path. In the example recipes they are stored in a subfolder `shapefiles` -in the `auxiliary_data_dir` (with is specified in the -`config-user.yml `_). +absolute or a relative path. In the example recipes they are stored in a subfolder `shapefiles` +in the :ref:`configuration option ` +``auxiliary_data_dir``. SREX regions (AR5 reference regions): http://www.ipcc-data.org/guidelines/pages/ar5_regions.html @@ -249,7 +249,7 @@ Brunner et al. (2020) recipe and example independence weighting The recipe uses an additional step between pre-processor and weight calculation to calculate anomalies relative to the global mean (e.g., tas_ANOM = tas_CLIM - global_mean(tas_CLIM)). This means we do not use the absolute temperatures of a model as performance criterion but rather the horizontal temperature distribution (see `Brunner et al. 2020 `_ for a discussion). -This recipe also implements a somewhat general independence weighting for CMIP6. In contrast to model performance (which should be case specific) model independence can largely be seen as only dependet on the multi-model ensemble in use but not the target variable or region. This means that the configuration used should be valid for similar subsets of CMIP6 as used in this recipe: +This recipe also implements a somewhat general independence weighting for CMIP6. In contrast to model performance (which should be case specific) model independence can largely be seen as only dependent on the multi-model ensemble in use but not the target variable or region. This means that the configuration used should be valid for similar subsets of CMIP6 as used in this recipe: .. code-block:: yaml diff --git a/doc/sphinx/source/recipes/recipe_gier20bg.rst b/doc/sphinx/source/recipes/recipe_gier20bg.rst index bb11770a24..b8f8fb9b8e 100644 --- a/doc/sphinx/source/recipes/recipe_gier20bg.rst +++ b/doc/sphinx/source/recipes/recipe_gier20bg.rst @@ -53,7 +53,7 @@ User settings in recipe * Optional diag_script_info attributes: * ``styleset``: styleset for color coding panels - * ``output_file_type``: output file type for plots, default: config_user -> png + * ``output_file_type``: output file type for plots, default: png * ``var_plotname``: NCL string formatting how variable should be named in plots defaults to short_name if not assigned. @@ -64,7 +64,7 @@ User settings in recipe amplitude contour plot * Optional diag_script_info attributes: - * ``output_file_type``: output file type for plots, default: config_user -> png + * ``output_file_type``: output file type for plots, default: png #. Script xco2_analysis/main.ncl: @@ -77,7 +77,7 @@ User settings in recipe accounting for the ensemble member named in "ensemble_refs" * Optional diag_script_info attributes: - * ``output_file_type``: output file type for plots, default: config_user -> png + * ``output_file_type``: output file type for plots, default: png * ``ensemble_refs``: list of model-ensemble pairs to denote which ensemble member to use for calculating multi-model mean. required if ensemble_mean = true @@ -97,17 +97,17 @@ User settings in recipe * ``plot_var2_mean``: If True adds mean of seasonal cycle to panel as string. * Optional diag_script_info attributes: - * ``output_file_type``: output file type for plots, default: config_user -> png + * ``output_file_type``: output file type for plots, default: png * ``var_plotname``: String formatting how variable should be named in plots defaults to short_name if not assigned #. Script xco2_analysis/sat_masks.ncl: * Optional diag_script_info attributes: - * ``output_file_type``: output file type for plots, default: config_user -> png + * ``output_file_type``: output file type for plots, default: png * ``var_plotname``: String formatting how variable should be named in plots defaults to short_name if not assigned - * ``c3s_plots``: Missing value plots seperated by timeseries of c3s satellites + * ``c3s_plots``: Missing value plots separated by timeseries of c3s satellites #. Script xco2_analysis/station_comparison.ncl: @@ -116,7 +116,7 @@ User settings in recipe first, then 2D variable, followed by surface stations * Optional diag_script_info attributes: - * ``output_file_type``: output file type for plots, default: config_user -> png + * ``output_file_type``: output file type for plots, default: png * ``var_plotnames``: String formatting how variables should be named in plots defaults to short_name if not assigned * ``overwrite_altitudes``: Give other altitude values than the ones attached in diff --git a/doc/sphinx/source/recipes/recipe_hydrology.rst b/doc/sphinx/source/recipes/recipe_hydrology.rst index d0e2e0bcb3..995a70b3ae 100644 --- a/doc/sphinx/source/recipes/recipe_hydrology.rst +++ b/doc/sphinx/source/recipes/recipe_hydrology.rst @@ -62,13 +62,13 @@ Diagnostics are stored in esmvaltool/diag_scripts/hydrology * wflow.py * lisflood.py * hype.py - * globwat.py + * globwat.py User settings in recipe ----------------------- -All hydrological recipes require a shapefile as an input to produce forcing data. This shapefile determines the shape of the basin for which the data will be cut out and processed. All recipes are tested with `the shapefiles `_ that are used for the eWaterCycle project. In principle any shapefile can be used, for example, the freely available basin shapefiles from the `HydroSHEDS project `_. +All hydrological recipes require a shapefile as an input to produce forcing data. This shapefile determines the shape of the basin for which the data will be cut out and processed. All recipes are tested with `the shapefiles `_ that are used for the eWaterCycle project. In principle any shapefile can be used, for example, the freely available basin shapefiles from the `HydroSHEDS project `_. #. recipe_pcrglobwb.yml @@ -87,7 +87,7 @@ All hydrological recipes require a shapefile as an input to produce forcing data *extract_shape:* - * shapefile: Meuse.shp (MARRMoT is a hydrological Lumped model that needs catchment-aggregated forcing data. The catchment is provided as a shapefile, the path can be relative to ``auxiliary_data_dir`` as defined in config-user.yml.). + * shapefile: Meuse.shp (MARRMoT is a hydrological Lumped model that needs catchment-aggregated forcing data. The catchment is provided as a shapefile, the path can be relative to :ref:`configuration option ` ``auxiliary_data_dir``). * method: contains * crop: true @@ -107,7 +107,7 @@ All hydrological recipes require a shapefile as an input to produce forcing data * dem_file: netcdf file containing a digital elevation model with elevation in meters and coordinates latitude and longitude. A wflow example dataset is available at: https://github.com/openstreams/wflow/tree/master/examples/wflow_rhine_sbm - The example dem_file can be obtained from https://github.com/openstreams/wflow/blob/master/examples/wflow_rhine_sbm/staticmaps/wflow_dem.map + The example dem_file can be obtained from https://github.com/openstreams/wflow/blob/master/examples/wflow_rhine_sbm/staticmaps/wflow_dem.map * regrid: the regridding scheme for regridding to the digital elevation model. Choose ``area_weighted`` (slow) or ``linear``. #. recipe_lisflood.yml diff --git a/doc/sphinx/source/recipes/recipe_ipccwg1ar6ch3.rst b/doc/sphinx/source/recipes/recipe_ipccwg1ar6ch3.rst index 42bedcec09..718c345b19 100644 --- a/doc/sphinx/source/recipes/recipe_ipccwg1ar6ch3.rst +++ b/doc/sphinx/source/recipes/recipe_ipccwg1ar6ch3.rst @@ -6,7 +6,7 @@ IPCC AR6 Chapter 3 (selected figures) Overview -------- -This recipe collects selected diagnostics used in IPCC AR6 WGI Chapter 3: +This recipe collects selected diagnostics used in IPCC AR6 WGI Chapter 3: Human influence on the climate system (`Eyring et al., 2021`_). Plots from IPCC AR6 can be readily reproduced and compared to previous versions. The aim is to be able to start with what was available now the next time allowing us to focus @@ -15,7 +15,8 @@ on developing more innovative analysis methods rather than constantly having to Processing of CMIP3 models currently works only in serial mode, due to an issue in the input data still under investigation. To run the recipe for Fig 3.42a -and Fig. 3.43 set "max_parallel_tasks: 1" in the config-user.yml file. +and Fig. 3.43 set the :ref:`configuration option ` +``max_parallel_tasks: 1``. The plots are produced collecting the diagnostics from individual recipes. The following figures from `Eyring et al. (2021)`_ can currently be reproduced: @@ -43,10 +44,9 @@ To reproduce Fig. 3.9 you need the shapefile of the `AR6 reference regions (`Iturbide et al., 2020 `_). Please download the file `IPCC-WGI-reference-regions-v4_shapefile.zip `_, -unzip and store it in `/IPCC-regions/` (the `auxiliary_data_dir` -is defined in the `config-user.yml -`_ -file). +unzip and store it in `/IPCC-regions/` (where +``auxiliary_data_dir`` is given as :ref:`configuration option +`). .. _`Eyring et al., 2021`: https://www.ipcc.ch/report/ar6/wg1/chapter/chapter-3/ .. _`Eyring et al. (2021)`: https://www.ipcc.ch/report/ar6/wg1/chapter/chapter-3/ @@ -179,7 +179,7 @@ User settings in recipe * start_year: start year in figure * end_year: end year in figure - * panels: list of variable blocks for each panel + * panels: list of variable blocks for each panel *Optional settings for script* @@ -205,7 +205,7 @@ User settings in recipe * plot_units: variable unit for plotting * y-min: set min of y-axis * y-max: set max of y-axis - * order: order in which experiments should be plotted + * order: order in which experiments should be plotted * stat_shading: if true: shading of statistic range * ref_shading: if true: shading of reference period @@ -225,7 +225,7 @@ User settings in recipe * plot_legend: if true, plot legend will be plotted * plot_units: variable unit for plotting - * multi_model_mean: if true, multi-model mean and uncertaintiy will be + * multi_model_mean: if true, multi-model mean and uncertainty will be plotted *Optional settings for variables* @@ -304,7 +304,7 @@ User settings in recipe * labels: List of labels for each variable on the x-axis * model_spread: if True, model spread is shaded * plot_median: if True, median is plotted - * project_order: give order of projects + * project_order: give order of projects Variables @@ -452,7 +452,7 @@ Example plots 2013). For line colours see the legend of Figure 3.4. Additionally, the multi-model mean (red) and standard deviation (grey shading) are shown. Observational and model datasets were detrended by removing the - least-squares quadratic trend. + least-squares quadratic trend. .. figure:: /recipes/figures/ipccwg1ar6ch3/tas_anom_damip_global_1850-2020.png :align: center @@ -467,7 +467,7 @@ Example plots anomalies are shown relative to 1950-2010 for Antarctica and relative to 1850-1900 for other continents. CMIP6 historical simulations are expanded by the SSP2-4.5 scenario simulations. All available ensemble members were used. - Regions are defined by Iturbide et al. (2020). + Regions are defined by Iturbide et al. (2020). .. figure:: /recipes/figures/ipccwg1ar6ch3/model_bias_pr_annualclim_CMIP6.png :align: center @@ -487,7 +487,7 @@ Example plots show a change greater than the variability threshold; crossed lines indicate regions with conflicting signal, where >=66% of models show change greater than the variability threshold and <80% of all models agree on the sign of - change. + change. .. figure:: /recipes/figures/ipccwg1ar6ch3/precip_anom_1950-2014.png :align: center @@ -511,7 +511,7 @@ Example plots forcings (brown) and natural forcings only (blue). Observed trends for each observational product are shown as horizontal lines. Panel (b) shows annual mean precipitation rate (mm day-1) of GHCN version 2 for the years 1950-2014 - over land areas used to compute the plots. + over land areas used to compute the plots. .. figure:: /recipes/figures/ipccwg1ar6ch3/zonal_westerly_winds.png :align: center diff --git a/doc/sphinx/source/recipes/recipe_kcs.rst b/doc/sphinx/source/recipes/recipe_kcs.rst index fa07f0a167..1ed117ecb6 100644 --- a/doc/sphinx/source/recipes/recipe_kcs.rst +++ b/doc/sphinx/source/recipes/recipe_kcs.rst @@ -30,7 +30,7 @@ In the second diagnostic, for both the control and future periods, the N target 2. Further constrain the selection by picking samples that represent either high or low changes in summer precipitation and summer and winter temperature, by limiting the remaining samples to certain percentile ranges: relatively wet/cold in the control and dry/warm in the future, or vice versa. The percentile ranges are listed in table 1 of Lenderink 2014's supplement. This should result is approximately 50 remaining samples for each scenario, for both control and future. 3. Use a Monte-Carlo method to make a final selection of 8 resamples with minimal reuse of the same ensemble member/segment. -Datasets have been split in two parts: the CMIP datasets and the target model datasets. An example use case for this recipe is to compare between CMIP5 and CMIP6, for example. The recipe can work with a target model that is not part of CMIP, provided that the data are CMOR compatible, and using the same data referece syntax as the CMIP data. Note that you can specify :ref:`multiple data paths` in the user configuration file. +Datasets have been split in two parts: the CMIP datasets and the target model datasets. An example use case for this recipe is to compare between CMIP5 and CMIP6, for example. The recipe can work with a target model that is not part of CMIP, provided that the data are CMOR compatible, and using the same data reference syntax as the CMIP data. Note that you can specify :ref:`multiple data paths` in the configuration. Available recipes and diagnostics @@ -128,7 +128,7 @@ AND highlighting the selected steering parameters and resampling periods: .. figure:: /recipes/figures/kcs/global_matching.png :align: center -The diagnostic ``local_resampling`` procudes a number of output files: +The diagnostic ``local_resampling`` produces a number of output files: * ``season_means_.nc``: intermediate results, containing the season means for each segment of the original target model ensemble. * ``top1000_.csv``: intermediate results, containing the 1000 combinations that have been selected based on winter mean precipitation. diff --git a/doc/sphinx/source/recipes/recipe_model_evaluation.rst b/doc/sphinx/source/recipes/recipe_model_evaluation.rst index 9e199815e0..c61f34aa62 100644 --- a/doc/sphinx/source/recipes/recipe_model_evaluation.rst +++ b/doc/sphinx/source/recipes/recipe_model_evaluation.rst @@ -35,9 +35,9 @@ User settings ------------- It is recommended to use a vector graphic file type (e.g., SVG) for the output -format when running this recipe, i.e., run the recipe with the command line -option ``--output_file_type=svg`` or use ``output_file_type: svg`` in your -:ref:`esmvalcore:user configuration file`. +format when running this recipe, i.e., run the recipe with the +:ref:`configuration options ` ``output_file_type: +svg``. Note that map and profile plots are rasterized by default. Use ``rasterize: false`` in the recipe to disable this. diff --git a/doc/sphinx/source/recipes/recipe_monitor.rst b/doc/sphinx/source/recipes/recipe_monitor.rst index ee3b9b44fa..8f4893fc12 100644 --- a/doc/sphinx/source/recipes/recipe_monitor.rst +++ b/doc/sphinx/source/recipes/recipe_monitor.rst @@ -36,9 +36,9 @@ User settings ------------- It is recommended to use a vector graphic file type (e.g., SVG) for the output -files when running this recipe, i.e., run the recipe with the command line -option ``--output_file_type=svg`` or use ``output_file_type: svg`` in your -:ref:`esmvalcore:user configuration file`. +format when running this recipe, i.e., run the recipe with the +:ref:`configuration options ` ``output_file_type: +svg``. Note that map and profile plots are rasterized by default. Use ``rasterize_maps: false`` or ``rasterize: false`` (see `Recipe settings`_) in the recipe to disable this. diff --git a/doc/sphinx/source/recipes/recipe_oceans.rst b/doc/sphinx/source/recipes/recipe_oceans.rst index d8bf3143e1..17552b39fa 100644 --- a/doc/sphinx/source/recipes/recipe_oceans.rst +++ b/doc/sphinx/source/recipes/recipe_oceans.rst @@ -458,7 +458,7 @@ and a latitude and longitude coordinates. This diagnostic also includes the optional arguments, `maps_range` and `diff_range` to manually define plot ranges. Both arguments are a list of two floats -to set plot range minimun and maximum values respectively for Model and Observations +to set plot range minimum and maximum values respectively for Model and Observations maps (Top panels) and for the Model minus Observations panel (bottom left). Note that if input data have negative values the Model over Observations map (bottom right) is not produced. @@ -491,14 +491,14 @@ diagnostic_maps_multimodel.py The diagnostic_maps_multimodel.py_ diagnostic makes model(s) vs observations maps and if data are not provided it draws only model field. -It is always nessary to define the overall layout trough the argument `layout_rowcol`, +It is always necessary to define the overall layout through the argument `layout_rowcol`, which is a list of two integers indicating respectively the number of rows and columns to organize the plot. Observations has not be accounted in here as they are automatically added at the top of the figure. This diagnostic also includes the optional arguments, `maps_range` and `diff_range` to manually define plot ranges. Both arguments are a list of two floats -to set plot range minimun and maximum values respectively for variable data and +to set plot range minimum and maximum values respectively for variable data and the Model minus Observations range. Note that this diagnostic assumes that the preprocessors do the bulk of the @@ -748,7 +748,7 @@ These tools are: - bgc_units: converts to sensible units where appropriate (ie Celsius, mmol/m3) - timecoord_to_float: Converts time series to decimal time ie: Midnight on January 1st 1970 is 1970.0 - add_legend_outside_right: a plotting tool, which adds a legend outside the axes. -- get_image_format: loads the image format, as defined in the global user config.yml. +- get_image_format: loads the image format, as defined in the global configuration. - get_image_path: creates a path for an image output. - make_cube_layer_dict: makes a dictionary for several layers of a cube. @@ -762,8 +762,8 @@ A note on the auxiliary data directory Some of these diagnostic scripts may not function on machines with no access to the internet, as cartopy may try to download the shape files. The solution to this issue is the put the relevant cartopy shapefiles in a directory which -is visible to esmvaltool, then link that path to ESMValTool via -the `auxiliary_data_dir` variable in your config-user.yml file. +is visible to esmvaltool, then link that path to ESMValTool via the +:ref:`configuration option ` ``auxiliary_data_dir``. The cartopy masking files can be downloaded from: https://www.naturalearthdata.com/downloads/ diff --git a/doc/sphinx/source/recipes/recipe_rainfarm.rst b/doc/sphinx/source/recipes/recipe_rainfarm.rst index d6c06c6f7a..aeb7cd0638 100644 --- a/doc/sphinx/source/recipes/recipe_rainfarm.rst +++ b/doc/sphinx/source/recipes/recipe_rainfarm.rst @@ -32,7 +32,7 @@ User settings * nf: number of subdivisions for downscaling (e.g. 8 will produce output fields with linear resolution increased by a factor 8) * conserv_glob: logical, if to conserve precipitation over full domain * conserv_smooth: logical, if to conserve precipitation using convolution (if neither conserv_glob or conserv_smooth is chosen, box conservation is used) -* weights_climo: set to false or omit if no orographic weights are to be used, else set it to the path to a fine-scale precipitation climatology file. If a relative file path is used, `auxiliary_data_dir` will be searched for this file. The file is expected to be in NetCDF format and should contain at least one precipitation field. If several fields at different times are provided, a climatology is derived by time averaging. Suitable climatology files could be for example a fine-scale precipitation climatology from a high-resolution regional climate model (see e.g. Terzago et al. 2018), a local high-resolution gridded climatology from observations, or a reconstruction such as those which can be downloaded from the WORLDCLIM (http://www.worldclim.org) or CHELSA (http://chelsa-climate.org) websites. The latter data will need to be converted to NetCDF format before being used (see for example the GDAL tools (https://www.gdal.org). +* weights_climo: set to false or omit if no orographic weights are to be used, else set it to the path to a fine-scale precipitation climatology file. If a relative file path is used, ``auxiliary_data_dir`` will be searched for this file. The file is expected to be in NetCDF format and should contain at least one precipitation field. If several fields at different times are provided, a climatology is derived by time averaging. Suitable climatology files could be for example a fine-scale precipitation climatology from a high-resolution regional climate model (see e.g. Terzago et al. 2018), a local high-resolution gridded climatology from observations, or a reconstruction such as those which can be downloaded from the WORLDCLIM (http://www.worldclim.org) or CHELSA (http://chelsa-climate.org) websites. The latter data will need to be converted to NetCDF format before being used (see for example the GDAL tools (https://www.gdal.org). Variables @@ -60,4 +60,4 @@ Example plots .. figure:: /recipes/figures/rainfarm/rainfarm.png :width: 14cm - Example of daily cumulated precipitation from the CMIP5 EC-EARTH model on a specific day, downscaled using RainFARM from its original resolution (1.125°) (left panel), increasing spatial resolution by a factor of 8 to 0.14°; Two stochastic realizations are shown (central and right panel). A fixed spectral slope of s=1.7 was used. Notice how the downscaled fields introduce fine scale precipitation structures, while still maintaining on average the original coarse-resolution precipitation. Different stochastic realizations are shown to demonstrate how an ensemble of realizations can be used to reproduce unresolved subgrid variability. (N.B.: this plot was not produced by ESMValTool - the recipe output is netcdf only). + Example of daily cumulated precipitation from the CMIP5 EC-EARTH model on a specific day, downscaled using RainFARM from its original resolution (1.125°) (left panel), increasing spatial resolution by a factor of 8 to 0.14°; Two stochastic realizations are shown (central and right panel). A fixed spectral slope of s=1.7 was used. Notice how the downscaled fields introduce fine scale precipitation structures, while still maintaining on average the original coarse-resolution precipitation. Different stochastic realizations are shown to demonstrate how an ensemble of realizations can be used to reproduce unresolved subgrid variability. (N.B.: this plot was not produced by ESMValTool - the recipe output is netcdf only). diff --git a/doc/sphinx/source/recipes/recipe_shapeselect.rst b/doc/sphinx/source/recipes/recipe_shapeselect.rst index 63afbcae6c..12da974c28 100644 --- a/doc/sphinx/source/recipes/recipe_shapeselect.rst +++ b/doc/sphinx/source/recipes/recipe_shapeselect.rst @@ -29,7 +29,7 @@ User settings in recipe *Required settings (scripts)* - * shapefile: path to the user provided shapefile. A relative path is relative to the auxiliary_data_dir as configured in config-user.yml. + * shapefile: path to the user provided shapefile. A relative path is relative to the :ref:`configuration option ` ``auxiliary_data_dir``. * weighting_method: the preferred weighting method 'mean_inside' - mean of all grid points inside polygon; 'representative' - one point inside or close to the polygon is used to represent the complete area. diff --git a/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst b/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst index 3c7fa86a3a..4faa05c2a9 100644 --- a/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst +++ b/doc/sphinx/source/recipes/recipe_wenzel14jgr.rst @@ -28,8 +28,8 @@ User settings .. note:: - Make sure to run this recipe setting ``max_parallel_tasks: 1`` in the ``config_user.yml`` - file or using the CLI flag ``--max_parallel_tasks=1``. + Make sure to run this recipe with the :ref:`configuration option + ` ``max_parallel_tasks: 1``. User setting files (cfg files) are stored in nml/cfg_carbon/ diff --git a/doc/sphinx/source/recipes/recipe_wenzel16nat.rst b/doc/sphinx/source/recipes/recipe_wenzel16nat.rst index 03bb822545..a661844e70 100644 --- a/doc/sphinx/source/recipes/recipe_wenzel16nat.rst +++ b/doc/sphinx/source/recipes/recipe_wenzel16nat.rst @@ -35,9 +35,8 @@ User settings .. note:: - Make sure to run this recipe setting ``output_file_type: pdf`` in the ``config_user.yml`` - file or using the CLI flag ``--output_file_type=pdf``. - + Make sure to run this recipe with the :ref:`configuration option + ` ``max_parallel_tasks: 1``. #. Script carbon_beta.ncl @@ -58,7 +57,7 @@ User settings none -#. Script carbon_co2_cycle.ncl +#. Script carbon_co2_cycle.ncl *Required Settings (scripts)* @@ -72,7 +71,7 @@ User settings *Required settings (variables)* - * reference_dataset: name of reference datatset (observations) + * reference_dataset: name of reference dataset (observations) *Optional settings (variables)* @@ -102,15 +101,15 @@ Example plots ------------- .. figure:: /recipes/figures/wenzel16nat/fig_1.png - :width: 12 cm + :width: 12 cm :align: center - + Comparison of CO\ :sub:`2` seasonal amplitudes for CMIP5 historical simulations and observations showing annual mean atmospheric CO\ :sub:`2` versus the amplitudes of the CO\ :sub:`2` seasonal cycle at Pt. Barrow, Alaska (produced with carbon_co2_cycle.ncl, similar to Fig. 1a from Wenzel et al. (2016)). - + .. figure:: /recipes/figures/wenzel16nat/fig_2.png - :width: 12 cm + :width: 12 cm :align: center - + Barchart showing the gradient of the linear correlations for the comparison of CO\ :sub:`2` seasonal amplitudes for CMIP5 historical for at Pt. Barrow, Alaska (produced with carbon_co2_cycle.ncl, similar to Fig. 1b from Wenzel et al. (2016)). .. figure:: /recipes/figures/wenzel16nat/fig_3.png diff --git a/doc/sphinx/source/utils.rst b/doc/sphinx/source/utils.rst index 49c3df7aef..536b78ebee 100644 --- a/doc/sphinx/source/utils.rst +++ b/doc/sphinx/source/utils.rst @@ -135,10 +135,11 @@ This suite is configured to work with versions of cylc older than 8.0.0 . To prepare for using this tool: #. Log in to a system that uses `slurm `_ -#. Make sure the required CMIP and observational datasets are available and configured in config-user.yml +#. Make sure the required CMIP and observational datasets are available and + their ``rootpath`` and ``drs`` is properly set up in the :ref:`configuration + ` #. Make sure the required auxiliary data is available (see :ref:`recipe documentation `) #. Install ESMValTool -#. Update config-user.yml so it points to the right data locations Next, get started with `cylc `_: @@ -181,7 +182,7 @@ The following parameters have to be set in the script in order to make it run: Optionally, the following parameters can be edited: -* ``config_file``, *str*: Path to ``config-user.yml`` if default ``~/.esmvaltool/config-user.yml`` not used. +* ``config_dir``, *str*: Path to :ref:`configuration directory `, by default ``~/.config/esmvaltool/``. * ``partition``, *str*: Name of the DKRZ partition used to run jobs. Default is ``interactive`` to minimize computing cost compared to ``compute`` for which nodes cannot be shared. * ``memory``, *str*: Amount of memory requested for each run. Default is ``64G`` to allow to run 4 recipes on the same node in parallel. * ``time``, *str*: Time limit. Default is ``04:00:00`` to increase the job priority. Jobs can run for up to 8 hours and 12 hours on the compute and interactive partitions, respectively. @@ -230,7 +231,7 @@ script as well as a list of all available recipes. To generate the list, run the for recipe in $(esmvaltool recipes list | grep '\.yml$'); do echo $(basename "$recipe"); done > all_recipes.txt -To keep the script execution fast, it is recommended to use ``log_level: info`` in your config-user.yml file so that SLURM +To keep the script execution fast, it is recommended to use ``log_level: info`` in the configuration so that SLURM output files are rather small. .. _overview_page: diff --git a/esmvaltool/cmorizers/data/cmorizer.py b/esmvaltool/cmorizers/data/cmorizer.py index 16b7666350..5e66b7a70f 100755 --- a/esmvaltool/cmorizers/data/cmorizer.py +++ b/esmvaltool/cmorizers/data/cmorizer.py @@ -10,6 +10,7 @@ import os import shutil import subprocess +import warnings from pathlib import Path import esmvalcore @@ -18,13 +19,14 @@ from esmvalcore.config import CFG from esmvalcore.config._logging import configure_logging +from esmvaltool import ESMValToolDeprecationWarning from esmvaltool.cmorizers.data.utilities import read_cmor_config logger = logging.getLogger(__name__) datasets_file = os.path.join(os.path.dirname(__file__), 'datasets.yml') -class Formatter(): +class _Formatter(): """ Class to manage the download and formatting of datasets. @@ -39,26 +41,40 @@ def __init__(self, info): self.datasets_info = info self.config = '' - def start(self, command, datasets, config_file, options): + def start(self, command, datasets, config_file, config_dir, options): """Read configuration and set up formatter for data processing. Parameters ---------- command: str - Name of the command to execute + Name of the command to execute. datasets: str - List of datasets to process, comma separated + List of datasets to process, comma separated. config_file: str - Config file to use + Config file to use. Option will be removed in v2.14.0. + config_dir: str + Config directory to use. options: dict() - Extra options to overwrite config user file + Extra options to overwrite configuration. + """ if isinstance(datasets, str): self.datasets = datasets.split(',') else: self.datasets = datasets - CFG.load_from_file(config_file) + if config_file is not None: # remove in v2.14.0 + CFG.load_from_file(config_file) + elif config_dir is not None: + config_dir = Path( + os.path.expandvars(config_dir) + ).expanduser().absolute() + if not config_dir.is_dir(): + raise NotADirectoryError( + f"Invalid --config_dir given: {config_dir} is not an " + f"existing directory" + ) + CFG.update_from_dirs([config_dir]) CFG.update(options) self.config = CFG.start_session(f'data_{command}') @@ -199,8 +215,9 @@ def format(self, start, end, install): failed_datasets.append(dataset) if failed_datasets: - raise Exception( - f'Format failed for datasets {" ".join(failed_datasets)}') + raise RuntimeError( + f'Format failed for datasets {" ".join(failed_datasets)}' + ) @staticmethod def has_downloader(dataset): @@ -400,7 +417,7 @@ class DataCommand(): def __init__(self): with open(datasets_file, 'r', encoding='utf8') as data: self._info = yaml.safe_load(data) - self.formatter = Formatter(self._info) + self.formatter = _Formatter(self._info) def _has_downloader(self, dataset): return 'Yes' if self.formatter.has_downloader(dataset) else "No" @@ -441,28 +458,48 @@ def download(self, start=None, end=None, overwrite=False, + config_dir=None, **kwargs): """Download datasets. Parameters ---------- - datasets : list(str) + datasets: list(str) List of datasets to format - config_file : str, optional - Path to ESMValTool's config user file, by default None - start : str, optional + config_file: str, optional + Path to ESMValTool's config user file, by default None. + + .. deprecated:: 2.12.0 + This option has been deprecated in ESMValTool version 2.12.0 + and is scheduled for removal in version 2.14.0. Please use the + option `config_dir` instead. + start: str, optional Start of the interval to process, by default None. Valid formats are YYYY, YYYYMM and YYYYMMDD. - end : str, optional + end: str, optional End of the interval to process, by default None. Valid formats are YYYY, YYYYMM and YYYYMMDD. - overwrite : bool, optional + overwrite: bool, optional If true, download already present data again + config_dir: str, optional + Path to additional ESMValTool configuration directory. See + :ref:`esmvalcore:config_yaml_files` for details. + """ + if config_file is not None: + msg = ( + "The option `config_file` has been deprecated in ESMValTool " + "version 2.12.0 and is scheduled for removal in version " + "2.14.0. Please use the option ``config_dir`` instead." + ) + warnings.warn(msg, ESMValToolDeprecationWarning) + start = self._parse_date(start) end = self._parse_date(end) - self.formatter.start('download', datasets, config_file, kwargs) + self.formatter.start( + 'download', datasets, config_file, config_dir, kwargs + ) self.formatter.download(start, end, overwrite) def format(self, @@ -471,6 +508,7 @@ def format(self, start=None, end=None, install=False, + config_dir=None, **kwargs): """Format datasets. @@ -480,6 +518,11 @@ def format(self, List of datasets to format config_file : str, optional Path to ESMValTool's config user file, by default None + + .. deprecated:: 2.12.0 + This option has been deprecated in ESMValTool version 2.12.0 + and is scheduled for removal in version 2.14.0. Please use the + option `config_dir` instead. start : str, optional Start of the interval to process, by default None. Valid formats are YYYY, YYYYMM and YYYYMMDD. @@ -488,11 +531,25 @@ def format(self, are YYYY, YYYYMM and YYYYMMDD. install : bool, optional If true, move processed data to the folder, by default False + config_dir: str, optional + Path to additional ESMValTool configuration directory. See + :ref:`esmvalcore:config_yaml_files` for details. + """ + if config_file is not None: + msg = ( + "The option `config_file` has been deprecated in ESMValTool " + "version 2.12.0 and is scheduled for removal in version " + "2.14.0. Please use the option ``config_dir`` instead." + ) + warnings.warn(msg, ESMValToolDeprecationWarning) + start = self._parse_date(start) end = self._parse_date(end) - self.formatter.start('formatting', datasets, config_file, kwargs) + self.formatter.start( + 'formatting', datasets, config_file, config_dir, kwargs + ) self.formatter.format(start, end, install) def prepare(self, @@ -502,6 +559,7 @@ def prepare(self, end=None, overwrite=False, install=False, + config_dir=None, **kwargs): """Download and format a set of datasets. @@ -511,6 +569,11 @@ def prepare(self, List of datasets to format config_file : str, optional Path to ESMValTool's config user file, by default None + + .. deprecated:: 2.12.0 + This option has been deprecated in ESMValTool version 2.12.0 + and is scheduled for removal in version 2.14.0. Please use the + option `config_dir` instead. start : str, optional Start of the interval to process, by default None. Valid formats are YYYY, YYYYMM and YYYYMMDD. @@ -521,11 +584,25 @@ def prepare(self, If true, move processed data to the folder, by default False overwrite : bool, optional If true, download already present data again + config_dir: str, optional + Path to additional ESMValTool configuration directory. See + :ref:`esmvalcore:config_yaml_files` for details. + """ + if config_file is not None: + msg = ( + "The option `config_file` has been deprecated in ESMValTool " + "version 2.12.0 and is scheduled for removal in version " + "2.14.0. Please use the option ``config_dir`` instead." + ) + warnings.warn(msg, ESMValToolDeprecationWarning) + start = self._parse_date(start) end = self._parse_date(end) - self.formatter.start('preparation', datasets, config_file, kwargs) + self.formatter.start( + 'preparation', datasets, config_file, config_dir, kwargs + ) if self.formatter.download(start, end, overwrite): self.formatter.format(start, end, install) else: diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index 508b18ccec..cda27910bd 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -17,16 +17,16 @@ datasets: analyses covering analysis of monthly rainfall. The dataset provides consistent temporal and spatial analyses across Australia for each observed data variable. This accounts for spatial and temporal gaps in observations. Where possible, the gridded analysis techniques provide useful estimates in data-sparse regions - such as central Australia. - + such as central Australia. + Time coverage: Site-based data are used to provide gridded climate data at the monthly timescale for rainfall (1900+). Reference: Evans, A., Jones, D.A., Smalley, R., and Lellyett, S. 2020. An enhanced gridded rainfall analysis scheme for Australia. Bureau of Meteorology Research Report. No. 41. National Computational Infrastructure (NCI) - Catalogue Record: http://dx.doi.org/10.25914/6009600786063. - Data from NCI (National Computing Infrastructure Australia https://nci.org.au/), + Data from NCI (National Computing Infrastructure Australia https://nci.org.au/), requires an NCI account and access to Gadi(Supercomputer in Canberra) and the project found in catalogue record. Access can be requested through NCI. NCI is an ESGF node (https://esgf.nci.org.au/projects/esgf-nci/) - + ANUClimate: tier: 3 source: "https://dx.doi.org/10.25914/60a10aa56dd1b" @@ -35,7 +35,7 @@ datasets: Data from NCI project requiring an NCI account and access to GADI ANUClimate 2.0 consists of gridded daily and monthly climate variables across the terrestrial landmass of Australia - from at least 1970 to the present. Rainfall grids are generated from 1900 to the present. The underpinning spatial + from at least 1970 to the present. Rainfall grids are generated from 1900 to the present. The underpinning spatial models have been developed at the Fenner School of Environment and Society of the Australian National University. APHRO-MA: @@ -301,7 +301,7 @@ datasets: last_access: 2020-03-23 info: | Create a new empty directory ``$RAWOBSPATH/Tier2/CT2019`` (where - ``$RAWOBSPATH`` is given by your user configuration file) where the raw + ``$RAWOBSPATH`` is given by your configuration) where the raw data will be stored. The download of the data is automatically handled by this script. If data is already present in this directory, the download is skipped (to force a new download delete your old files). @@ -479,11 +479,11 @@ datasets: Download and processing instructions: Use the following CLI to download all the files: esmvaltool data download ESACCI-LANDCOVER - The underlying downloader is located here: + The underlying downloader is located here: /ESMValTool/esmvaltool/cmorizers/data/downloaders/datasets/esacci_landcover.py - and it will download all the files currently available on CEDA (1992-2020) + and it will download all the files currently available on CEDA (1992-2020) under a single directory as follow: ${RAWOBS}/Tier2/ESACCI-LANDCOVER - + ESACCI-LST: tier: 2 source: On CEDA-JASMIN, /gws/nopw/j04/esacci_lst/public @@ -554,7 +554,7 @@ datasets: source: https://wui.cmsaf.eu/safira/action/viewDoiDetails?acronym=COMBI_V001 last_access: 2024-02-21 info: | - CDR2 requires registration at EUMETSAT CM SAF, the information on how to + CDR2 requires registration at EUMETSAT CM SAF, the information on how to download the order will be emailed once the order is ready. All files need to be in one directory, not in yearly subdirectories. @@ -903,11 +903,11 @@ datasets: Select "Data Access" -> "Subset/Get Data" -> "Get Data" and follow the "Instructions for downloading". All *.he5 files need to be saved in the $RAWOBS/Tier3/MLS-AURA directory, where $RAWOBS refers to the RAWOBS - directory defined in the user configuration file. Apply this procedure to - both links provided above. The temperature fields are necessary for quality + directory defined in the configuration. Apply this procedure to both + links provided above. The temperature fields are necessary for quality control of the RHI data (see Data Quality Document for MLS-AURA for more information). - A registration is required + A registration is required. MOBO-DIC_MPIM: tier: 2 @@ -1078,7 +1078,7 @@ datasets: last_access: 2023-12-04 info: | Download the following files: - ersst.yyyymm.nc + ersst.yyyymm.nc for years 1854 to 2020 NOAA-ERSSTv5: @@ -1087,7 +1087,7 @@ datasets: last_access: 2023-12-04 info: | Download the following files: - ersst.v5.yyyymm.nc + ersst.v5.yyyymm.nc for years 1854 onwards NOAAGlobalTemp: @@ -1114,13 +1114,13 @@ datasets: Download daily data from: https://nsidc.org/data/NSIDC-0116 Login required for download, and also requires citation only to use - + NSIDC-G02202-sh: tier: 3 source: https://polarwatch.noaa.gov/erddap/griddap/nsidcG02202v4shmday last_access: 2023-05-13 info: | - Download monthly data. + Download monthly data. Login required for download, and also requires citation only to use OceanSODA-ETHZ: diff --git a/esmvaltool/cmorizers/data/download_scripts/download_era_interim.py b/esmvaltool/cmorizers/data/download_scripts/download_era_interim.py index 72cf8d98af..374c750ef6 100644 --- a/esmvaltool/cmorizers/data/download_scripts/download_era_interim.py +++ b/esmvaltool/cmorizers/data/download_scripts/download_era_interim.py @@ -12,8 +12,13 @@ 4. Copy/paste the text in https://api.ecmwf.int/v1/key/ into a blank text file and save it as $HOME/.ecmwfapirc -5. Use ESMValCore/esmvalcore/config-user.yml as an template -and set the rootpath of the output directory in RAWOBS +5. Copy the default configuration file with + +```bash +esmvaltool config get_config_user --path=config-user.yml +``` + +and set the ``rootpath`` for the RAWOBS project. 6. Check the description of the variables at https://apps.ecmwf.int/codes/grib/param-db diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/jra_55.py b/esmvaltool/cmorizers/data/downloaders/datasets/jra_55.py index a5dc5b851c..7a9e374136 100644 --- a/esmvaltool/cmorizers/data/downloaders/datasets/jra_55.py +++ b/esmvaltool/cmorizers/data/downloaders/datasets/jra_55.py @@ -1,14 +1,12 @@ """Script to download JRA-55 from RDA.""" import logging import os - from datetime import datetime from dateutil import relativedelta from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader - logger = logging.getLogger(__name__) diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/noaa_ersstv3b.py b/esmvaltool/cmorizers/data/downloaders/datasets/noaa_ersstv3b.py index 0ac6a3e012..5a54080be4 100644 --- a/esmvaltool/cmorizers/data/downloaders/datasets/noaa_ersstv3b.py +++ b/esmvaltool/cmorizers/data/downloaders/datasets/noaa_ersstv3b.py @@ -1,6 +1,7 @@ """Script to download NOAA-ERSST-v3b.""" import logging from datetime import datetime + from dateutil import relativedelta from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/noaa_ersstv5.py b/esmvaltool/cmorizers/data/downloaders/datasets/noaa_ersstv5.py index f995f9d2c7..7dbeccfe12 100644 --- a/esmvaltool/cmorizers/data/downloaders/datasets/noaa_ersstv5.py +++ b/esmvaltool/cmorizers/data/downloaders/datasets/noaa_ersstv5.py @@ -1,6 +1,7 @@ """Script to download NOAA-ERSST-V5.""" import logging from datetime import datetime + from dateutil import relativedelta from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/nsidc_g02202_sh.py b/esmvaltool/cmorizers/data/downloaders/datasets/nsidc_g02202_sh.py index 798decda96..8c3c02c410 100644 --- a/esmvaltool/cmorizers/data/downloaders/datasets/nsidc_g02202_sh.py +++ b/esmvaltool/cmorizers/data/downloaders/datasets/nsidc_g02202_sh.py @@ -1,6 +1,7 @@ """Script to download NSIDC-G02202-sh.""" import logging from datetime import datetime + from dateutil import relativedelta from esmvaltool.cmorizers.data.downloaders.wget import WGetDownloader diff --git a/esmvaltool/cmorizers/data/formatters/datasets/ct2019.py b/esmvaltool/cmorizers/data/formatters/datasets/ct2019.py index 33f56f234d..64f64f4e82 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/ct2019.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/ct2019.py @@ -11,7 +11,7 @@ Download and processing instructions Create a new empty directory ``$RAWOBSPATH/Tier2/CT2019`` (where - ``$RAWOBSPATH`` is given by your user configuration file) where the raw + ``$RAWOBSPATH`` is given in the configuration) where the raw data will be stored. The download of the data is automatically handled by this script. If data is already present in this directory, the download is skipped (to force a new download delete your old files). diff --git a/esmvaltool/cmorizers/data/formatters/datasets/merra.ncl b/esmvaltool/cmorizers/data/formatters/datasets/merra.ncl index b57bca6a09..d9fbf761df 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/merra.ncl +++ b/esmvaltool/cmorizers/data/formatters/datasets/merra.ncl @@ -14,7 +14,7 @@ ; Download and processing instructions ; (requires EarthData login; see https://urs.earthdata.nasa.gov/) ; Use ESMValTool automatic download: -; esmvaltool data download --config_file MERRA +; esmvaltool data download MERRA ; ; Modification history ; 20230818-lauer_axel: added output of clwvi (iwp + lwp) @@ -209,7 +209,7 @@ begin delete(tmp) - ; calcuation of outgoing fluxes: out = in - net + ; calculation of outgoing fluxes: out = in - net if ((VAR(vv) .eq. "rsut") .or. (VAR(vv) .eq. "rsutcs")) then tmp = f->SWTDN if (isatt(tmp, "scale_factor") .or. isatt(tmp, "add_offset")) then @@ -220,7 +220,8 @@ begin delete(tmp) end if - ; calcuation of total precipitation flux = large-scale+convective+anvil + ; calculation of total precipitation flux = + ; large-scale+convective+anvil if (VAR(vv) .eq. "pr") then tmp = f->PRECCON ; surface precipitation flux from convection if (isatt(tmp, "scale_factor") .or. isatt(tmp, "add_offset")) then diff --git a/esmvaltool/cmorizers/data/formatters/datasets/mls_aura.py b/esmvaltool/cmorizers/data/formatters/datasets/mls_aura.py index 5b500e9087..0a5031b243 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/mls_aura.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/mls_aura.py @@ -14,7 +14,7 @@ Select "Data Access" -> "Subset/Get Data" -> "Get Data" and follow the "Instructions for downloading". All *.he5 files need to be saved in the $RAWOBS/Tier3/MLS-AURA directory, where $RAWOBS refers to the RAWOBS - directory defined in the user configuration file. Apply this procedure to + directory defined in the configuration. Apply this procedure to both links provided above. The temperature fields are necessary for quality control of the RHI data (see Data Quality Document for MLS-AURA for more information). diff --git a/esmvaltool/diag_scripts/kcs/local_resampling.py b/esmvaltool/diag_scripts/kcs/local_resampling.py index 9eb2ea28ed..0bf6260d65 100644 --- a/esmvaltool/diag_scripts/kcs/local_resampling.py +++ b/esmvaltool/diag_scripts/kcs/local_resampling.py @@ -292,7 +292,7 @@ def select_final_subset(cfg, subsets, prov=None): Final set of eight samples should have with minimal reuse of the same ensemble member for the same period. From 10.000 randomly - selected sets of 8 samples, count and penalize re-used segments (1 + selected sets of 8 samples, count and penalize reused segments (1 for 3*reuse, 5 for 4*reuse). Choose the set with the lowest penalty. """ n_samples = cfg['n_samples'] @@ -387,7 +387,7 @@ def _get_climatology(cfg, scenario_name, table, prov=None): resampled_control = _recombine(segments_control, table['control']) resampled_future = _recombine(segments_future, table['future']) - # Store the resampled contol climates + # Store the resampled control climates filename = get_diagnostic_filename(f'resampled_control_{scenario_name}', cfg, extension='nc') diff --git a/esmvaltool/diag_scripts/monitor/compute_eofs.py b/esmvaltool/diag_scripts/monitor/compute_eofs.py index dea5d63b9a..a07ca835c0 100644 --- a/esmvaltool/diag_scripts/monitor/compute_eofs.py +++ b/esmvaltool/diag_scripts/monitor/compute_eofs.py @@ -24,10 +24,10 @@ Path to the folder to store figures. Defaults to ``{plot_dir}/../../{dataset}/{exp}/{modeling_realm}/{real_name}``. All tags (i.e., the entries in curly brackets, e.g., ``{dataset}``, are - replaced with the corresponding tags). ``{plot_dir}`` is replaced with the + replaced with the corresponding tags). ``{plot_dir}`` is replaced with the default ESMValTool plot directory (i.e., ``output_dir/plots/diagnostic_name/script_name/``, see - :ref:`esmvalcore:user configuration file`). + :ref:`esmvalcore:outputdata`). rasterize_maps: bool, optional (default: True) If ``True``, use `rasterization `_ for diff --git a/esmvaltool/diag_scripts/monitor/monitor.py b/esmvaltool/diag_scripts/monitor/monitor.py index 59e37b9842..dda5aa4f3d 100644 --- a/esmvaltool/diag_scripts/monitor/monitor.py +++ b/esmvaltool/diag_scripts/monitor/monitor.py @@ -52,10 +52,10 @@ Path to the folder to store figures. Defaults to ``{plot_dir}/../../{dataset}/{exp}/{modeling_realm}/{real_name}``. All tags (i.e., the entries in curly brackets, e.g., ``{dataset}``, are - replaced with the corresponding tags). ``{plot_dir}`` is replaced with the + replaced with the corresponding tags). ``{plot_dir}`` is replaced with the default ESMValTool plot directory (i.e., ``output_dir/plots/diagnostic_name/script_name/``, see - :ref:`esmvalcore:user configuration file`). + :ref:`esmvalcore:outputdata`). rasterize_maps: bool, optional (default: True) If ``True``, use `rasterization `_ for diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index 879346954c..32f654b3b6 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -100,10 +100,10 @@ Path to the folder to store figures. Defaults to ``{plot_dir}/../../{dataset}/{exp}/{modeling_realm}/{real_name}``. All tags (i.e., the entries in curly brackets, e.g., ``{dataset}``, are - replaced with the corresponding tags). ``{plot_dir}`` is replaced with the + replaced with the corresponding tags). ``{plot_dir}`` is replaced with the default ESMValTool plot directory (i.e., ``output_dir/plots/diagnostic_name/script_name/``, see - :ref:`esmvalcore:user configuration file`). + :ref:`esmvalcore:outputdata`). savefig_kwargs: dict, optional Optional keyword arguments for :func:`matplotlib.pyplot.savefig`. By default, uses ``bbox_inches: tight, dpi: 300, orientation: landscape``. diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl index bd672ed3cf..0f1b49c224 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6a.ncl @@ -151,10 +151,8 @@ begin fx_variable = "volcello" error_msg("f", "russell18jgr-fig6.ncl", " ", "volcello file for " \ + vo_datasets(iii) \ - + " not found in the metadata file, please add "\ - + "'fx_files: [volcello]' to the variable dictionary in the " \ - + "recipe or add the location of file to input directory " \ - + "in config-user.yml ") + + " not found in the metadata file, please specify " \ + + "'volcello' as supplementary variable in the recipe.") end if dataset_so_time = read_data(so_items[iii]) diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl index 6b019625f0..71323f411d 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig6b.ncl @@ -45,10 +45,10 @@ ; ; Caveats ; -; - MIROC-ESM and BNU-ESM doesnot work as depth variable is not called lev. -; - MRI_ESM1 doesnot work as the data is ofset by 80 degrees in longitude +; - MIROC-ESM and BNU-ESM does not work as depth variable is not called lev. +; - MRI_ESM1 does not work as the data is offset by 80 degrees in longitude ; and causes problem in interpolation. -; - CCSM4 ans CESM1-CAM5 dont work as the units for so is 1, not accepted +; - CCSM4 and CESM1-CAM5 dont work as the units for so is 1, not accepted ; by ESMValTool. ; - Transport is very small in case of NorESM1-M and ME as volcello ; values look incorrect(very small). @@ -153,11 +153,10 @@ begin if (all(ismissing(fx_var))) then fx_variable = "volcello" - error_msg("f", "russell_fig-7i.ncl", " ", "areacello file for " + \ + error_msg("f", "russell_fig-7i.ncl", " ", "volcello file for " + \ vo_datasets(iii) \ - + " not found in the metadata file, please " + \ - "add 'fx_files: [volcello]' to the variable dictionary in" + \ - " the recipe or add the location of file to config-user.yml") + + " not found in the metadata file, please specify " \ + + "'volcello' as supplementary variable in the recipe.") end if dataset_so_time = read_data(so_items[iii]) diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl index 86ce4bee70..cf14857a7b 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig7i.ncl @@ -156,9 +156,8 @@ begin fx_variable = "areacello" error_msg("f", "russell_fig-7i.ncl", " ", "areacello file for " + \ datasetnames(iii) + " not found in the metadata file," + \ - " please add 'fx_files: [areacello]' to the variable " + \ - "dictionary in the recipe or add the location of " + \ - " file to config-user.yml") + + " not found in the metadata file, please specify " \ + + "'areacello' as supplementary variable in the recipe.") end if areacello_2d = fx_var delete(fx_var) @@ -212,9 +211,9 @@ begin "lgPerimOn" : False ; no perimeter "lgItemCount" : dimsizes(annots) ; how many "lgLineLabelStrings" : annots ; labels - "lgLabelsOn" : False ; no default lables + "lgLabelsOn" : False ; no default labsels "lgLineLabelFontHeightF" : 0.0085 ; font height - "lgDashIndexes" : dashes ; line paterns + "lgDashIndexes" : dashes ; line patterns "lgLineColors" : colors "lgMonoLineLabelFontColor" : True ; one label color end create diff --git a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl index 2fe0cc3e4a..017b70103a 100644 --- a/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl +++ b/esmvaltool/diag_scripts/russell18jgr/russell18jgr-fig9c.ncl @@ -227,9 +227,8 @@ begin if (all(ismissing(fx_var))) then error_msg("f", "russell18jgr-fig9c.ncl", " ", "areacello file for " + \ datasetnames(iii) + " not found in the metadata file, " + \ - "please add 'fx_files: [areacello]' to the variable " + \ - "dictionary in the recipe or add the location of " + \ - " file to config-user.yml ") + + " not found in the metadata file, please specify " \ + + "'areacello' as supplementary variable in the recipe.") end if areacello_2d = fx_var @@ -304,9 +303,9 @@ begin "lgPerimOn" : False ; no perimeter "lgItemCount" : dimsizes(annots) ; how many "lgLabelStrings" : annots ; labels - "lgLabelsOn" : True ; no default lables + "lgLabelsOn" : True ; no default labels "lgLabelFontHeightF" : 0.001 ; font height - "lgItemType" : "markers" ; line paterns + "lgItemType" : "markers" ; line patterns "lgMarkerColors" : colors "lgMarkerIndexes" : markers ; one label color end create diff --git a/esmvaltool/interface_scripts/logging.ncl b/esmvaltool/interface_scripts/logging.ncl index 6333479f96..35c3167341 100644 --- a/esmvaltool/interface_scripts/logging.ncl +++ b/esmvaltool/interface_scripts/logging.ncl @@ -61,9 +61,9 @@ procedure log_debug(output_string[*]:string) ; output_string: the text to be output as message on screen ; ; Description -; Write a debug message to the log file (only if log_level = debug in -; config-user.yml). If the input is an array, each element will be -; written on different lines. +; Write a debug message to the log file (only if log_level = debug in the +; configuration). If the input is an array, each element will be written on +; different lines. ; ; Caveats ; diff --git a/esmvaltool/recipes/examples/recipe_extract_shape.yml b/esmvaltool/recipes/examples/recipe_extract_shape.yml index 79f04371b5..08d1bab490 100644 --- a/esmvaltool/recipes/examples/recipe_extract_shape.yml +++ b/esmvaltool/recipes/examples/recipe_extract_shape.yml @@ -7,7 +7,7 @@ documentation: The example shapefile(s) can be copied from esmvaltool/diag_scripts/shapeselect/testdata/Elbe.* and - placed in the auxiliary_data_dir defined in config-user.yml. + placed in the auxiliary_data_dir defined in the configuration. title: Example recipe extracting precipitation in the Elbe catchment. diff --git a/esmvaltool/recipes/hydrology/recipe_hydro_forcing.yml b/esmvaltool/recipes/hydrology/recipe_hydro_forcing.yml index f68a597733..925d9bd420 100644 --- a/esmvaltool/recipes/hydrology/recipe_hydro_forcing.yml +++ b/esmvaltool/recipes/hydrology/recipe_hydro_forcing.yml @@ -9,7 +9,7 @@ documentation: used to: 1. Plot a timeseries of the raw daily data - 2. Plot monthly aggregrated data over a certain period + 2. Plot monthly aggregated data over a certain period 3. Plot the monthly climate statistics over a certain period authors: @@ -33,7 +33,7 @@ datasets: preprocessors: daily: extract_shape: &extract_shape - # In aux (config-user.yml) + # Relative to auxiliary_data_dir defined in configuration shapefile: Lorentz_Basin_Shapefiles/Meuse/Meuse.shp method: contains crop: true diff --git a/esmvaltool/recipes/hydrology/recipe_lisflood.yml b/esmvaltool/recipes/hydrology/recipe_lisflood.yml index ffecbc37be..3acb4be481 100644 --- a/esmvaltool/recipes/hydrology/recipe_lisflood.yml +++ b/esmvaltool/recipes/hydrology/recipe_lisflood.yml @@ -37,7 +37,8 @@ preprocessors: scheme: linear extract_shape: # Perhaps a single shapefile needs to be created covering multiple basins - shapefile: Lorentz_Basin_Shapefiles/Meuse/Meuse.shp # (config-user, aux) + # Relative to auxiliary_data_dir defined in configuration + shapefile: Lorentz_Basin_Shapefiles/Meuse/Meuse.shp method: contains crop: true # set to false to keep the entire globe (memory intensive!) daily_water: diff --git a/esmvaltool/recipes/hydrology/recipe_marrmot.yml b/esmvaltool/recipes/hydrology/recipe_marrmot.yml index dd6eef0a49..e85a66d9b9 100644 --- a/esmvaltool/recipes/hydrology/recipe_marrmot.yml +++ b/esmvaltool/recipes/hydrology/recipe_marrmot.yml @@ -28,7 +28,8 @@ preprocessors: daily: &daily extract_shape: # Lumped model: needs catchment-aggregated input data - shapefile: Meuse/Meuse.shp # In aux (config-user.yml) + # Relative to auxiliary_data_dir defined in configuration + shapefile: Meuse/Meuse.shp method: contains crop: true diff --git a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml index 20b0402a23..55c53147ec 100644 --- a/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml +++ b/esmvaltool/recipes/ipccwg1ar6ch3/recipe_ipccwg1ar6ch3_fig_3_42_a.yml @@ -10,7 +10,7 @@ documentation: Contribution to the Sixth Assessment Report: Chapter 3 Processing of CMIP3 models currently works only in serial mode, due to an issue in the input data still under investigation. To run the recipe - set: max_parallel_tasks: 1 in the config-user.yml file. + set the configuration option ``max_parallel_tasks: 1``. authors: - bock_lisa diff --git a/esmvaltool/recipes/recipe_carvalhais14nat.yml b/esmvaltool/recipes/recipe_carvalhais14nat.yml index 9ec0811c00..63bfbb1edd 100644 --- a/esmvaltool/recipes/recipe_carvalhais14nat.yml +++ b/esmvaltool/recipes/recipe_carvalhais14nat.yml @@ -8,7 +8,7 @@ documentation: Carvalhais et al., 2014, Nature. The data required in the obs_details section can be obtained at http://www.bgc-jena.mpg.de/geodb/BGI/tau4ESMValTool.php - and have to be stored in the auxiliary_data_dir defined i config-user.yml, + and have to be stored in the auxiliary_data_dir defined in the configuration in a subdirectory obs_data_subdir specified in the obs_details section below. diff --git a/esmvaltool/recipes/recipe_runoff_et.yml b/esmvaltool/recipes/recipe_runoff_et.yml index 6924321c7c..0a83213caa 100644 --- a/esmvaltool/recipes/recipe_runoff_et.yml +++ b/esmvaltool/recipes/recipe_runoff_et.yml @@ -8,7 +8,7 @@ documentation: water balance components for different catchments and compares the results against observations. Currently, the required catchment mask needs to be downloaded manually at https://doi.org/10.5281/zenodo.2025776 and saved in - the auxiliary_data_dir defined in config-user.yml. + the auxiliary_data_dir defined in configuration. authors: - hagemann_stefan diff --git a/esmvaltool/recipes/recipe_sea_surface_salinity.yml b/esmvaltool/recipes/recipe_sea_surface_salinity.yml index 4e670eec7f..43ec0e6b5e 100644 --- a/esmvaltool/recipes/recipe_sea_surface_salinity.yml +++ b/esmvaltool/recipes/recipe_sea_surface_salinity.yml @@ -20,8 +20,7 @@ documentation: preprocessors: timeseries: extract_shape: - # Relative paths are relative to 'auxiliary_data_dir' as configured in - # the config-user.yml file. + # Relative paths are relative to the configuration option 'auxiliary_data_dir'. # The example shapefile can be downloaded from # https://marineregions.org/download_file.php?name=World_Seas_IHO_v3.zip # but any shapefile can be used @@ -50,7 +49,7 @@ datasets: - {<<: *cmip6, dataset: MPI-ESM1-2-HR, alias: MPI-ESM1-2-HR} - {<<: *cmip6, dataset: NorESM2-MM, alias: NorESM2-MM} - {<<: *cmip6, dataset: GISS-E2-2-H, alias: GISS-E2-2-H, institute: NASA-GISS} - + diagnostics: compare_salinity: diff --git a/esmvaltool/recipes/recipe_shapeselect.yml b/esmvaltool/recipes/recipe_shapeselect.yml index 0fb22c0d5d..ee56810f03 100644 --- a/esmvaltool/recipes/recipe_shapeselect.yml +++ b/esmvaltool/recipes/recipe_shapeselect.yml @@ -36,8 +36,7 @@ diagnostics: script: shapeselect/diag_shapeselect.py # Example shapefiles can be found in: # esmvaltool/diag_scripts/shapeselect/testdata/ - # Relative paths are relative to 'auxiliary_data_dir' as configured in - # the config-user.yml file. + # Relative paths are relative to configuration option 'auxiliary_data_dir'. shapefile: 'Thames.shp' weighting_method: 'mean_inside' write_xlsx: true diff --git a/esmvaltool/utils/batch-jobs/generate.py b/esmvaltool/utils/batch-jobs/generate.py index d1ceeffaa0..428229b6eb 100644 --- a/esmvaltool/utils/batch-jobs/generate.py +++ b/esmvaltool/utils/batch-jobs/generate.py @@ -9,7 +9,7 @@ - conda_path 2) If needed, edit optional parameters: - outputs -- config_file +- config_dir 3) SLURM settings This script is configured to optimize the computing footprint of the recipe testing. It is not necessary to edit @@ -49,11 +49,11 @@ # Full path to the miniforge3/etc/profile.d/conda.sh executable # Set the path to conda conda_path = 'PATH_TO/miniforge3/etc/profile.d/conda.sh' -# Full path to config_file -# If none, ~/.esmvaltool/config-user.yml is used -config_file = '' +# Full path to configuration directory +# If none, ~/.config/esmvaltool/ +config_dir = '' # Set max_parallel_tasks -# If none, read from config_file +# If none, read from configuration default_max_parallel_tasks = 8 # List of recipes that require non-default SLURM options set above @@ -315,11 +315,11 @@ def generate_submit(): file.write(f'. {conda_path}\n') file.write(f'conda activate {env}\n') file.write('\n') - if not config_file: + if not config_dir: file.write(f'esmvaltool run {str(recipe)}') else: - file.write(f'esmvaltool run --config_file ' - f'{str(config_file)} {str(recipe)}') + file.write(f'esmvaltool run --config_dir ' + f'{str(config_dir)} {str(recipe)}') # set max_parallel_tasks max_parallel_tasks = MAX_PARALLEL_TASKS.get( recipe.stem, diff --git a/tests/integration/test_cmorizer.py b/tests/integration/test_cmorizer.py index 11bade4190..48f75b951a 100644 --- a/tests/integration/test_cmorizer.py +++ b/tests/integration/test_cmorizer.py @@ -4,6 +4,7 @@ import os import sys +import esmvalcore import iris import iris.coord_systems import iris.coords @@ -13,7 +14,9 @@ import pytest import yaml from cf_units import Unit +from packaging import version +from esmvaltool import ESMValToolDeprecationWarning from esmvaltool.cmorizers.data.cmorizer import DataCommand @@ -28,8 +31,8 @@ def keep_cwd(): os.chdir(curr_path) -def write_config_user_file(dirname): - """Replace config_user file values for testing.""" +def write_config_file(dirname): + """Replace configuration values for testing.""" config_file = dirname / 'config-user.yml' cfg = { 'output_dir': str(dirname / 'output_dir'), @@ -143,14 +146,59 @@ def arguments(*args): sys.argv = backup -def test_cmorize_obs_woa_no_data(tmp_path): +@pytest.mark.skipif( + version.parse(esmvalcore.__version__) >= version.parse("2.14.0"), + reason='ESMValCore >= v2.14.0', +) +def test_cmorize_obs_woa_no_data_config_file(tmp_path): """Test for example run of cmorize_obs command.""" + config_file = write_config_file(tmp_path) + os.makedirs(os.path.join(tmp_path, 'raw_stuff', 'Tier2')) + os.makedirs(os.path.join(tmp_path, 'output_dir')) + with keep_cwd(): + with pytest.raises(RuntimeError): + with pytest.warns(ESMValToolDeprecationWarning): + DataCommand().format('WOA', config_file=config_file) + + log_dir = os.path.join(tmp_path, 'output_dir') + log_file = os.path.join(log_dir, + os.listdir(log_dir)[0], 'run', 'main_log.txt') + check_log_file(log_file, no_data=True) + + +@pytest.mark.skipif( + version.parse(esmvalcore.__version__) >= version.parse("2.14.0"), + reason='ESMValCore >= v2.14.0', +) +def test_cmorize_obs_woa_data_config_file(tmp_path): + """Test for example run of cmorize_obs command.""" + config_file = write_config_file(tmp_path) + data_path = os.path.join(tmp_path, 'raw_stuff', 'Tier2', 'WOA') + put_dummy_data(data_path) + with keep_cwd(): + with pytest.warns(ESMValToolDeprecationWarning): + DataCommand().format('WOA', config_file=config_file) - config_user_file = write_config_user_file(tmp_path) + log_dir = os.path.join(tmp_path, 'output_dir') + log_file = os.path.join(log_dir, + os.listdir(log_dir)[0], 'run', 'main_log.txt') + check_log_file(log_file, no_data=False) + output_path = os.path.join(log_dir, os.listdir(log_dir)[0], 'Tier2', 'WOA') + check_output_exists(output_path) + check_conversion(output_path) + + +@pytest.mark.skipif( + version.parse(esmvalcore.__version__) < version.parse("2.12.0"), + reason='ESMValCore < v2.12.0', +) +def test_cmorize_obs_woa_no_data(tmp_path): + """Test for example run of cmorize_obs command.""" + write_config_file(tmp_path) os.makedirs(os.path.join(tmp_path, 'raw_stuff', 'Tier2')) with keep_cwd(): - with pytest.raises(Exception): - DataCommand().format('WOA', config_user_file) + with pytest.raises(RuntimeError): + DataCommand().format('WOA', config_dir=str(tmp_path)) log_dir = os.path.join(tmp_path, 'output_dir') log_file = os.path.join(log_dir, @@ -158,14 +206,17 @@ def test_cmorize_obs_woa_no_data(tmp_path): check_log_file(log_file, no_data=True) +@pytest.mark.skipif( + version.parse(esmvalcore.__version__) < version.parse("2.12.0"), + reason='ESMValCore < v2.12.0', +) def test_cmorize_obs_woa_data(tmp_path): """Test for example run of cmorize_obs command.""" - - config_user_file = write_config_user_file(tmp_path) + write_config_file(tmp_path) data_path = os.path.join(tmp_path, 'raw_stuff', 'Tier2', 'WOA') put_dummy_data(data_path) with keep_cwd(): - DataCommand().format('WOA', config_user_file) + DataCommand().format('WOA', config_dir=str(tmp_path)) log_dir = os.path.join(tmp_path, 'output_dir') log_file = os.path.join(log_dir, diff --git a/tests/integration/test_diagnostic_run.py b/tests/integration/test_diagnostic_run.py index b0c606f4ee..670f7088dd 100644 --- a/tests/integration/test_diagnostic_run.py +++ b/tests/integration/test_diagnostic_run.py @@ -5,12 +5,14 @@ from pathlib import Path from textwrap import dedent +import esmvalcore import pytest import yaml from esmvalcore._main import run +from packaging import version -def write_config_user_file(dirname): +def write_config_file(dirname): config_file = dirname / 'config-user.yml' cfg = { 'output_dir': str(dirname / 'output_dir'), @@ -68,10 +70,13 @@ def check(result_file): ] +@pytest.mark.skipif( + version.parse(esmvalcore.__version__) >= version.parse("2.14.0"), + reason='ESMValCore >= v2.14.0', +) @pytest.mark.installation @pytest.mark.parametrize('script_file', SCRIPTS) -def test_diagnostic_run(tmp_path, script_file): - +def test_diagnostic_run_config_file(tmp_path, script_file): local_script_file = Path(__file__).parent / script_file recipe_file = tmp_path / 'recipe_test.yml' @@ -96,12 +101,58 @@ def test_diagnostic_run(tmp_path, script_file): """.format(script_file, result_file)) recipe_file.write_text(str(recipe)) - config_user_file = write_config_user_file(tmp_path) + config_file = write_config_file(tmp_path) with arguments( 'esmvaltool', 'run', '--config_file', - config_user_file, + config_file, + str(recipe_file), + ): + run() + + check(result_file) + + +@pytest.mark.skipif( + version.parse(esmvalcore.__version__) < version.parse("2.12.0"), + reason='ESMValCore < v2.12.0', +) +@pytest.mark.installation +@pytest.mark.parametrize('script_file', SCRIPTS) +def test_diagnostic_run(tmp_path, script_file): + local_script_file = Path(__file__).parent / script_file + + recipe_file = tmp_path / 'recipe_test.yml' + script_file = tmp_path / script_file + result_file = tmp_path / 'result.yml' + config_dir = tmp_path / 'config' + config_dir.mkdir(exist_ok=True, parents=True) + + shutil.copy(local_script_file, script_file) + + # Create recipe + recipe = dedent(""" + documentation: + title: Test recipe + description: Recipe with no data. + authors: [andela_bouwe] + + diagnostics: + diagnostic_name: + scripts: + script_name: + script: {} + setting_name: {} + """.format(script_file, result_file)) + recipe_file.write_text(str(recipe)) + + write_config_file(config_dir) + with arguments( + 'esmvaltool', + 'run', + '--config_dir', + str(config_dir), str(recipe_file), ): run() From c4b8d025a0e1df4a286a017e49d03f69a2b37d7f Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Tue, 22 Oct 2024 16:08:19 +0100 Subject: [PATCH 51/87] Readthedocs configuration/builds: revert to miniconda before miniforge is available (#3785) Co-authored-by: Bouwe Andela --- .readthedocs.yaml | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 071686d373..974ac2ee78 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -7,20 +7,13 @@ version: 2 # Set the version of Python and other tools you might need build: - os: ubuntu-22.04 + os: ubuntu-lts-latest tools: - # updated and deployed from Aug 1, 2023 - python: "mambaforge-22.9" + # try miniforge3 when available? see github.com/ESMValGroup/ESMValTool/issues/3779 + # DO NOT use mambaforge-*; that is currently sunsetted + python: "miniconda-latest" jobs: - pre_create_environment: - # update mamba just in case - - mamba update --yes --quiet --name=base mamba 'zstd=1.5.2' - - mamba --version - - mamba list --name=base post_create_environment: - - conda run -n ${CONDA_DEFAULT_ENV} mamba list - # use conda run executable wrapper to have all env variables - - conda run -n ${CONDA_DEFAULT_ENV} mamba --version - conda run -n ${CONDA_DEFAULT_ENV} pip install . --no-deps # Declare the requirements required to build your docs From b86acb3af4f328ca8bef776ef6abd8ac1408b98e Mon Sep 17 00:00:00 2001 From: max-anu <137736464+max-anu@users.noreply.github.com> Date: Tue, 29 Oct 2024 07:43:44 +1100 Subject: [PATCH 52/87] Adding pr, tauu, tauv, tos to NCEP2 CMORISer (#3765) Co-authored-by: Max Proft Co-authored-by: Max Proft Co-authored-by: Romain Beucher Co-authored-by: Max Proft --- CITATION.cff | 5 +++++ doc/sphinx/source/input.rst | 2 +- .../data/cmor_config/NCEP-DOE-R2.yml | 22 +++++++++++++++++++ esmvaltool/cmorizers/data/datasets.yml | 5 +++++ .../data/downloaders/datasets/ncep_doe_r2.py | 8 +++++++ .../recipes/examples/recipe_check_obs.yml | 4 ++++ 6 files changed, 45 insertions(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index 22eb3c500e..1934c36ef1 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -275,6 +275,11 @@ authors: family-names: Phillips given-names: Adam orcid: "https://orcid.org/0000-0003-4859-8585" + - + affiliation: "ACCESS-NRI, Australia" + family-names: Proft + given-names: Max + orcid: "https://orcid.org/0009-0003-1611-9516" - affiliation: "University of Arizona, USA" family-names: Russell diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index d743ede59f..556c999774 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -404,7 +404,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol | | tasmax, tasmin, ts, ua, va, wap, zg (Amon) | | | | | pr, rlut, ua, va (day) | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| NCEP-DOE-R2 | clt, hur, prw, ta, wap (Amon) | 2 | Python | +| NCEP-DOE-R2 | clt, hur, prw, ta, wap, pr, tauu, tauv, tos (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NDP | cVeg (Lmon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ diff --git a/esmvaltool/cmorizers/data/cmor_config/NCEP-DOE-R2.yml b/esmvaltool/cmorizers/data/cmor_config/NCEP-DOE-R2.yml index e0768cf354..f18f76f5a9 100644 --- a/esmvaltool/cmorizers/data/cmor_config/NCEP-DOE-R2.yml +++ b/esmvaltool/cmorizers/data/cmor_config/NCEP-DOE-R2.yml @@ -39,3 +39,25 @@ variables: mip: Amon raw: omega file: 'omega\.mon\.mean\.nc' + pr_month: + short_name: pr + mip: Amon + raw: prate + file: 'prate.sfc.mon.mean.nc' + tauu_month: + short_name: tauu + mip: Amon + raw: uflx + file: 'uflx.sfc.mon.mean.nc' + make_negative: true + tauv_month: + short_name: tauv + mip: Amon + raw: vflx + file: 'vflx.sfc.mon.mean.nc' + make_negative: true + tos_month: + short_name: tos + mip: Amon + raw: skt + file: 'skt.sfc.mon.mean.nc' diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index cda27910bd..019986343b 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -961,9 +961,14 @@ datasets: pressure/ rhum.mon.mean.nc air.mon.mean.nc + omega.mon.mean.nc https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/ gaussian_grid tcdc.eatm.mon.mean.nc + prate.sfc.mon.mean.nc + uflx.sfc.mon.mean.nc + vflx.sfc.mon.mean.nc + skt.sfc.mon.mean.nc https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/ surface pr_wtr.eatm.mon.mean.nc diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/ncep_doe_r2.py b/esmvaltool/cmorizers/data/downloaders/datasets/ncep_doe_r2.py index 704493554f..2d691e710d 100644 --- a/esmvaltool/cmorizers/data/downloaders/datasets/ncep_doe_r2.py +++ b/esmvaltool/cmorizers/data/downloaders/datasets/ncep_doe_r2.py @@ -48,3 +48,11 @@ def download_dataset(config, dataset, dataset_info, start_date, end_date, wget_options=[]) downloader.download_file(url + "surface/pr_wtr.eatm.mon.mean.nc", wget_options=[]) + downloader.download_file(url + "gaussian_grid/prate.sfc.mon.mean.nc", + wget_options=[]) + downloader.download_file(url + "gaussian_grid/uflx.sfc.mon.mean.nc", + wget_options=[]) + downloader.download_file(url + "gaussian_grid/vflx.sfc.mon.mean.nc", + wget_options=[]) + downloader.download_file(url + "gaussian_grid/skt.sfc.mon.mean.nc", + wget_options=[]) diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index 8c7ba0a382..36b65eb472 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -699,6 +699,10 @@ diagnostics: prw: ta: wap: + pr: + tauu: + tauv: + tos: additional_datasets: - {dataset: NCEP-DOE-R2, project: OBS6, mip: Amon, tier: 2, type: reanaly, version: 2, start_year: 1979, end_year: 2022} From f38bbf6359eda6b06c28e4b7b424030ac46647a3 Mon Sep 17 00:00:00 2001 From: max-anu <137736464+max-anu@users.noreply.github.com> Date: Tue, 29 Oct 2024 08:47:48 +1100 Subject: [PATCH 53/87] Adding a CMORiser for CMAP data for pr (#3766) Co-authored-by: Max Proft --- doc/sphinx/source/input.rst | 2 + .../cmorizers/data/cmor_config/CMAP.yml | 21 ++++++ esmvaltool/cmorizers/data/datasets.yml | 9 +++ .../data/downloaders/datasets/cmap.py | 38 ++++++++++ .../data/formatters/datasets/cmap.py | 69 +++++++++++++++++++ .../recipes/examples/recipe_check_obs.yml | 10 +++ 6 files changed, 149 insertions(+) create mode 100644 esmvaltool/cmorizers/data/cmor_config/CMAP.yml create mode 100644 esmvaltool/cmorizers/data/downloaders/datasets/cmap.py create mode 100644 esmvaltool/cmorizers/data/formatters/datasets/cmap.py diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index 556c999774..fbc16b45ec 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -269,6 +269,8 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | CLOUDSAT-L2 | clw, clivi, clwvi, lwp (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +| CMAP | pr (Amon) | 2 | Python | ++------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | CowtanWay | tasa (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | CRU | tas, tasmin, tasmax, pr, clt (Amon), evspsblpot (Emon) | 2 | Python | diff --git a/esmvaltool/cmorizers/data/cmor_config/CMAP.yml b/esmvaltool/cmorizers/data/cmor_config/CMAP.yml new file mode 100644 index 0000000000..eef1861f08 --- /dev/null +++ b/esmvaltool/cmorizers/data/cmor_config/CMAP.yml @@ -0,0 +1,21 @@ +--- +# Global attributes of NetCDF file +attributes: + dataset_id: CMAP + project_id: OBS6 + tier: 2 + version: "v1" + modeling_realm: reanaly + source: "https://psl.noaa.gov/data/gridded/data.cmap.html" + reference: "cmap" + comment: | + '' + +# Variables to CMORize +variables: + # monthly frequency + pr_month: + short_name: pr + mip: Amon + raw: precip + file: "precip.mon.mean.nc" diff --git a/esmvaltool/cmorizers/data/datasets.yml b/esmvaltool/cmorizers/data/datasets.yml index 019986343b..4c7c168009 100644 --- a/esmvaltool/cmorizers/data/datasets.yml +++ b/esmvaltool/cmorizers/data/datasets.yml @@ -264,6 +264,15 @@ datasets: named like the year (e.g. 2007), no subdirectories with days etc. + CMAP: + tier: 2 + source: https://psl.noaa.gov/data/gridded/data.cmap.html + last_access: 2024-09-09 + info: | + To facilitate the download, the links to the https server are provided. + https://downloads.psl.noaa.gov/Datasets/cmap/enh/ + precip.mon.mean.nc + CowtanWay: tier: 2 source: https://www-users.york.ac.uk/~kdc3/papers/coverage2013/series.html diff --git a/esmvaltool/cmorizers/data/downloaders/datasets/cmap.py b/esmvaltool/cmorizers/data/downloaders/datasets/cmap.py new file mode 100644 index 0000000000..5fd58b5ac1 --- /dev/null +++ b/esmvaltool/cmorizers/data/downloaders/datasets/cmap.py @@ -0,0 +1,38 @@ +"""Script to download CMAP (CPC Merged Analysis of Precipitation).""" + +import logging + +from esmvaltool.cmorizers.data.downloaders.ftp import FTPDownloader + +logger = logging.getLogger(__name__) + + +def download_dataset(config, dataset, dataset_info, start_date, end_date, + overwrite): + """Download dataset. + + Parameters + ---------- + config : dict + ESMValTool's user configuration + dataset : str + Name of the dataset + dataset_info : dict + Dataset information from the datasets.yml file + start_date : datetime + Start of the interval to download + end_date : datetime + End of the interval to download + overwrite : bool + Overwrite already downloaded files + """ + downloader = FTPDownloader( + config=config, + server="ftp2.psl.noaa.gov", + dataset=dataset, + dataset_info=dataset_info, + overwrite=overwrite, + ) + downloader.connect() + + downloader.download_file("/Datasets/cmap/enh/precip.mon.mean.nc") diff --git a/esmvaltool/cmorizers/data/formatters/datasets/cmap.py b/esmvaltool/cmorizers/data/formatters/datasets/cmap.py new file mode 100644 index 0000000000..656942b49a --- /dev/null +++ b/esmvaltool/cmorizers/data/formatters/datasets/cmap.py @@ -0,0 +1,69 @@ +"""ESMValTool CMORizer for CMAP (CPC Merged Analysis of Precipitation) data. + +Tier + Tier 2: other freely-available dataset. + +Source + https://psl.noaa.gov/data/gridded/data.cmap.html + +Last access + 20240909 + +Download and processing instructions + To facilitate the download, the links to the ftp server are provided. + + https://downloads.psl.noaa.gov/Datasets/cmap/enh/ + precip.mon.mean.nc + +Caveats + +""" + +import logging +import re +from copy import deepcopy +from pathlib import Path + +import iris +from esmvaltool.cmorizers.data import utilities as utils + + +logger = logging.getLogger(__name__) + + +def _extract_variable(short_name, var, cfg, raw_filepath, out_dir): + cmor_info = cfg["cmor_table"].get_variable(var["mip"], short_name) + attributes = deepcopy(cfg["attributes"]) + attributes["mip"] = var["mip"] + + cubes = iris.load(raw_filepath) + for cube in cubes: + assert cube.units == "mm/day", f"unknown units:{cube.units}" + # convert data from mm/day to kg m-2 s-1 + # mm/day ~ density_water * mm/day + # = 1000 kg m-3 * 1/(1000*86400) m s-1 = 1/86400 kg m-2 s-1 + cube = cube / 86400 + cube.units = "kg m-2 s-1" + + utils.fix_var_metadata(cube, cmor_info) + cube = utils.fix_coords(cube) + utils.set_global_atts(cube, attributes) + + logger.info("Saving file") + utils.save_variable(cube, short_name, out_dir, attributes, + unlimited_dimensions=["time"]) + + +def cmorization(in_dir, out_dir, cfg, cfg_user, start_date, end_date): + """Cmorization func call.""" + for short_name, var in cfg["variables"].items(): + logger.info("CMORizing variable '%s'", short_name) + short_name = var["short_name"] + raw_filenames = Path(in_dir).rglob("*.nc") + filenames = [] + for raw_filename in raw_filenames: + if re.search(var["file"], str(raw_filename)) is not None: + filenames.append(raw_filename) + + for filename in sorted(filenames): + _extract_variable(short_name, var, cfg, filename, out_dir) diff --git a/esmvaltool/recipes/examples/recipe_check_obs.yml b/esmvaltool/recipes/examples/recipe_check_obs.yml index 36b65eb472..880aef831a 100644 --- a/esmvaltool/recipes/examples/recipe_check_obs.yml +++ b/esmvaltool/recipes/examples/recipe_check_obs.yml @@ -61,6 +61,16 @@ diagnostics: scripts: null + CMAP: + description: CMAP check + variables: + pr: + additional_datasets: + - {project: OBS6, dataset: CMAP, mip: Amon, tier: 2, + type: reanaly, version: v1} + scripts: null + + CRU: description: CRU check variables: From f18fe9c0a630ee9a389425a4aed3925119faa018 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Tue, 29 Oct 2024 12:37:53 +0000 Subject: [PATCH 54/87] Pin pys2index >=0.1.5 in osx environment (#3792) --- environment_osx.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment_osx.yml b/environment_osx.yml index 07fdf96de7..8285b43ecd 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -52,7 +52,7 @@ dependencies: - psy-reg >=1.5.0 - psy-simple >=1.5.0 - pyproj >=2.1 - - pys2index # only from conda-forge + - pys2index >=0.1.5 # only from conda-forge; https://github.com/ESMValGroup/ESMValTool/pull/3792 - python >=3.10,<3.13 - python-cdo - python-dateutil From 0961c45d29a86a949f946baca238757d4152856f Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:16:47 +0100 Subject: [PATCH 55/87] Use `transform_first=True` for contourf plots with Robinson projection to avoid cartopy bug (#3789) --- esmvaltool/cmorizers/data/formatters/datasets/cmap.py | 2 +- esmvaltool/diag_scripts/monitor/multi_datasets.py | 9 +++++++++ esmvaltool/diag_scripts/shared/plot/_plot.py | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/esmvaltool/cmorizers/data/formatters/datasets/cmap.py b/esmvaltool/cmorizers/data/formatters/datasets/cmap.py index 656942b49a..fecd2b128e 100644 --- a/esmvaltool/cmorizers/data/formatters/datasets/cmap.py +++ b/esmvaltool/cmorizers/data/formatters/datasets/cmap.py @@ -25,8 +25,8 @@ from pathlib import Path import iris -from esmvaltool.cmorizers.data import utilities as utils +from esmvaltool.cmorizers.data import utilities as utils logger = logging.getLogger(__name__) diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index 32f654b3b6..068c4033da 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -1176,6 +1176,9 @@ def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): axes_data = fig.add_subplot(gridspec[0:2, 0:2], projection=projection) plot_kwargs['axes'] = axes_data + if plot_func is iris.plot.contourf: + # see https://github.com/SciTools/cartopy/issues/2457 + plot_kwargs['transform_first'] = True plot_data = plot_func(cube, **plot_kwargs) axes_data.coastlines() if gridline_kwargs is not False: @@ -1212,6 +1215,9 @@ def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): plot_kwargs_bias = self._get_plot_kwargs(plot_type, dataset, bias=True) plot_kwargs_bias['axes'] = axes_bias + if plot_func is iris.plot.contourf: + # see https://github.com/SciTools/cartopy/issues/2457 + plot_kwargs_bias['transform_first'] = True plot_bias = plot_func(bias_cube, **plot_kwargs_bias) axes_bias.coastlines() if gridline_kwargs is not False: @@ -1268,6 +1274,9 @@ def _plot_map_without_ref(self, plot_func, dataset): axes = fig.add_subplot(projection=self._get_map_projection()) plot_kwargs = self._get_plot_kwargs(plot_type, dataset) plot_kwargs['axes'] = axes + if plot_func is iris.plot.contourf: + # see https://github.com/SciTools/cartopy/issues/2457 + plot_kwargs['transform_first'] = True plot_map = plot_func(cube, **plot_kwargs) axes.coastlines() gridline_kwargs = self._get_gridline_kwargs(plot_type) diff --git a/esmvaltool/diag_scripts/shared/plot/_plot.py b/esmvaltool/diag_scripts/shared/plot/_plot.py index d7db4e1b14..66f1e82c08 100644 --- a/esmvaltool/diag_scripts/shared/plot/_plot.py +++ b/esmvaltool/diag_scripts/shared/plot/_plot.py @@ -228,6 +228,7 @@ def global_contourf(cube, if cbar_range is not None: levels = np.linspace(*cbar_range) kwargs['levels'] = levels + kwargs['transform_first'] = True # see SciTools/cartopy/issues/2457 axes = plt.axes(projection=ccrs.Robinson(central_longitude=10)) plt.sca(axes) map_plot = iris.plot.contourf(cube, **kwargs) From 4f5d049ff2eec9d054d77c4eb34b6a69eba0ee7f Mon Sep 17 00:00:00 2001 From: sloosvel <45196700+sloosvel@users.noreply.github.com> Date: Wed, 30 Oct 2024 20:22:39 +0100 Subject: [PATCH 56/87] Add next release schedule (#3794) Co-authored-by: Valeriu Predoi --- .../release_strategy/release_strategy.rst | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/doc/sphinx/source/community/release_strategy/release_strategy.rst b/doc/sphinx/source/community/release_strategy/release_strategy.rst index b95bab67b1..72c55266dd 100644 --- a/doc/sphinx/source/community/release_strategy/release_strategy.rst +++ b/doc/sphinx/source/community/release_strategy/release_strategy.rst @@ -53,7 +53,20 @@ With the following release schedule, we strive to have three releases per year a Upcoming releases ^^^^^^^^^^^^^^^^^ -- 2.12.0 (TBD) +- 2.12.0 (Release Manager: `Saskia Loosveldt Tomas`_) + ++------------+------------+----------------------------------------+-------------------------------------+ +| Planned | Done | Event | Changelog | ++============+============+========================================+=====================================+ +| 2025-01-13 | | ESMValCore `Feature Freeze`_ | | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2025-01-20 | | ESMValCore Release 2.12.0 | | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2025-01-27 | | ESMValTool `Feature Freeze`_ | | ++------------+------------+----------------------------------------+-------------------------------------+ +| 2025-02-03 | | ESMValTool Release 2.12.0 | | ++------------+------------+----------------------------------------+-------------------------------------+ + Past releases ^^^^^^^^^^^^^ From f64a3db5290934fba56423d5788b41a95dded5d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 13:44:33 +0000 Subject: [PATCH 57/87] [Condalock] Update Linux condalock file (#3796) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 111 ++++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 55 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 5535cdcaa0..1b089cf458 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -11,19 +11,19 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_17.conda#285931bd28b3b8f176d46dd9fd627a09 +https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.5-ha770c72_0.conda#2889e6b9c666c3a564ab90cedc5832fd https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda#83e1364586ceb8d0739fbc85b5c95837 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.2.0-h41c2201_101.conda#fb126e22f5350c15fec6ddbd062f4871 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.2.0-h41c2201_101.conda#60b9a16fd147f7184b5a964aa08f3b0f -https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_17.conda#f58cb23983633068700a756f0b5f165a +https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda#0ea96f90a10838f58412aa84fdd9df09 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_1.conda#5f354010f194e85dc681dec92405ef9e +https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda#cf0c5521ac2a20dfa6c662a4009eeef6 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda#1b53af320b24547ce0fb8196d2604542 @@ -75,7 +75,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenlibm4-0.8.1-hd590300_1.co https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.2.0-h2a3dede_1.conda#160623b9425f5c04941586da43bd1a9c https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda#b6f02b52a174e612e89548f4663ce56a https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -87,10 +87,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-hd0bcaf9_1007.conda#28eb714416de4eb83e2cbc47e99a1b45 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda#1bee70681f504ea424fb07cdb090c001 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.5-h3931f03_0.conda#334dba9982ab9f5d62033c61698a8683 https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.3.0-h5888daf_0.conda#355898d24394b2af353eb96358db9fdd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.10-h5888daf_0.conda#040f0ca9f518151897759ad09ea98b2d https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 @@ -125,15 +127,15 @@ https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-he0204 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda#0a7f4cd238267c88e5d69f7826a407eb https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda#73301c133ded2bf71906aa2104edae8b -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.20.0-h0e7cc3e_1.conda#d0ed81c4591775b70384f4cc78e05cd1 https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2#a730b2badd586580c5752cc73842e068 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h59595ed_0.conda#a7b444a6e008b804b35521895e3440e2 -https://conda.anaconda.org/conda-forge/linux-64/nccl-2.23.4.1-h03a54cd_0.conda#84df066b3b35c59a697af6066137b2a6 -https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 +https://conda.anaconda.org/conda-forge/linux-64/nccl-2.23.4.1-h03a54cd_2.conda#a08604ac3f9c3dbd128bb24e089dee5f +https://conda.anaconda.org/conda-forge/linux-64/nss-3.106-hdf54f9c_0.conda#efe735c7dc47dddbb14b3433d11c6feb https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.8.1-hd590300_1.conda#6eba22eb06d69e53d0ca01eef42bc675 https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 @@ -142,7 +144,6 @@ https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#7 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f -https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda#0d9c441855be3d8dfdb2e800fe755059 https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h8bc8fbc_6.conda#dff3627fec2c0584ded391205295abf0 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 @@ -157,32 +158,31 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.1-hc57e6cf_0.conda#5f84961d86d0ef78851cb34f9d5e31fe https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda#ee3e687b78b778db7b304e5b00a4dca6 -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.2.0-hc73f493_1.conda#131a59b3bb1dbbfc63ec0f21eb0e8c65 https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.2.0-h2c03514_1.conda#41664acd4c99ef4d192e12950ff68ca6 https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-h3e53b52_1004.conda#c21dc684e0e8efa507aba61a030f65e7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 -https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h104a339_1.conda#9ef052c2eee74c792833ac2e820e481e -https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.8.1-he8d1d4c_1.conda#febd0520afc041dd938acdce0f26d71b +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h1909e37_2.conda#21e468ed3786ebcb2124b123aa2484b7 +https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.8.4-hd24f944_0.conda#94887b4deb460378a34e1533beaacfd5 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda#13e8e54035ddd2b91875ba399f0f7c04 https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.0-hdb8da77_2.conda#9c4554fafc94db681543804037e65de2 https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hf539b9f_1021.conda#e8c7620cc49de0c6a2349b6dd6e39beb -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda#9ebc9aedafaa2515ab247ff6bb509458 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.28-pthreads_h3e26593_0.conda#2bd7dc48907a3b6bf766ed87867f3459 https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-hd5b35b9_1.conda#06def97690ef90781a91b786cb48a0a9 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hc670b87_16.conda#3d9f3a2e5d7213c34997e4464d2f938c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.1-cuda118_h09a87be_4.conda#b11b225202c3fd2ac6767ddc7e5d094f -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.2-cuda118_h09a87be_0.conda#d59c3f95f80071f24ebce434494ead0a +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.4-hb346dea_1.conda#21f1e3d43686bc70bd98cc62a431a2cf https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.105-hd34e28f_0.conda#28d7602527b76052422aaf5d6fd7ad81 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda#0515111a9cdf69f83278f7c197db9807 https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.14.1-hed91bc2_1.conda#909188c8979846bac8e586908cf1ca6a -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.0-h9eae976_1.conda#53abf1ef70b9ae213b22caa5350f97a9 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-h988505b_2.conda#9dda9667feba914e0e80b95b82f7402b https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 @@ -221,15 +221,15 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073f7446c90f417b0787122f5b https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_0.tar.bz2#15621abf59053e184114d3e1d4f9d01e https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-1.1.0-pyhd8ed1ab_0.conda#a2f2138597905eaa72e561d8efb42cf3 +https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_0.conda#cdcdbe90dfab4075fc1f3c4cf2e4b4e5 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h743c826_0.conda#12e6988845706b2cfbc3bc35c9a61a95 -https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py312h66e93f0_1.conda#0ad3232829b9509599d8f981c12c9d05 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h66e93f0_0.conda#f98e36c96b2c66d9043187179ddb04f4 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.10.0-pyhff2d567_0.conda#816dbc4679a64e4417cd1385d661bb31 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_0.tar.bz2#6b1f32359fc5d2ab7b491d0029bfffeb https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e @@ -244,8 +244,9 @@ https://conda.anaconda.org/conda-forge/noarch/isodate-0.7.2-pyhd8ed1ab_0.conda#d https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda#ff7ca04134ee8dde1d7cf491a78ef7c7 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/noarch/legacy-cgi-2.6.1-pyh5b84bb0_3.conda#f258b7f54b5d9ddd02441f10c4dca2ac https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda#80aea6603a6813b16ec119d00382b772 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda#8ea26d42ca88ec5258802715fe1ee10b https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f @@ -264,7 +265,7 @@ https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_1. https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhd8ed1ab_0.conda#70959cd1db3cf77b2a27a0836cfd08a7 -https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.1-pyhd8ed1ab_0.conda#4994669899eb2e84ab855edcb71efc58 +https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyhd8ed1ab_1.conda#1d4c088869f206413c59acdd309908b7 https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.28-pthreads_h3d04fff_0.conda#eb2736b14329cf5650917caa43a549c6 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.2-h669347b_0.conda#1e6c10f7d749a490612404efeb179eb8 @@ -275,7 +276,7 @@ https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8e https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py312h66e93f0_2.conda#2c6c0c68f310bc33972e7c83264d7786 -https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py312h66e93f0_2.conda#e6d115113d912f9c2cc8cddddac20d61 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda#0524eb91d3d78d76d671c6e3cd7cee82 https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda#72453e39709f38d0494d096bb5f678b7 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda#0cf7fef6aa123df28adb21a590065e3d @@ -311,12 +312,12 @@ https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda# https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda#34feccdd4177f2d3d53c73fc44fd9a37 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda#af648b62462794649066366af4ecd5b0 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.16-pyhd8ed1ab_0.conda#dfd9748c73bc264c3f634d1345ee8210 +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda#501f6d3288160a31d99a2f1321e77393 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py312h2ec8cdc_1.conda#96226f62dddc63226472b7477d783967 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda#588486a61153f94c7c13816f7069e440 https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_1.conda#6042b782b893029aa40335782584a092 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/webob-1.8.8-pyhd8ed1ab_0.conda#ae69b699c308c3bd20388219764235b0 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.2.0-pyhd8ed1ab_0.conda#a1f7264726115a2f8eac9773b1f27eba https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 @@ -332,19 +333,19 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.5-hbaf354b_4.conda# https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.13.0-h935415a_0.conda#debd1677c2fea41eb2233a260f48a298 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyhd8ed1ab_0.conda#461bcfab8e65c166e297222ae919a2d4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.1-hf8ad068_0.conda#1b7a01fd02d11efe0eb5a676842a7b7d https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.3-py312h178313f_1.conda#2621104ac246594948615017c1254c66 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.4-py312h178313f_0.conda#a32fbd2322865ac80c7db74c553f5306 https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.1-h18eb788_0.conda#2e7dedf73dfbfcee662e2a0f6175e4bb https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.0-py312h66e93f0_1.conda#a921e2fe122e7f38417b9b17c7a13343 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a https://conda.anaconda.org/conda-forge/noarch/fire-0.7.0-pyhd8ed1ab_0.conda#c8eefdf1e822c56a6034602e67bc92a5 https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda#a25e5df6b26be3c2d64be307c1ef0b37 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h66e93f0_0.conda#e311030d9322f6f77e71e013490c83b2 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda#bbbf5fa5cab622c33907bc8d7eeea9f7 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b https://conda.anaconda.org/conda-forge/linux-64/git-2.46.0-pl5321hb5640b7_0.conda#825d146359bc8b85083d92259d0a0e1b @@ -352,7 +353,6 @@ https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#62 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyhd8ed1ab_1.conda#51862c722035f53c5d99ae99a78ea569 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.1-pyha770c72_0.conda#b9f5330c0853ccabc39a9878c6f1a2ab https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda#c808991d29b9838fb4d96ce8267ec9ec https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 @@ -361,18 +361,18 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25 https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda#f5b8822297c9c790cec0795ca1fc9be6 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda#5dbd1b0fc0d01ec5e0e1fbe667281a11 https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda#fd540578678aefe025705f4b58b36b2e +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda#4dc03a53fc69371a6158d0ed37214cd3 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b -https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py312he28fd5a_1.conda#4bc1e0dda9208b8934333d878dde4996 +https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py312he28fd5a_2.conda#3acf38086326f49afed094df4ba7c9d9 https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda#dcd0ed5147d8876b0848a552b416ce76 https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h710cb58_1.conda#69a8838436435f59d72ddcb8dfd24a28 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda#385f46a4df6f97892503a841121a9acf -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 +https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda#5dd546fe99b44fda83963d15f84263b7 https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.1-pyhd8ed1ab_0.conda#81bb643d6c3ab4cbeaf724e9d68d0a6a https://conda.anaconda.org/conda-forge/linux-64/poppler-24.08.0-h47131b8_1.conda#0854b9ff0cc10a1f6f67b0f352b8e75a https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 @@ -382,20 +382,22 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.2-pyhd8ed1ab_0.conda#89703b4f38bd1c0353881f085bc8fdaa https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda#746ce19f0829ec3e19c93007b1a224d3 +https://conda.anaconda.org/conda-forge/noarch/rdflib-7.1.1-pyh0610db2_0.conda#325219de79481bcf5b6446d327e3d492 https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.3.1-pyhd8ed1ab_0.conda#f921ea6a1138cc7edee77de8ed12b226 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-pyhd8ed1ab_3.conda#1f7482562f2082f1b2abf8a3e2a41b63 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py312h66e93f0_1.conda#28ed869ade5601ee374934a31c9d628e https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda#ee6f7fd1e76061ef1fa307d41fa86a96 -https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.5-pyhd8ed1ab_0.conda#c6e94fc2b2ec71ea33fe7c7da259acb4 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.6-pyhd8ed1ab_0.conda#92718e1f892e1e4623dcc59b9f9c4e55 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda#a6ed1227ba6ec37cfc2b25e6512f729f +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda#dae21509d62aa7bf676279ced3edcb3f +https://conda.anaconda.org/conda-forge/noarch/webob-1.8.9-pyhd8ed1ab_0.conda#ff98f23ad74d2a3256debcd9df65d37d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hb9d3cd8_1.conda#f35bec7fface97f67f44ca952fc740b7 https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c089f90a086b6214c5606368d0d3bad0 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda#a1240b99a7ccd953879dc63111823986 -https://conda.anaconda.org/conda-forge/linux-64/yarl-1.15.5-py312h66e93f0_0.conda#a17fd28f7b4b77527218535fddb8acf5 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py312h66e93f0_0.conda#c3f4a6b56026c22319bf31514662b283 https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.10-py312h178313f_0.conda#d2f9e490ab2eae3e661b281346618a82 https://conda.anaconda.org/conda-forge/linux-64/arpack-3.9.1-nompi_h77f6705_101.conda#ff39030debb47f6b53b45bada38e0903 https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.2-h6c0439f_6.conda#4e472c316d08af60faeb71f86d7563e1 @@ -425,13 +427,12 @@ https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba https://conda.anaconda.org/conda-forge/noarch/pylint-3.3.1-pyhd8ed1ab_0.conda#2a3426f75e2172c932131f4e3d51bcf4 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h9211aeb_9.conda#173afeb0d112c854fd1a9fcac4b5cce3 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_0.conda#cb8a11b6d209e3d85e5094bdbd9ebd9c https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.5-pyhd8ed1ab_0.conda#ecd5e850bcd3eca02143e7df030ee50f https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_0.conda#52b91ecba854d55b28ad916a8b10da24 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2.post1-pyhff2d567_0.conda#bd5ae3c630d5eed353badb091fd3e603 -https://conda.anaconda.org/conda-forge/noarch/rdflib-6.2.0-pyhd8ed1ab_0.tar.bz2#b9acd5fbaf467f7447746b1ecac50e83 https://conda.anaconda.org/conda-forge/linux-64/suitesparse-7.8.2-hb42a789_0.conda#b7d1ce5a599ec2caf69673f5beff7696 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.16-hb9d3cd8_0.conda#7c0a9bf62d573409d12ad14b362a96e5 @@ -442,7 +443,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.con https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_2.conda#ff28f374b31937c048107521c814791e https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.10.0-pyhd8ed1ab_0.conda#7823092a3cf14e98a52d2a2875c47c80 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.38.0-h8bb6dbc_0.conda#30ca97df26e33cd48444586e9d088e9a +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.38.3-h8bb6dbc_1.conda#73265d4acc551063cc5c5beab37f33c5 https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 @@ -564,11 +565,11 @@ https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda#4 https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda#97dc960f3d9911964d73c2cf240baea5 https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.9.20-pyhd8ed1ab_0.conda#6de55c7859ed314159eaf2b7b4f19cc7 https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.26.0-h86fa3b2_0.conda#061175d9d4c046a1cf8bffe95a359fab -https://conda.anaconda.org/conda-forge/noarch/xarray-2024.9.0-pyhd8ed1ab_1.conda#dc790d427d89b85ae12fc094e264833f +https://conda.anaconda.org/conda-forge/noarch/xarray-2024.10.0-pyhd8ed1ab_0.conda#53e365732dfa053c4d19fc6b927392c4 https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda#41abde21508578e02e3fd492e82a05cd https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312hf9745cd_2.conda#cc3ecff140731b46b970a7c4787b1823 https://conda.anaconda.org/conda-forge/linux-64/cdo-2.4.1-h9fe33b1_1.conda#a326dab3d2a1a8e32c2a6f792fac3161 -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.5-pyhd8ed1ab_1.conda#7ee17828b8e0472196ed1663cdc970cb +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.10.0-pyhd8ed1ab_0.conda#9437cfe346eab83b011b4def99f0e879 https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.14.1-pyhd8ed1ab_0.conda#1870fe8c9bd8967429e227be28ab94d2 https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b @@ -579,14 +580,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h8d2e343_13_cpu. https://conda.anaconda.org/conda-forge/linux-64/libgdal-kea-3.9.2-h1df15e4_7.conda#c693e703649051ee9db0fabd4fcd0483 https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.9.2-hf2d2f32_7.conda#4015ef020928219acc0b5c9edbce8d30 https://conda.anaconda.org/conda-forge/linux-64/libgdal-tiledb-3.9.2-h4a3bace_2.conda#c3fac34ecba2fcf9d5d31a03b975d5a1 -https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.1-pyhd8ed1ab_0.conda#4dff4abb5728f7662ecaaa8bee3a0260 +https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.2-pyhd8ed1ab_0.conda#9b6cf42ef472b332970282ec87d2e5d4 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.8-hf7c1f58_0.conda#6cd18a9c6b8269b0cd101ba9cc3d02ab https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed https://conda.anaconda.org/conda-forge/noarch/prospector-1.12.1-pyhd8ed1ab_0.conda#8621ba9cf057da26d371b87cd2264259 -https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py312h7900ff3_0.conda#9a6ebd6c124dbf39a13b2529e16ddce8 -https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.1-cuda118_pyh40095f8_4.conda#93ab068c137810f697b41b41a53cec70 +https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py312h7900ff3_1.conda#f110e71421e5c86e50232cc027c6d85c +https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.2-cuda118_pyh40095f8_0.conda#aa5881b02bd9555a7b06c709aa33bd20 https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.1-py312h7900ff3_1.conda#c3d006b1d90fa9f5ae436ff9d6c40249 https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r42ha503ecb_0.conda#12b6fa8fe80a6494a948c6ea2f34340d @@ -614,11 +615,11 @@ https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.3.0-r42ha503ecb_0 https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.6-r42hbfba7a4_1.conda#5c3d7a89a2d5e1c0885f92d1aa6fde30 https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r42h57805ef_1.conda#5367d265c0c9c151dea85f1ccb515ec1 https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py312h1df14c2_2.conda#104fecd2263afe390810307ad0bfe563 +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py312hf9745cd_3.conda#3612f99c589d51c363c8b90c0bcf3a18 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 -https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.4.4-pyhd8ed1ab_0.conda#ef4a03815973391882a6f0caa797e3fb -https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a -https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a +https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.5.0-pyhd8ed1ab_0.conda#0ca8f6f735f6171aa178364cdbbebe4d +https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhd8ed1ab_4.conda#f481c17430f801e68ee3b57cc30ecd2e +https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_2.conda#5d8984ceb5fdf85110ca7108114ecc18 https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-h5888daf_13_cpu.conda#b654d072b8d5da807495e49b28a0b884 https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.9.2-ha770c72_7.conda#63779711c7afd4fcf9cea67538baa67a https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h39682fd_13_cpu.conda#49c60a8dc089d8127b9368e9eb6c1a77 @@ -628,7 +629,7 @@ https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1 https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.1-py312h7900ff3_0.conda#683ec8787a523de54b02c885e2c2aefa https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.8.0-pyhd8ed1ab_0.conda#fba377622e74ee0bbeb8ccae9fa593d3 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h9cafe31_1_cpu.conda#235827b9c93850cafdd2d5ab359893f9 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h01725c0_2_cpu.conda#add603bfa43d9bf3f06783f780e1a817 https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_3.4-r42h61816a4_2.conda#8536251313f441c4d70ff11ad976d294 https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.6-r42hc72bb7e_0.conda#4fb1765d6dc531936db81af3f6be316a @@ -647,8 +648,8 @@ https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_45-r42hbcb9c34_0. https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.5-r42ha503ecb_0.conda#5689030c60302fb5bb7a48b54c11dbe8 https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c -https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.1-cuda118_pyh256f914_4.conda#2c026999ffd3407ddce239cac2da0972 -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.3-pyhd8ed1ab_0.conda#bb748c8dcbcc48b4565459a860b13616 +https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.2-cuda118_pyh256f914_0.conda#2dcf3e60ef65fd4cb95048f2491f6a89 +https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.4-pyhd8ed1ab_0.conda#67a29b663023b8c0e3d8a73013ea3e23 https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py312h5aa26c2_1.conda#4a30f4277a1894928a7057d0e14c1c95 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-h5888daf_13_cpu.conda#cd2c36e8865b158b82f61c6aac28b7e1 https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b @@ -668,7 +669,7 @@ https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.4-hd8ed1ab_1.conda# https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_1.conda#7e8ddbd44fb99ba376b09c4e9e61e509 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_2.conda#5f7d505626cb057e1320bbd46dd02ef2 https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.16-pyhd8ed1ab_0.conda#81de1c44ab7f6cadab4a59b6d76dfa87 @@ -682,9 +683,9 @@ https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_0-r42h57805ef_2.conda#020534c6abdee4f1253c221e926a5341 https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.11.0-pyhd8ed1ab_0.conda#ae2c9a927475f5519d0164c542cde378 https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r42hc72bb7e_2.conda#8079a86a913155fe2589ec0b76dc9f5e -https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.13-pyhd8ed1ab_0.conda#b2f4f2f3923646802215b040e63d042e +https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.14-pyhd8ed1ab_0.conda#351a11ac1215eb4f6c5b82e30070277a https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.5-pyhd8ed1ab_0.conda#b808b8a0494c5cca76200c73e260a060 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.0-pyhd8ed1ab_0.conda#344261b0e77f5d2faaffb4eac225eeb7 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 From 12054d25b539347cc51902ac575e0553491b483e Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Thu, 31 Oct 2024 16:01:19 +0100 Subject: [PATCH 58/87] Fix contourf plots for masked data (#3797) --- .../diag_scripts/monitor/multi_datasets.py | 40 +++++++++++++++++-- esmvaltool/diag_scripts/shared/plot/_plot.py | 12 +++++- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index 068c4033da..70faee96c2 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -608,6 +608,7 @@ from pprint import pformat import cartopy.crs as ccrs +import dask.array as da import iris import matplotlib as mpl import matplotlib.dates as mdates @@ -1178,8 +1179,15 @@ def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): plot_kwargs['axes'] = axes_data if plot_func is iris.plot.contourf: # see https://github.com/SciTools/cartopy/issues/2457 + # and https://github.com/SciTools/cartopy/issues/2468 plot_kwargs['transform_first'] = True - plot_data = plot_func(cube, **plot_kwargs) + npx = da if cube.has_lazy_data() else np + cube_to_plot = cube.copy( + npx.ma.filled(cube.core_data(), np.nan) + ) + else: + cube_to_plot = cube + plot_data = plot_func(cube_to_plot, **plot_kwargs) axes_data.coastlines() if gridline_kwargs is not False: axes_data.gridlines(**gridline_kwargs) @@ -1196,7 +1204,17 @@ def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): if self.plots[plot_type]['common_cbar']: plot_kwargs.setdefault('vmin', plot_data.get_clim()[0]) plot_kwargs.setdefault('vmax', plot_data.get_clim()[1]) - plot_ref = plot_func(ref_cube, **plot_kwargs) + if plot_func is iris.plot.contourf: + # see https://github.com/SciTools/cartopy/issues/2457 + # and https://github.com/SciTools/cartopy/issues/2468 + plot_kwargs['transform_first'] = True + npx = da if ref_cube.has_lazy_data() else np + ref_cube_to_plot = ref_cube.copy( + npx.ma.filled(ref_cube.core_data(), np.nan) + ) + else: + ref_cube_to_plot = ref_cube + plot_ref = plot_func(ref_cube_to_plot, **plot_kwargs) axes_ref.coastlines() if gridline_kwargs is not False: axes_ref.gridlines(**gridline_kwargs) @@ -1217,8 +1235,15 @@ def _plot_map_with_ref(self, plot_func, dataset, ref_dataset): plot_kwargs_bias['axes'] = axes_bias if plot_func is iris.plot.contourf: # see https://github.com/SciTools/cartopy/issues/2457 + # and https://github.com/SciTools/cartopy/issues/2468 plot_kwargs_bias['transform_first'] = True - plot_bias = plot_func(bias_cube, **plot_kwargs_bias) + npx = da if bias_cube.has_lazy_data() else np + bias_cube_to_plot = bias_cube.copy( + npx.ma.filled(bias_cube.core_data(), np.nan) + ) + else: + bias_cube_to_plot = bias_cube + plot_bias = plot_func(bias_cube_to_plot, **plot_kwargs_bias) axes_bias.coastlines() if gridline_kwargs is not False: axes_bias.gridlines(**gridline_kwargs) @@ -1276,8 +1301,15 @@ def _plot_map_without_ref(self, plot_func, dataset): plot_kwargs['axes'] = axes if plot_func is iris.plot.contourf: # see https://github.com/SciTools/cartopy/issues/2457 + # and https://github.com/SciTools/cartopy/issues/2468 plot_kwargs['transform_first'] = True - plot_map = plot_func(cube, **plot_kwargs) + npx = da if cube.has_lazy_data() else np + cube_to_plot = cube.copy( + npx.ma.filled(cube.core_data(), np.nan) + ) + else: + cube_to_plot = cube + plot_map = plot_func(cube_to_plot, **plot_kwargs) axes.coastlines() gridline_kwargs = self._get_gridline_kwargs(plot_type) if gridline_kwargs is not False: diff --git a/esmvaltool/diag_scripts/shared/plot/_plot.py b/esmvaltool/diag_scripts/shared/plot/_plot.py index 66f1e82c08..092479a999 100644 --- a/esmvaltool/diag_scripts/shared/plot/_plot.py +++ b/esmvaltool/diag_scripts/shared/plot/_plot.py @@ -4,6 +4,7 @@ from copy import deepcopy import cartopy.crs as ccrs +import dask.array as da import iris.quickplot import matplotlib.colors as colors import matplotlib.pyplot as plt @@ -228,10 +229,17 @@ def global_contourf(cube, if cbar_range is not None: levels = np.linspace(*cbar_range) kwargs['levels'] = levels - kwargs['transform_first'] = True # see SciTools/cartopy/issues/2457 axes = plt.axes(projection=ccrs.Robinson(central_longitude=10)) plt.sca(axes) - map_plot = iris.plot.contourf(cube, **kwargs) + + # see https://github.com/SciTools/cartopy/issues/2457 + # and https://github.com/SciTools/cartopy/issues/2468 + kwargs['transform_first'] = True + npx = da if cube.has_lazy_data() else np + map_plot = iris.plot.contourf( + cube.copy(npx.ma.filled(cube.core_data(), np.nan)), + **kwargs, + ) # Appearance axes.gridlines(color='lightgrey', alpha=0.5) From ab2e6622a715f01995346f5fa9d393577c7cefd3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 16:50:17 +0000 Subject: [PATCH 59/87] [Condalock] Update Linux condalock file (#3798) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 1b089cf458..7521c7f30c 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -176,7 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2. https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hc670b87_16.conda#3d9f3a2e5d7213c34997e4464d2f938c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.2-cuda118_h09a87be_0.conda#d59c3f95f80071f24ebce434494ead0a -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.4-hb346dea_1.conda#21f1e3d43686bc70bd98cc62a431a2cf +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.4-hb346dea_2.conda#69b90b70c434b916abf5a1d5ee5d55fb https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda#0515111a9cdf69f83278f7c197db9807 @@ -294,7 +294,7 @@ https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py312h12e396e_1.c https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py312h66e93f0_1.conda#532c3e5d0280be4fea52396ec1fa7d5d https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda#d5cd48392c67fb6849ba459c2c2b671f +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda#2ce9825396daf72baabaade36cee16da https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.3-py312h66e93f0_1.conda#c8d1a609d5f3358d715c2273011d9f4d https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 @@ -433,7 +433,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2.post1-pyhff2d567_0.conda#bd5ae3c630d5eed353badb091fd3e603 -https://conda.anaconda.org/conda-forge/linux-64/suitesparse-7.8.2-hb42a789_0.conda#b7d1ce5a599ec2caf69673f5beff7696 +https://conda.anaconda.org/conda-forge/linux-64/suitesparse-7.8.3-hb42a789_0.conda#216922e19843f5662a2b260f905640cb https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.16-hb9d3cd8_0.conda#7c0a9bf62d573409d12ad14b362a96e5 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 From b3bb4a7e144aab1e92a3abdffdf3fc772be9f38a Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 6 Nov 2024 11:34:15 +0100 Subject: [PATCH 60/87] change authors name (#3806) --- esmvaltool/config-references.yml | 10 +++++----- esmvaltool/diag_scripts/monitor/multi_datasets.py | 6 +++++- .../recipes/monitor/recipe_monitor_with_refs.yml | 2 +- esmvaltool/recipes/recipe_shapeselect.yml | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/esmvaltool/config-references.yml b/esmvaltool/config-references.yml index 199dc671e0..79a85c9866 100644 --- a/esmvaltool/config-references.yml +++ b/esmvaltool/config-references.yml @@ -336,6 +336,11 @@ authors: name: Lillis, Jon institute: MetOffice, UK orcid: + lindenlaub_lukas: + name: Lindenlaub, Lukas + institute: University of Bremen, Germany + orcid: https://orcid.org/0000-0001-6349-9118 + github: lukruh little_bill: name: Little, Bill institute: MetOffice, UK @@ -466,11 +471,6 @@ authors: rol_evert: name: Rol, Evert orcid: https://orcid.org/0000-0001-8357-4453 - ruhe_lukas: - name: Ruhe, Lukas - institute: University of Bremen, Germany - orcid: https://orcid.org/0000-0001-6349-9118 - github: lukruh russell_joellen: name: Russell, Joellen institute: Univ. of Arizona, USA diff --git a/esmvaltool/diag_scripts/monitor/multi_datasets.py b/esmvaltool/diag_scripts/monitor/multi_datasets.py index 70faee96c2..41f238a64e 100644 --- a/esmvaltool/diag_scripts/monitor/multi_datasets.py +++ b/esmvaltool/diag_scripts/monitor/multi_datasets.py @@ -2576,7 +2576,11 @@ def create_hovmoeller_time_vs_lat_or_lon_plot(self, datasets): # Provenance tracking provenance_record = { 'ancestors': ancestors, - 'authors': ['schlund_manuel', 'kraft_jeremy', 'ruhe_lukas'], + 'authors': [ + 'schlund_manuel', + 'kraft_jeremy', + 'lindenlaub_lukas' + ], 'caption': caption, 'plot_types': ['zonal'], 'long_names': [dataset['long_name']], diff --git a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml index 48c5153287..4277313428 100644 --- a/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml +++ b/esmvaltool/recipes/monitor/recipe_monitor_with_refs.yml @@ -10,7 +10,7 @@ documentation: - heuer_helge - kraft_jeremy - kuehbacher_birgit - - ruhe_lukas + - lindenlaub_lukas - sarauer_ellen - winterstein_franziska maintainer: diff --git a/esmvaltool/recipes/recipe_shapeselect.yml b/esmvaltool/recipes/recipe_shapeselect.yml index ee56810f03..b463f09df8 100644 --- a/esmvaltool/recipes/recipe_shapeselect.yml +++ b/esmvaltool/recipes/recipe_shapeselect.yml @@ -11,7 +11,7 @@ documentation: - berg_peter maintainer: - - ruhe_lukas + - lindenlaub_lukas projects: - c3s-magic From 7d8d72c43b2c3cd80fd68d53eee7231ce589f210 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 13:22:45 +0000 Subject: [PATCH 61/87] [Condalock] Update Linux condalock file (#3809) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 145 ++++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 73 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 7521c7f30c..a3ad9b680c 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -27,9 +27,9 @@ https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda#1b53af320b24547ce0fb8196d2604542 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda#2b780c0338fc0ffa678ac82c54af51fd +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-heb4867d_0.conda#09a6c610d002e54e18353c06ef61a253 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 @@ -49,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3 https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h756ea98_11.conda#eadcc12bedac44f13223a2909c0e5bcc https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda#1d6afef758879ef5ee78127eb4cd2c4a https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-he02047a_3.conda#fcd2016d1d299f654f81021e27496818 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881 @@ -128,9 +128,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1 https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda#73301c133ded2bf71906aa2104edae8b https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.28-pthreads_h3e26593_1.conda#9d5c316d93ee4c5effd9afda8e8af823 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.20.0-h0e7cc3e_1.conda#d0ed81c4591775b70384f4cc78e05cd1 https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2#a730b2badd586580c5752cc73842e068 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h59595ed_0.conda#a7b444a6e008b804b35521895e3440e2 @@ -165,12 +167,11 @@ https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-h3e53b52_1004.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h1909e37_2.conda#21e468ed3786ebcb2124b123aa2484b7 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda#8ea26d42ca88ec5258802715fe1ee10b https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.8.4-hd24f944_0.conda#94887b4deb460378a34e1533beaacfd5 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda#13e8e54035ddd2b91875ba399f0f7c04 https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.0-hdb8da77_2.conda#9c4554fafc94db681543804037e65de2 https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hf539b9f_1021.conda#e8c7620cc49de0c6a2349b6dd6e39beb -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda#9ebc9aedafaa2515ab247ff6bb509458 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.28-pthreads_h3e26593_0.conda#2bd7dc48907a3b6bf766ed87867f3459 https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-hd5b35b9_1.conda#06def97690ef90781a91b786cb48a0a9 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hc670b87_16.conda#3d9f3a2e5d7213c34997e4464d2f938c @@ -179,6 +180,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.2-cuda118_h09a87b https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.4-hb346dea_2.conda#69b90b70c434b916abf5a1d5ee5d55fb https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 +https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.28-pthreads_h3d04fff_1.conda#fdaa89df7b34f5c904f8f1348e5a62a5 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda#0515111a9cdf69f83278f7c197db9807 https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.14.1-hed91bc2_1.conda#909188c8979846bac8e586908cf1ca6a @@ -191,7 +193,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hb9d3cd8_2.cond https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_0.conda#ae5f4ad87126c55ba3f690ef07f81d64 https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.3-pyhd8ed1ab_0.conda#ec763b0a58960558ca0ad7255a51a237 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda#7d78a232029458d0077ede6cda30ed0c -https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 https://conda.anaconda.org/conda-forge/linux-64/astroid-3.3.5-py312h7900ff3_0.conda#e1ed4d572a4a16b97368ab00fd646487 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 @@ -235,7 +236,7 @@ https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_0.tar https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd8ed1ab_6.conda#2ed1fe4b9079da97c44cfe9c2e5078fd +https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd81877a_7.conda#74fbff91ca7c1b9a36b15903f2242f86 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 @@ -246,12 +247,13 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/noarch/legacy-cgi-2.6.1-pyh5b84bb0_3.conda#f258b7f54b5d9ddd02441f10c4dca2ac https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda#8ea26d42ca88ec5258802715fe1ee10b +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda#5dbd1b0fc0d01ec5e0e1fbe667281a11 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f https://conda.anaconda.org/conda-forge/linux-64/libheif-1.18.2-gpl_hffcb242_100.conda#76ac2c07b62d45c192940f010eea11fa -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_he43201b_1000.conda#36247217c4e1018085bd9db41eb3526a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda#4dc03a53fc69371a6158d0ed37214cd3 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda#80030debaa84cfc31755d53742df3ca6 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda#ed6ead7e9ab9469629c6cfb363b5c6e2 @@ -266,7 +268,6 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhd8ed1ab_0.conda#70959cd1db3cf77b2a27a0836cfd08a7 https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyhd8ed1ab_1.conda#1d4c088869f206413c59acdd309908b7 -https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.28-pthreads_h3d04fff_0.conda#eb2736b14329cf5650917caa43a549c6 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.2-h669347b_0.conda#1e6c10f7d749a490612404efeb179eb8 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db @@ -290,7 +291,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.20.0-py312h12e396e_1.conda#9ae193ac9c1ead5024d5a4ee0024e9a6 +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.21.0-py312h12e396e_0.conda#37f4ad7cb4214c799f32e5f411c6c69f https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py312h66e93f0_1.conda#532c3e5d0280be4fea52396ec1fa7d5d https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df @@ -318,7 +319,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py312h2ec8cdc_1.con https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda#588486a61153f94c7c13816f7069e440 https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_1.conda#6042b782b893029aa40335782584a092 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.0-pyhd8ed1ab_0.conda#f9751d7c71df27b2d29f5cab3378982e https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.2.0-pyhd8ed1ab_0.conda#a1f7264726115a2f8eac9773b1f27eba https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.2.1-hb9d3cd8_1.conda#f35a9a2da717ade815ffa70c0e8bdfbd @@ -326,12 +327,13 @@ https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.9.0-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/noarch/yapf-0.32.0-pyhd8ed1ab_0.tar.bz2#177cba0b4bdfacad5c5fbb0ed31504c4 https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_6.conda#113506c8d2d558e733f5c38f6bf08c50 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda#fee389bf8a4843bd7a2248ce11b7f188 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 +https://conda.anaconda.org/conda-forge/linux-64/arpack-3.9.1-nompi_h77f6705_101.conda#ff39030debb47f6b53b45bada38e0903 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.5-hbaf354b_4.conda#2cefeb144de7712995d1b52cc6a3864c https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.13.0-h935415a_0.conda#debd1677c2fea41eb2233a260f48a298 -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e +https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_0.conda#6d4e9ecca8d88977147e109fc7053184 https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyhd8ed1ab_0.conda#461bcfab8e65c166e297222ae919a2d4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 @@ -350,6 +352,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b https://conda.anaconda.org/conda-forge/linux-64/git-2.46.0-pl5321hb5640b7_0.conda#825d146359bc8b85083d92259d0a0e1b https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 +https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 @@ -361,13 +364,12 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25 https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda#5dbd1b0fc0d01ec5e0e1fbe667281a11 https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda#4dc03a53fc69371a6158d0ed37214cd3 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py312he28fd5a_2.conda#3acf38086326f49afed094df4ba7c9d9 https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda#dcd0ed5147d8876b0848a552b416ce76 https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h710cb58_1.conda#69a8838436435f59d72ddcb8dfd24a28 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 @@ -380,16 +382,16 @@ https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyh7850678_0.conda#5003da197661e40a2509e9c4651f1eea https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/python-utils-3.8.2-pyhd8ed1ab_0.conda#89703b4f38bd1c0353881f085bc8fdaa +https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.0-pyhff2d567_0.conda#ae8d4e318695c0d3e3464ed95cc8b385 https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda#746ce19f0829ec3e19c93007b1a224d3 https://conda.anaconda.org/conda-forge/noarch/rdflib-7.1.1-pyh0610db2_0.conda#325219de79481bcf5b6446d327e3d492 https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.3.1-pyhd8ed1ab_0.conda#f921ea6a1138cc7edee77de8ed12b226 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-pyhd8ed1ab_3.conda#1f7482562f2082f1b2abf8a3e2a41b63 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py312h66e93f0_1.conda#28ed869ade5601ee374934a31c9d628e -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda#ee6f7fd1e76061ef1fa307d41fa86a96 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2022.0.0-hceb3a55_0.conda#79f0161f3ca73804315ca980f65d9c60 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.6-pyhd8ed1ab_0.conda#92718e1f892e1e4623dcc59b9f9c4e55 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.0-pyhd8ed1ab_0.conda#196a9e6ab4e036ceafa516ea036619b0 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda#dae21509d62aa7bf676279ced3edcb3f @@ -399,18 +401,22 @@ https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c0 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda#a1240b99a7ccd953879dc63111823986 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py312h66e93f0_0.conda#c3f4a6b56026c22319bf31514662b283 https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.10-py312h178313f_0.conda#d2f9e490ab2eae3e661b281346618a82 -https://conda.anaconda.org/conda-forge/linux-64/arpack-3.9.1-nompi_h77f6705_101.conda#ff39030debb47f6b53b45bada38e0903 https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.2-h6c0439f_6.conda#4e472c316d08af60faeb71f86d7563e1 https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hd126650_2.conda#36df3cf05459de5d0a41c77c4329634b https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.7.0-h10ac4d7_1.conda#ab6d507ad16dbe2157920451d662e4a1 https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.2-pyhd8ed1ab_0.conda#ac582de2324988b79870b50c89c91c75 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d +https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_2.conda#ff28f374b31937c048107521c814791e https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.3-py312hda17c39_0.conda#2abada8c216dd6e32514535a3fa245d4 +https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-hf7fa9e8_2.conda#1d6bdc6b2c62c8cc90c67b50142d7b7f https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda#0b2154c1818111e17381b1df5b4b0176 -https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hf1a501a_15.conda#d2e16a32f41d67c7d280da11b2846328 +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py312h6d9a048_4.conda#a810fadedc4edc06b4282d1222467837 +https://conda.anaconda.org/conda-forge/noarch/imageio-2.36.0-pyh12aca89_1.conda#36349844ff73fcd0140ee7f30745f0bf https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.1-hd8ed1ab_0.conda#d6c936d009aa63e5f82d216c95cdcaee https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_0.conda#720745920222587ef942acfbc578b584 @@ -421,67 +427,72 @@ https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda#392cae2a58fbcb9db8c2147c6d6d1620 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h15fa968_9.conda#4957a903bd6a68cc2e53e47476f9c6f4 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f +https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 +https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda#e064ca33edf91ac117236c4b5dee207a +https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.13.1-py312hf9745cd_0.conda#33c27209bfd7af6766211facd24839ce +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py312hfb8ada1_0.conda#d0745ae74c2b26571b692ddde112eebb https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 +https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_0.conda#6f9eb38d0a87898cf5a7c91adaccd691 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba https://conda.anaconda.org/conda-forge/noarch/pylint-3.3.1-pyhd8ed1ab_0.conda#2a3426f75e2172c932131f4e3d51bcf4 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h9211aeb_9.conda#173afeb0d112c854fd1a9fcac4b5cce3 +https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py312hfb10629_0.conda#325cc5f0e0dc36562f3de2a4dbded572 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_0.conda#cb8a11b6d209e3d85e5094bdbd9ebd9c https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.5-pyhd8ed1ab_0.conda#ecd5e850bcd3eca02143e7df030ee50f https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_0.conda#52b91ecba854d55b28ad916a8b10da24 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2.post1-pyhff2d567_0.conda#bd5ae3c630d5eed353badb091fd3e603 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py312hc0a28a1_2.conda#8300d634adec4a6aed35a87e90e9cb07 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda#b43233a9e2f62fb94affe5607ea79473 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.conda#5be02e05e1adaa42826cc6800ce399bc +https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_1.conda#5abeaa41ec50d4d1421a8bc8fbc93054 https://conda.anaconda.org/conda-forge/linux-64/suitesparse-7.8.3-hb42a789_0.conda#216922e19843f5662a2b260f905640cb https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.16-hb9d3cd8_0.conda#7c0a9bf62d573409d12ad14b362a96e5 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.379-h5a9005d_9.conda#5dc18b385893b7991a3bbeb135ad7c3e https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.12.0-hd2e3451_0.conda#61f1c193452f0daa582f39634627ea33 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d -https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_2.conda#ff28f374b31937c048107521c814791e -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.10.0-pyhd8ed1ab_0.conda#7823092a3cf14e98a52d2a2875c47c80 +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.6.1-pyhd8ed1ab_0.conda#e88d74bb7b9b89d4c9764286ceb94cc9 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.11.0-pyhd8ed1ab_0.conda#75c96f0655908f596a57be60251b78d4 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.38.3-h8bb6dbc_1.conda#73265d4acc551063cc5c5beab37f33c5 -https://conda.anaconda.org/conda-forge/noarch/eofs-1.4.1-pyhd8ed1ab_1.conda#5fc43108dee4106f23050acc7a101233 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py312h6d9a048_4.conda#a810fadedc4edc06b4282d1222467837 -https://conda.anaconda.org/conda-forge/noarch/imageio-2.36.0-pyh12aca89_1.conda#36349844ff73fcd0140ee7f30745f0bf +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.2-pyhd8ed1ab_0.conda#636950f839e065401e2031624a414f0b +https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 https://conda.anaconda.org/conda-forge/linux-64/julia-1.10.4-hf18f99d_1.conda#cc0ef9c191bab16211970a29b6787d69 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.9.2-h353785f_1.conda#c363d0b330b4b21b4c1b10e0981d3a99 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda#9e7960f0b9ab3895ef73d92477c47dae https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda#83f045969988f5c7a65f3950b95a8b35 -https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_2.conda#2380c9ba933ffaac9ad16d8eac8e3318 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h22f9119_106.conda#5b911bfe75855326bae6857451268e59 -https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda#e064ca33edf91ac117236c4b5dee207a -https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.13.1-py312hf9745cd_0.conda#33c27209bfd7af6766211facd24839ce -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py312hfb8ada1_0.conda#d0745ae74c2b26571b692ddde112eebb -https://conda.anaconda.org/conda-forge/noarch/patsy-0.5.6-pyhd8ed1ab_0.conda#a5b55d1cb110cdcedc748b5c3e16e687 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h21d6d8e_102.conda#9049ba34261ce7106220711d313fcf61 https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d https://conda.anaconda.org/conda-forge/linux-64/postgresql-17.0-h1122569_4.conda#028ea131f116f13bb2a4a382b5863a04 https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.8.2-pyhd8ed1ab_0.conda#84377261c09c02182d76fbe79e69c9bf https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py312hfb10629_0.conda#325cc5f0e0dc36562f3de2a4dbded572 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py312hc0a28a1_2.conda#8300d634adec4a6aed35a87e90e9cb07 https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h32f4cee_16.conda#feee98a221344be7a447b80b410df867 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda#b43233a9e2f62fb94affe5607ea79473 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.conda#5be02e05e1adaa42826cc6800ce399bc -https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_1.conda#5abeaa41ec50d4d1421a8bc8fbc93054 +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.2-py312h7a48858_1.conda#6b5f4c68483bd0c22bca9094dafc606b +https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 +https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda#40d80cd9fa4cc759c6dba19ea96642db +https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda#97dc960f3d9911964d73c2cf240baea5 https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.9.20-pyhd8ed1ab_0.conda#6de55c7859ed314159eaf2b7b4f19cc7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 +https://conda.anaconda.org/conda-forge/noarch/xarray-2024.10.0-pyhd8ed1ab_0.conda#53e365732dfa053c4d19fc6b927392c4 +https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda#41abde21508578e02e3fd492e82a05cd https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.11.0-h325d260_1.conda#11d926d1f4a75a1b03d1c053ca20424b -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.6.0-pyhd8ed1ab_0.conda#6728ca650187933a007b89f00ece4279 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc0a28a1_6.conda#fa4853d25b6fbfef5eb7b3e1b5616dd5 -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.10.0-pyhd8ed1ab_0.conda#b3b498f7bcc9a2543ad72a3501f3d87b +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312hf9745cd_2.conda#cc3ecff140731b46b970a7c4787b1823 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.10.0-pyhd8ed1ab_0.conda#9437cfe346eab83b011b4def99f0e879 +https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.11.0-pyhd8ed1ab_0.conda#497f3535cbb69cd2f02158e2e18ee0bb https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h9e768e6_3.conda#c330e87e698bae8e7381c0315cf25dd0 https://conda.anaconda.org/conda-forge/linux-64/gdal-3.9.2-py312h1299960_7.conda#9cf27e3f9d97ea13f250db9253a25dc8 https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda#953e31ea00d46beb7e64a79fc291ec44 -https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/libgdal-fits-3.9.2-h2db6552_7.conda#524e64f1aa0ebc87230109e684f392f4 https://conda.anaconda.org/conda-forge/linux-64/libgdal-grib-3.9.2-hc3b29a1_7.conda#56a7436a66a1a4636001ce4b621a3a33 https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf4-3.9.2-hd5ecb85_7.conda#9c8431dc0b83d5fe9c12a2c0b6861a72 @@ -492,11 +503,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libgdal-pg-3.9.2-h5e77dd0_7.cond https://conda.anaconda.org/conda-forge/linux-64/libgdal-postgisraster-3.9.2-h5e77dd0_7.conda#3392965ffc4e8b7c66a532750ce0e91f https://conda.anaconda.org/conda-forge/linux-64/libgdal-xls-3.9.2-h03c987c_7.conda#165f12373452e8d17889e9c877431acf https://conda.anaconda.org/conda-forge/linux-64/magics-4.15.4-h24e9adf_1.conda#9731bb0d2a3917cab718fd7c90dea857 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_1.conda#2f4f3854f23be30de29e9e4d39758349 https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h21d6d8e_102.conda#9049ba34261ce7106220711d313fcf61 +https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda#5971cc64048943605f352f7f8612de6c +https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py312h7900ff3_1.conda#f110e71421e5c86e50232cc027c6d85c +https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.2-cuda118_pyh40095f8_0.conda#aa5881b02bd9555a7b06c709aa33bd20 https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.6.1-pyhd8ed1ab_0.conda#d1023ccf92d8235cd4808ef53e274a5e https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b @@ -559,36 +571,28 @@ https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.45-r42ha18555a_0.conda# https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r42hc72bb7e_2.conda#2f3614450b54f222c1eff786ec2a45ec https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda#97f60a93ca12f4fdd5f44049dcee4345 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.2-py312h7a48858_1.conda#6b5f4c68483bd0c22bca9094dafc606b -https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 -https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda#40d80cd9fa4cc759c6dba19ea96642db -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda#97dc960f3d9911964d73c2cf240baea5 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.9.20-pyhd8ed1ab_0.conda#6de55c7859ed314159eaf2b7b4f19cc7 +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py312hf9745cd_3.conda#3612f99c589d51c363c8b90c0bcf3a18 +https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.26.0-h86fa3b2_0.conda#061175d9d4c046a1cf8bffe95a359fab -https://conda.anaconda.org/conda-forge/noarch/xarray-2024.10.0-pyhd8ed1ab_0.conda#53e365732dfa053c4d19fc6b927392c4 -https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda#41abde21508578e02e3fd492e82a05cd -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312hf9745cd_2.conda#cc3ecff140731b46b970a7c4787b1823 https://conda.anaconda.org/conda-forge/linux-64/cdo-2.4.1-h9fe33b1_1.conda#a326dab3d2a1a8e32c2a6f792fac3161 -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.10.0-pyhd8ed1ab_0.conda#9437cfe346eab83b011b4def99f0e879 https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.14.1-pyhd8ed1ab_0.conda#1870fe8c9bd8967429e227be28ab94d2 https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc -https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda#a201de7d36907f2355426e019168d337 https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_39-imagemagick_hcfc5581_1.conda#1144fe07cf76921ec664b868453027d3 +https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_2.conda#5d8984ceb5fdf85110ca7108114ecc18 https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h8d2e343_13_cpu.conda#dc379f362829d5df5ce6722565110029 https://conda.anaconda.org/conda-forge/linux-64/libgdal-kea-3.9.2-h1df15e4_7.conda#c693e703649051ee9db0fabd4fcd0483 https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.9.2-hf2d2f32_7.conda#4015ef020928219acc0b5c9edbce8d30 https://conda.anaconda.org/conda-forge/linux-64/libgdal-tiledb-3.9.2-h4a3bace_2.conda#c3fac34ecba2fcf9d5d31a03b975d5a1 +https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.2-pyhd8ed1ab_0.conda#9b6cf42ef472b332970282ec87d2e5d4 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc -https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.8-hf7c1f58_0.conda#6cd18a9c6b8269b0cd101ba9cc3d02ab https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed https://conda.anaconda.org/conda-forge/noarch/prospector-1.12.1-pyhd8ed1ab_0.conda#8621ba9cf057da26d371b87cd2264259 -https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py312h7900ff3_1.conda#f110e71421e5c86e50232cc027c6d85c -https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.2-cuda118_pyh40095f8_0.conda#aa5881b02bd9555a7b06c709aa33bd20 -https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.1-py312h7900ff3_1.conda#c3d006b1d90fa9f5ae436ff9d6c40249 +https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.1-py312h7900ff3_0.conda#683ec8787a523de54b02c885e2c2aefa +https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.2-py312h7900ff3_0.conda#a972ba77217a2cac592c41dd3cc56dfd https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r42ha503ecb_0.conda#12b6fa8fe80a6494a948c6ea2f34340d https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r42h57805ef_0.conda#9febce7369c72d991e2399d7d28f3390 @@ -615,19 +619,18 @@ https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.3.0-r42ha503ecb_0 https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.6-r42hbfba7a4_1.conda#5c3d7a89a2d5e1c0885f92d1aa6fde30 https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r42h57805ef_1.conda#5367d265c0c9c151dea85f1ccb515ec1 https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py312hf9745cd_3.conda#3612f99c589d51c363c8b90c0bcf3a18 -https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 -https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.5.0-pyhd8ed1ab_0.conda#0ca8f6f735f6171aa178364cdbbebe4d +https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e +https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.2-cuda118_pyh256f914_0.conda#2dcf3e60ef65fd4cb95048f2491f6a89 +https://conda.anaconda.org/conda-forge/noarch/cads-api-client-1.5.2-pyhd8ed1ab_0.conda#e7005effa79f1493a51404873d6eb5a0 https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhd8ed1ab_4.conda#f481c17430f801e68ee3b57cc30ecd2e -https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_2.conda#5d8984ceb5fdf85110ca7108114ecc18 https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-h5888daf_13_cpu.conda#b654d072b8d5da807495e49b28a0b884 https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.9.2-ha770c72_7.conda#63779711c7afd4fcf9cea67538baa67a https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h39682fd_13_cpu.conda#49c60a8dc089d8127b9368e9eb6c1a77 -https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 -https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.1-py312h7900ff3_0.conda#683ec8787a523de54b02c885e2c2aefa +https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py312h7900ff3_1.conda#080bc8f34a9cb0ab81ae0369fd43b7ab +https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py312h7900ff3_1.conda#ea719cfcc2e5b815b137b7082ece8aeb https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.8.0-pyhd8ed1ab_0.conda#fba377622e74ee0bbeb8ccae9fa593d3 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h01725c0_2_cpu.conda#add603bfa43d9bf3f06783f780e1a817 https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 @@ -646,16 +649,12 @@ https://conda.anaconda.org/conda-forge/noarch/r-scales-1.3.0-r42hc72bb7e_0.conda https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r42h7525677_2.tar.bz2#1521b8a303852af0496245e368d3c61c https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_45-r42hbcb9c34_0.conda#bcd96dc088f54514a54d57e6b8ed51b6 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.5-r42ha503ecb_0.conda#5689030c60302fb5bb7a48b54c11dbe8 -https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c -https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.2-cuda118_pyh256f914_0.conda#2dcf3e60ef65fd4cb95048f2491f6a89 https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.4-pyhd8ed1ab_0.conda#67a29b663023b8c0e3d8a73013ea3e23 https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py312h5aa26c2_1.conda#4a30f4277a1894928a7057d0e14c1c95 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-h5888daf_13_cpu.conda#cd2c36e8865b158b82f61c6aac28b7e1 https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-h7cb714c_54.conda#7363202c15302898deb49e82ca3e5f58 -https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py312h7900ff3_1.conda#080bc8f34a9cb0ab81ae0369fd43b7ab -https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py312h7900ff3_1.conda#ea719cfcc2e5b815b137b7082ece8aeb https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.1-r42hc72bb7e_0.conda#6bd41a85dc43541400311eca03d4e2d4 https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r42hc72bb7e_1005.conda#da116b29105a8d48571975a185e9bb94 https://conda.anaconda.org/conda-forge/noarch/r-lmomco-2.5.1-r42hc72bb7e_0.conda#6efbdfe5d41b3ef5652be1ea2e0a6e3c @@ -672,11 +671,11 @@ https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.con https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_2.conda#5f7d505626cb057e1320bbd46dd02ef2 https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.16-pyhd8ed1ab_0.conda#81de1c44ab7f6cadab4a59b6d76dfa87 +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.17-pyhd8ed1ab_0.conda#4f75a3a76e9f693fc33be59485f46fcf https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.3-r42hc72bb7e_0.conda#1b2b8fa85a9d0556773abac4763d8ef9 https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r42ha503ecb_1.conda#6aa1414e06dfffc39d3b5ca78b60b377 https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.5-r42hc72bb7e_0.conda#959f69b6dfd4b620a15489975fa27670 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.10.0-pyhd8ed1ab_0.conda#719832923b1d98803d07b2ca38eb3baa +https://conda.anaconda.org/conda-forge/noarch/dask-2024.11.0-pyhd8ed1ab_0.conda#9a25bf7e2a910e85209218896f2adeb9 https://conda.anaconda.org/conda-forge/linux-64/r-fields-15.2-r42h61816a4_0.conda#d84fe2f9e893e92089370b195e2263a0 https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r42hc72bb7e_1.conda#7fe060235dac0fc0b3d387f98e79d128 https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_1.conda#86286b197e33e3b034416c18ba0f574c From eb627592325e91fc5021bb38a86f7905de88e2d5 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:16:39 +0100 Subject: [PATCH 62/87] Remove recipe filler utility (#3777) --- doc/sphinx/source/utils.rst | 57 -- esmvaltool/utils/recipe_filler.py | 914 ------------------------ setup.py | 2 - tests/integration/test_recipe_filler.py | 211 ------ 4 files changed, 1184 deletions(-) delete mode 100755 esmvaltool/utils/recipe_filler.py delete mode 100644 tests/integration/test_recipe_filler.py diff --git a/doc/sphinx/source/utils.rst b/doc/sphinx/source/utils.rst index 536b78ebee..d0783ff2a4 100644 --- a/doc/sphinx/source/utils.rst +++ b/doc/sphinx/source/utils.rst @@ -383,63 +383,6 @@ klaus.zimmermann@smhi.se .. _pygithub: https://pygithub.readthedocs.io/en/latest/introduction.html -Recipe filler -============= - -If you need to fill in a blank recipe with additional datasets, you can do that with -the command `recipe_filler`. This runs a tool to obtain a set of additional datasets when -given a blank recipe, and you can give an arbitrary number of data parameters. The blank recipe -should contain, to the very least, a list of diagnostics, each with their variable(s). -Example of running the tool: - -.. code-block:: bash - - recipe_filler recipe.yml - -where `recipe.yml` is the recipe that needs to be filled with additional datasets; a minimal -example of this recipe could be: - -.. code-block:: yaml - - diagnostics: - diagnostic: - variables: - ta: - mip: Amon # required - start_year: 1850 # required - end_year: 1900 # required - - -Key features ------------- - -- you can add as many variable parameters as are needed; if not added, the - tool will use the ``"*"`` wildcard and find all available combinations; -- you can restrict the number of datasets to be looked for with the ``dataset:`` - key for each variable, pass a list of datasets as value, e.g. - ``dataset: [MPI-ESM1-2-LR, MPI-ESM-LR]``; -- you can specify a pair of experiments, e.g. ``exp: [historical, rcp85]`` - for each variable; this will look for each available dataset per experiment - and assemble an aggregated data stretch from each experiment to complete - for the total data length specified by ``start_year`` and ``end_year``; equivalent to - ESMValTool's syntax on multiple experiments; this option needs an ensemble - to be declared explicitly; it will return no entry if there are gaps in data; -- ``start_year`` and ``end_year`` are required and are used to filter out the - datasets that don't have data in the interval; as noted above, the tool will not - return datasets with partial coverage from ``start_year`` to ``end_year``; - if you want all possible years hence no filtering on years just use ``"*"`` - for start and end years; -- ``config-user: rootpath: CMIPX`` may be a list, rootpath lists are supported; -- all major DRS paths (including ``default``, ``BADC``, ``ETHZ`` etc) are supported; -- speedup is achieved through CMIP mip tables lookup, so ``mip`` is required in recipe; - -Caveats -------- - -- the tool doesn't yet work with derived variables; it will not return any available datasets; -- operation restricted to CMIP data only, OBS lookup is not available yet. - - Extracting a list of input files from the provenance ==================================================== diff --git a/esmvaltool/utils/recipe_filler.py b/esmvaltool/utils/recipe_filler.py deleted file mode 100755 index 40f637c6d5..0000000000 --- a/esmvaltool/utils/recipe_filler.py +++ /dev/null @@ -1,914 +0,0 @@ -""" -Fill in a blank recipe with additional datasets. - -Tool to obtain a set of additional datasets when given a blank recipe. -The blank recipe should contain, to the very least, a list of diagnostics -each with their variable(s). Example of minimum settings: - -diagnostics: - diagnostic: - variables: - ta: - mip: Amon - start_year: 1850 - end_year: 1900 - -Note that the tool will exit if any of these minimum settings are missing! - -Key features: - -- you can add as many variable parameters as are needed; if not added, the - tool will use the "*" wildcard and find all available combinations; -- you can restrict the number of datasets to be looked for with the `dataset:` - key for each variable, pass a list of datasets as value, e.g. - `dataset: [MPI-ESM1-2-LR, MPI-ESM-LR]`; -- you can specify a pair of experiments eg `exp: [rcp26, rcp85]` - for each variable; this will look for each available dataset per experiment - and assemble an aggregated data stretch from each experiment; equivalent to - esmvaltool's syntax of multiple experiments; this option needs an ensemble - to be declared explicitly; it will return no entry if there are gaps in data -- `start_year` and `end_year` are mandatory and are used to filter out the - datasets that don't have data in the interval; if you want all possible years - hence no filtering on years just use "*" for start and end years; -- `config-user: rootpath: CMIPX` may be a list, rootpath lists are supported; - -Caveats: - -- the tool doesn't yet work for derived variables; -- operation restricted to CMIP data. - -Have fun! -""" -import argparse -import datetime -import itertools -import logging -import logging.config -import os -import shutil -import time -from glob import glob -from pathlib import Path - -import esmvalcore -import yaml - -from esmvalcore import __version__ as core_ver -from esmvalcore.cmor.table import CMOR_TABLES, read_cmor_tables -from packaging import version as pkg_version -from ruamel.yaml import YAML - -logger = logging.getLogger(__name__) - -CFG = {} - - -def _purge_file_handlers(cfg: dict) -> None: - """Remove handlers with filename set. - - This is used to remove file handlers which require an output - directory to be set. - """ - cfg['handlers'] = { - name: handler - for name, handler in cfg['handlers'].items() - if 'filename' not in handler - } - prev_root = cfg['root']['handlers'] - cfg['root']['handlers'] = [ - name for name in prev_root if name in cfg['handlers'] - ] - - -def _update_stream_level(cfg: dict, level=None): - """Update the log level for the stream handlers.""" - handlers = cfg['handlers'] - - for handler in handlers.values(): - if level is not None and 'stream' in handler: - if handler['stream'] in ('ext://sys.stdout', 'ext://sys.stderr'): - handler['level'] = level.upper() - - -def _get_log_files(cfg: dict, output_dir: str = None) -> list: - """Initialize log files for the file handlers.""" - log_files = [] - - handlers = cfg['handlers'] - - for handler in handlers.values(): - filename = handler.get('filename', None) - - if filename: - if not os.path.isabs(filename): - handler['filename'] = os.path.join(output_dir, filename) - log_files.append(handler['filename']) - - return log_files - - -def configure_logging(cfg_file: str = None, - output_dir: str = None, - console_log_level: str = None) -> list: - """Configure logging. - - Parameters - ---------- - cfg_file : str, optional - Logging config file. If `None`, defaults to `configure-logging.yml` - output_dir : str, optional - Output directory for the log files. If `None`, log only to the console. - console_log_level : str, optional - If `None`, use the default (INFO). - - Returns - ------- - log_files : list - Filenames that will be logged to. - """ - if cfg_file is None: - cfg_loc = Path(esmvalcore.__file__ + "esmvalcore") - if pkg_version.parse(core_ver) < pkg_version.parse('2.8.0'): - cfg_file = cfg_loc.parents[0] / '_config' / 'config-logging.yml' - else: - cfg_file = cfg_loc.parents[0] / 'config' / 'config-logging.yml' - - cfg_file = Path(cfg_file).absolute() - - with open(cfg_file) as file_handler: - cfg = yaml.safe_load(file_handler) - - if output_dir is None: - _purge_file_handlers(cfg) - - log_files = _get_log_files(cfg, output_dir=output_dir) - _update_stream_level(cfg, level=console_log_level) - - logging.config.dictConfig(cfg) - logging.Formatter.converter = time.gmtime - logging.captureWarnings(True) - - return log_files - - -def read_config_developer_file(cfg_file=None): - """Read the developer's configuration file.""" - if cfg_file is None: - cfg_loc = Path(esmvalcore.__file__ + "esmvalcore") - cfg_file = cfg_loc.parents[0] / 'config-developer.yml' - - with open(cfg_file, 'r') as file: - cfg = yaml.safe_load(file) - - return cfg - - -def _normalize_path(path): - """Normalize paths. - - Expand ~ character and environment variables and convert path to absolute. - - Parameters - ---------- - path: str - Original path - - Returns - ------- - str: - Normalized path - """ - if path is None: - return None - return os.path.abspath(os.path.expanduser(os.path.expandvars(path))) - - -def read_config_user_file(config_file, folder_name, options=None): - """Read config user file and store settings in a dictionary.""" - if not config_file: - config_file = '~/.esmvaltool/config-user.yml' - config_file = os.path.abspath( - os.path.expandvars(os.path.expanduser(config_file))) - # Read user config file - if not os.path.exists(config_file): - print(f"ERROR: Config file {config_file} does not exist") - - with open(config_file, 'r') as file: - cfg = yaml.safe_load(file) - - if options is None: - options = dict() - for key, value in options.items(): - cfg[key] = value - - # set defaults - defaults = { - 'compress_netcdf': False, - 'exit_on_warning': False, - 'output_file_type': 'png', - 'output_dir': 'esmvaltool_output', - 'auxiliary_data_dir': 'auxiliary_data', - 'save_intermediary_cubes': False, - 'remove_preproc_dir': True, - 'max_parallel_tasks': None, - 'run_diagnostic': True, - 'profile_diagnostic': False, - 'config_developer_file': None, - 'drs': {}, - } - - for key in defaults: - if key not in cfg: - logger.info( - "No %s specification in config file, " - "defaulting to %s", key, defaults[key]) - cfg[key] = defaults[key] - - cfg['output_dir'] = _normalize_path(cfg['output_dir']) - cfg['auxiliary_data_dir'] = _normalize_path(cfg['auxiliary_data_dir']) - - cfg['config_developer_file'] = _normalize_path( - cfg['config_developer_file']) - - for key in cfg['rootpath']: - root = cfg['rootpath'][key] - if isinstance(root, str): - cfg['rootpath'][key] = [_normalize_path(root)] - else: - cfg['rootpath'][key] = [_normalize_path(path) for path in root] - - # insert a directory date_time_recipe_usertag in the output paths - now = datetime.datetime.utcnow().strftime("%Y%m%d_%H%M%S") - new_subdir = '_'.join((folder_name, now)) - cfg['output_dir'] = os.path.join(cfg['output_dir'], new_subdir) - - # create subdirectories - cfg['preproc_dir'] = os.path.join(cfg['output_dir'], 'preproc') - cfg['work_dir'] = os.path.join(cfg['output_dir'], 'work') - cfg['plot_dir'] = os.path.join(cfg['output_dir'], 'plots') - cfg['run_dir'] = os.path.join(cfg['output_dir'], 'run') - - # Read developer configuration file - read_cmor_tables(cfg['config_developer_file']) - - return cfg - - -HEADER = r""" -______________________________________________________________________ - _____ ____ __ ____ __ _ _____ _ - | ____/ ___|| \/ \ \ / /_ _| |_ _|__ ___ | | - | _| \___ \| |\/| |\ \ / / _` | | | |/ _ \ / _ \| | - | |___ ___) | | | | \ V / (_| | | | | (_) | (_) | | - |_____|____/|_| |_| \_/ \__,_|_| |_|\___/ \___/|_| -______________________________________________________________________ - -""" + __doc__ - -dataset_order = [ - 'dataset', 'project', 'exp', 'mip', 'ensemble', 'grid', 'start_year', - 'end_year' -] - -# cmip eras -cmip_eras = ["CMIP5", "CMIP6"] - -# The base dictionairy (all wildcards): -base_dict = { - 'institute': '*', - 'dataset': '*', - 'project': '*', - 'exp': '*', - 'frequency': '*', - 'ensemble': '*', - 'mip': '*', - 'modeling_realm': '*', - 'short_name': '*', - 'grid': '*', - 'start_year': '*', - 'end_year': '*', - 'activity': '*', -} - - -def _get_download_dir(yamlconf, cmip_era): - """Get the Download Directory from user config file.""" - if 'download_dir' in yamlconf: - return os.path.join(yamlconf['download_dir'], cmip_era) - return False - - -def _get_site_rootpath(cmip_era): - """Get site (drs) from config-user.yml.""" - config_yml = get_args().config_file - with open(config_yml, 'r') as yamf: - yamlconf = yaml.safe_load(yamf) - drs = yamlconf['drs'][cmip_era] - - download_dir = _get_download_dir(yamlconf, cmip_era) - rootdir = [yamlconf['rootpath'][cmip_era], ] - - if download_dir: - rootdir.append(download_dir) - logger.debug("%s root directory %s", cmip_era, rootdir) - if drs == 'default' and 'default' in yamlconf['rootpath']: - rootdir = [yamlconf['rootpath']['default'], ] - if download_dir: - rootdir.append(download_dir) - - logger.debug("Using drs default and " - "default: %s data directory", rootdir) - - return drs, rootdir - - -def _get_input_dir(cmip_era): - """Get input_dir from config-developer.yml.""" - site = _get_site_rootpath(cmip_era)[0] - yamlconf = read_config_developer_file() - - return yamlconf[cmip_era]['input_dir'][site] - - -def _get_input_file(cmip_era): - """Get input_file from config-developer.yml.""" - yamlconf = read_config_developer_file() - return yamlconf[cmip_era]['input_file'] - - -def _determine_basepath(cmip_era): - """Determine a basepath.""" - if isinstance(_get_site_rootpath(cmip_era)[1], list): - rootpaths = _get_site_rootpath(cmip_era)[1] - else: - rootpaths = [_get_site_rootpath(cmip_era)[1]] - - basepaths = [] - for rootpath in rootpaths: - if _get_input_dir(cmip_era) != os.path.sep: - basepath = os.path.join(rootpath, _get_input_dir(cmip_era), - _get_input_file(cmip_era)) - else: - basepath = os.path.join(rootpath, _get_input_file(cmip_era)) - basepath = basepath.replace('//', '/') - basepaths.append(basepath) - logger.debug("We will look for files of patterns %s", basepaths) - - return basepaths - - -def _overlapping_datasets(files, all_years, start_year, end_year): - """Process overlapping datasets and check for avail data in time range.""" - valid_files = [] - ay_sorted = sorted(all_years) - if ay_sorted[0] <= start_year and ay_sorted[-1] >= end_year: - yr_pairs = sorted( - [all_years[i:i + 2] for i in range(0, len(all_years), 2)]) - yr_pairs = list(k for k, _ in itertools.groupby(yr_pairs)) - d_y = [ - yr_pairs[j][1] - yr_pairs[j + 1][0] - for j in range(len(yr_pairs) - 1) - ] - gaps = [c for c in d_y if c < -1] - if not gaps: - valid_files = files - logger.info("Contiguous data from multiple experiments.") - else: - logger.warning("Data from multiple exps has >1 year gaps! ") - logger.debug("Start %s/end %s requested - " - "files covering %s found.", - start_year, end_year, yr_pairs) - - return valid_files - - -def filter_years(files, start_year, end_year, overlap=False): - """ - Filter out files that are outside requested time range. - - Nifty function that takes a list of files and two years - as arguments; it will build a series of filter dictionaries - and check if data is available for the entire interval; - it will return a single file per dataset, the first file - in the list of files that cover the specified interval; - optional argument `overlap` used if multiple experiments are - used and overlap between datasets is present. - - Parameters - ---------- - files: list - A list of files that need filtering by requested time range. - - start_year: int - Integer start year of requested range. - - end_year: int - Integer end year of requested range. - - overlap: bool - Flag if datasets overlap; defaults to False. - - Returns - ------- - list - List of files which have been identified as falling in - the requested time range; if multiple files within time range - per dataset, the first file will be returned. - - """ - valid_files = [] - available_years = {} - - if start_year == "*" and end_year == "*": - return files - - if not files: - return valid_files - - all_files_roots = [("").join(fil.split("_")[0:-1]) for fil in files] - for fil in files: - available_years[("").join(fil.split("_")[0:-1])] = [] - for fil in files: - available_years[("").join(fil.split("_")[0:-1])].append( - fil.split("_")[-1].strip(".nc").split("-")) - - all_years = [] - for root, yr_list in available_years.items(): - actual_years = [] - yr_list = list(itertools.chain.from_iterable(yr_list)) - for year in yr_list: - if len(year) == 4: - actual_years.append(int(year)) - else: - actual_years.append(int(year[0:4])) - actual_years = sorted(actual_years) - all_years.extend(actual_years) - if not overlap: - actual_years = sorted(list(set(actual_years))) - if actual_years[0] <= start_year and actual_years[-1] >= end_year: - idx = all_files_roots.index(root) - valid_files.append(files[idx]) - - # multiple experiments to complete each other - if overlap: - valid_files = _overlapping_datasets(files, all_years, start_year, - end_year) - - if not valid_files: - logger.warning("No data found to fully cover start " - "%s / end %s as requested!", start_year, end_year) - - return valid_files - - -def _resolve_latestversion(dirname_template): - """Resolve the 'latestversion' tag.""" - for version_separator in ['{latestversion}', '{version}']: - if version_separator in dirname_template: - break - else: - return dirname_template - - # Find latest version - part1, part2 = dirname_template.split(version_separator) - part2 = part2.lstrip(os.sep) - part1_contents = glob(part1) - if part1_contents: - versions = os.listdir(part1_contents[0]) - versions.sort(reverse=True) - for version in ['latest'] + versions: - dirname = os.path.join(part1, version, part2) - if glob(dirname): - return dirname - - return dirname_template - - -def list_all_files(file_dict, cmip_era): - """ - List all files that match the dataset dictionary. - - Function that returns all files that are determined by a - file_dict dictionary; file_dict is keyed on usual parameters - like `dataset`, `project`, `mip` etc; glob.glob is used - to find files; speedup is achieved by replacing wildcards - with values from CMOR tables. - - Parameters - ---------- - file_dict: dict - Dictionary to hold dataset specifications. - - cmip_era: str - Either CMIP5 or CMIP6. - - Returns - ------- - list: - List of found files. - - """ - mip = file_dict['mip'] - short_name = file_dict['short_name'] - try: - frequency = CMOR_TABLES[cmip_era].get_variable(mip, - short_name).frequency - realms = CMOR_TABLES[cmip_era].get_variable(mip, - short_name).modeling_realm - except AttributeError: - logger.warning("Could not find %s CMOR table " - "for variable %s with mip %s", - cmip_era, short_name, mip) - return [] - file_dict['frequency'] = frequency - - basepaths = _determine_basepath(cmip_era) - all_files = [] - - for basepath in basepaths: - new_path = basepath[:] - - # could have multiple realms - for realm in realms: - file_dict['modeling_realm'] = realm - - # load all the files in the custom dict - for key, value in file_dict.items(): - new_path = new_path.replace('{' + key + '}', str(value)) - new_path = _resolve_latestversion(new_path) - if new_path.startswith("~"): - new_path = os.path.expanduser(new_path) - if not new_path.startswith(os.sep): - raise ValueError( - "Could not expand ~ to user home dir " - "please expand it in the config user file!") - logger.info("Expanding path to %s", new_path) - - # Globs all the wildcards into a list of files. - files = glob(new_path) - all_files.extend(files) - if not all_files: - logger.warning("Could not find any file for data specifications.") - - return all_files - - -def _file_to_recipe_dataset(fn_path, cmip_era, file_dict): - """Convert a filename to an recipe ready dataset.""" - # Add the obvious ones - ie the one you requested! - output_dataset = {} - output_dataset['project'] = cmip_era - for key, value in file_dict.items(): - if value == '*': - continue - if key in dataset_order: - output_dataset[key] = value - - # Split file name and base path into directory structure and filenames. - basefiles = _determine_basepath(cmip_era) - _, fnfile = os.path.split(fn_path) - - for basefile in basefiles: - _, basefile = os.path.split(basefile) - # Some of the key words include the splitting character '_' ! - basefile = basefile.replace('short_name', 'shortname') - basefile = basefile.replace('start_year', 'startyear') - basefile = basefile.replace('end_year', 'endyear') - - # Assume filename is separated by '_' - basefile_split = [key.replace("{", "") for key in basefile.split('_')] - basefile_split = [key.replace("}", "") for key in basefile_split] - fnfile_split = fnfile.split('_') - - # iterate through directory structure looking for useful bits. - for base_key, fn_key in zip(basefile_split, fnfile_split): - if base_key == '*.nc': - fn_key = fn_key.replace('.nc', '') - start_year, end_year = fn_key.split('-') - output_dataset['start_year'] = start_year - output_dataset['end_year'] = end_year - elif base_key == "ensemble*.nc": - output_dataset['ensemble'] = fn_key - elif base_key == "grid*.nc": - output_dataset['grid'] = fn_key - elif base_key == "shortname": - pass - else: - output_dataset[base_key] = fn_key - if "exp" in file_dict: - if isinstance(file_dict["exp"], list): - output_dataset["exp"] = file_dict["exp"] - - return output_dataset - - -def _remove_duplicates(add_datasets): - """ - Remove accidental duplicates. - - Close to 0% chances this will ever be used. - May be used when there are actual duplicates in data - storage, we've seen these before, but seldom. - """ - datasets = [] - seen = set() - - for dataset in add_datasets: - orig_exp = dataset["exp"] - dataset["exp"] = str(dataset["exp"]) - tup_dat = tuple(dataset.items()) - if tup_dat not in seen: - seen.add(tup_dat) - dataset["exp"] = orig_exp - datasets.append(dataset) - - return datasets - - -def _check_recipe(recipe_dict): - """Perform a quick recipe check for mandatory fields.""" - do_exit = False - if "diagnostics" not in recipe_dict: - logger.error("Recipe missing diagnostics section.") - do_exit = True - for diag_name, diag in recipe_dict["diagnostics"].items(): - if "variables" not in diag: - logger.error("Diagnostic %s missing variables.", diag_name) - do_exit = True - for var_name, var_pars in diag["variables"].items(): - if "mip" not in var_pars: - logger.error("Variable %s missing mip.", var_name) - do_exit = True - if "start_year" not in var_pars: - logger.error("Variable %s missing start_year.", var_name) - do_exit = True - if "end_year" not in var_pars: - logger.error("Variable %s missing end_year.", var_name) - do_exit = True - if "exp" in var_pars: - if isinstance(var_pars["exp"], - list) and "ensemble" not in var_pars: - logger.error("Asking for experiments list for ") - logger.error("variable %s - you need to ", var_name) - logger.error("define an ensemble for this case.") - do_exit = True - if do_exit: - raise ValueError("Please fix the issues in recipe and rerun") - - -def _check_config_file(user_config_file): - """Perform a quick recipe check for mandatory fields.""" - do_exit = False - if "rootpath" not in user_config_file: - logger.error("Config file missing rootpath section.") - do_exit = True - if "drs" not in user_config_file: - logger.error("Config file missing drs section.") - do_exit = True - for proj in cmip_eras: - if proj not in user_config_file["rootpath"].keys(): - logger.error("Config file missing rootpath for %s", proj) - do_exit = True - if proj not in user_config_file["drs"].keys(): - logger.error("Config file missing drs for %s", proj) - do_exit = True - if do_exit: - raise ValueError("Please fix issues in config file and rerun") - - -def _parse_recipe_to_dicts(yamlrecipe): - """Parse a recipe's variables into a dictionary of dictionairies.""" - output_dicts = {} - for diag in yamlrecipe['diagnostics']: - for variable, var_dict in yamlrecipe['diagnostics'][diag][ - 'variables'].items(): - new_dict = base_dict.copy() - for var_key, var_value in var_dict.items(): - if var_key in new_dict: - new_dict[var_key] = var_value - output_dicts[(diag, variable)] = new_dict - - return output_dicts - - -def _add_datasets_into_recipe(additional_datasets, output_recipe): - """Add the datasets into a new recipe.""" - yaml = YAML() - yaml.default_flow_style = False - with open(output_recipe, 'r') as yamlfile: - cur_yaml = yaml.load(yamlfile) - for diag_var, add_dat in additional_datasets.items(): - if add_dat: - if 'additional_datasets' in cur_yaml['diagnostics']: - cur_yaml['diagnostics'][diag_var[0]]['variables'][ - diag_var[1]]['additional_datasets'].extend(add_dat) - else: - cur_yaml['diagnostics'][diag_var[0]]['variables'][ - diag_var[1]]['additional_datasets'] = add_dat - if cur_yaml: - with open(output_recipe, 'w') as yamlfile: - yaml.dump(cur_yaml, yamlfile) - - -def _find_all_datasets(recipe_dict, cmip_eras): - """Find all datasets explicitly.""" - datasets = [] - for cmip_era in cmip_eras: - if cmip_era == "CMIP6": - activity = "CMIP" - else: - activity = "" - drs, site_path = _get_site_rootpath(cmip_era) - if drs in ["default", "SMHI"]: - logger.info("DRS is %s; filter on dataset disabled.", drs) - datasets = ["*"] - else: - if not isinstance(site_path, list): - site_path = [site_path] - for site_pth in site_path: - if drs in ["BADC", "DKRZ", "CP4CDS"]: - institutes_path = os.path.join(site_pth, activity) - elif drs in ["ETHZ", "RCAST"]: - exp = recipe_dict["exp"][0] - if exp == "*": - exp = "piControl" # all institutes have piControl - mip = recipe_dict["mip"] - var = recipe_dict["short_name"] - institutes_path = os.path.join(site_pth, exp, mip, var) - - if not os.path.isdir(institutes_path): - logger.warning("Path to data %s " - "does not exist; will look everywhere.", - institutes_path) - datasets = ["*"] - return datasets - - institutes = os.listdir(institutes_path) - if drs in ["BADC", "DKRZ", "CP4CDS"]: - for institute in institutes: - datasets.extend( - os.listdir(os.path.join(institutes_path, - institute))) - else: - datasets.extend(institutes) - - return datasets - - -def _get_exp(recipe_dict): - """Get the correct exp as list of single or multiple exps.""" - if isinstance(recipe_dict["exp"], list): - exps_list = recipe_dict["exp"] - logger.info("Multiple %s experiments requested", exps_list) - else: - exps_list = [recipe_dict["exp"]] - logger.info("Single %s experiment requested", exps_list) - - return exps_list - - -def _get_datasets(recipe_dict, cmip_eras): - """Get the correct datasets as list if needed.""" - if recipe_dict["dataset"] == "*": - datasets = _find_all_datasets(recipe_dict, cmip_eras) - return datasets - if isinstance(recipe_dict['dataset'], list): - datasets = recipe_dict['dataset'] - logger.info("Multiple %s datasets requested", datasets) - else: - datasets = [recipe_dict['dataset']] - logger.info("Single %s dataset requested", datasets) - - return datasets - - -def get_args(): - """Parse command line arguments.""" - parser = argparse.ArgumentParser( - description=__doc__, - formatter_class=argparse.RawDescriptionHelpFormatter) - parser.add_argument('recipe', help='Path/name of yaml pilot recipe file') - parser.add_argument('-c', - '--config-file', - default=os.path.join(os.environ["HOME"], '.esmvaltool', - 'config-user.yml'), - help='User configuration file') - - parser.add_argument('-o', - '--output', - default=os.path.join(os.getcwd(), - 'recipe_autofilled.yml'), - help='Output recipe, default recipe_autofilled.yml') - - args = parser.parse_args() - return args - - -def _get_timefiltered_files(recipe_dict, exps_list, cmip_era): - """Obtain all files that correspond to requested time range.""" - # multiple experiments allowed, complement data from each exp - if len(exps_list) > 1: - files = [] - for exp in exps_list: - recipe_dict["exp"] = exp - files.extend(list_all_files(recipe_dict, cmip_era)) - files = filter_years(files, - recipe_dict["start_year"], - recipe_dict["end_year"], - overlap=True) - recipe_dict["exp"] = exps_list - - else: - files = list_all_files(recipe_dict, cmip_era) - files = filter_years(files, recipe_dict["start_year"], - recipe_dict["end_year"]) - - return files - - -def run(): - """Run the `recipe_filler` tool. Help in __doc__ and via --help.""" - # Get arguments - args = get_args() - input_recipe = args.recipe - output_recipe = args.output - cmip_eras = ["CMIP5", "CMIP6"] - - # read the config file - config_user = read_config_user_file(args.config_file, - 'recipe_filler', - options={}) - - # configure logger - run_dir = os.path.join(config_user['output_dir'], 'recipe_filler') - if not os.path.isdir(run_dir): - os.makedirs(run_dir) - log_files = configure_logging(output_dir=run_dir, - console_log_level=config_user['log_level']) - logger.info(HEADER) - logger.info("Using user configuration file: %s", args.config_file) - logger.info("Using pilot recipe file: %s", input_recipe) - logger.info("Writing filled out recipe to: %s", output_recipe) - log_files = "\n".join(log_files) - logger.info("Writing program log files to:\n%s", log_files) - - # check config user file - _check_config_file(config_user) - - # parse recipe - with open(input_recipe, 'r') as yamlfile: - yamlrecipe = yaml.safe_load(yamlfile) - _check_recipe(yamlrecipe) - recipe_dicts = _parse_recipe_to_dicts(yamlrecipe) - - # Create a list of additional_datasets for each diagnostic/variable. - additional_datasets = {} - for (diag, variable), recipe_dict in recipe_dicts.items(): - logger.info("Looking for data for " - "variable %s in diagnostic %s", variable, diag) - new_datasets = [] - if "short_name" not in recipe_dict: - recipe_dict['short_name'] = variable - elif recipe_dict['short_name'] == "*": - recipe_dict['short_name'] = variable - - # adjust cmip era if needed - if recipe_dict['project'] != "*": - cmip_eras = [recipe_dict['project']] - - # get datasets depending on user request; always a list - datasets = _get_datasets(recipe_dict, cmip_eras) - - # get experiments depending on user request; always a list - exps_list = _get_exp(recipe_dict) - - # loop through datasets - for dataset in datasets: - recipe_dict['dataset'] = dataset - logger.info("Seeking data for dataset: %s", dataset) - for cmip_era in cmip_eras: - files = _get_timefiltered_files(recipe_dict, exps_list, - cmip_era) - - # assemble in new recipe - add_datasets = [] - for fn in sorted(files): - fn_dir = os.path.dirname(fn) - logger.info("Data directory: %s", fn_dir) - out = _file_to_recipe_dataset(fn, cmip_era, recipe_dict) - logger.info("New recipe entry: %s", out) - if out is None: - continue - add_datasets.append(out) - new_datasets.extend(add_datasets) - additional_datasets[(diag, variable, cmip_era)] = \ - _remove_duplicates(new_datasets) - - # add datasets to recipe as additional_datasets - shutil.copyfile(input_recipe, output_recipe, follow_symlinks=True) - _add_datasets_into_recipe(additional_datasets, output_recipe) - logger.info("Finished recipe filler. Go get some science done now!") - - -if __name__ == "__main__": - run() diff --git a/setup.py b/setup.py index 6b4636d1f7..86aab79854 100755 --- a/setup.py +++ b/setup.py @@ -250,8 +250,6 @@ def read_description(filename): 'nclcodestyle = esmvaltool.utils.nclcodestyle.nclcodestyle:_main', 'test_recipe = ' 'esmvaltool.utils.testing.recipe_settings.install_expand_run:main', - 'recipe_filler = ' - 'esmvaltool.utils.recipe_filler:run' ], 'esmvaltool_commands': [ 'colortables = ' diff --git a/tests/integration/test_recipe_filler.py b/tests/integration/test_recipe_filler.py deleted file mode 100644 index b78ac8c5f8..0000000000 --- a/tests/integration/test_recipe_filler.py +++ /dev/null @@ -1,211 +0,0 @@ -"""Tests for _data_finder.py.""" -import contextlib -import os -import shutil -import sys -import tempfile - -import pytest -import yaml - -from esmvaltool.utils.recipe_filler import run - - -# Load test configuration -with open(os.path.join(os.path.dirname(__file__), - 'recipe_filler.yml')) as file: - CONFIG = yaml.safe_load(file) - - -@contextlib.contextmanager -def arguments(*args): - backup = sys.argv - sys.argv = list(args) - yield - sys.argv = backup - - -def print_path(path): - """Print path.""" - txt = path - if os.path.isdir(path): - txt += '/' - if os.path.islink(path): - txt += ' -> ' + os.readlink(path) - print(txt) - - -def tree(path): - """Print path, similar to the the `tree` command.""" - print_path(path) - for dirpath, dirnames, filenames in os.walk(path): - for dirname in dirnames: - print_path(os.path.join(dirpath, dirname)) - for filename in filenames: - print_path(os.path.join(dirpath, filename)) - - -def create_file(filename): - """Create an empty file.""" - dirname = os.path.dirname(filename) - if not os.path.exists(dirname): - os.makedirs(dirname) - - with open(filename, 'a'): - pass - - -def create_tree(path, filenames=None, symlinks=None): - """Create directory structure and files.""" - for filename in filenames or []: - create_file(os.path.join(path, filename)) - - for symlink in symlinks or []: - link_name = os.path.join(path, symlink['link_name']) - os.symlink(symlink['target'], link_name) - - -def write_config_user_file(dirname, file_path, drs): - config_file = dirname / 'config-user.yml' - cfg = { - 'log_level': 'info', - 'output_dir': str(dirname / 'recipe_filler_output'), - 'rootpath': { - 'CMIP5': str(dirname / file_path), - 'CMIP6': str(dirname / file_path), - }, - 'drs': { - 'CMIP5': drs, - 'CMIP6': drs, - }, - } - config_file.write_text(yaml.safe_dump(cfg, encoding=None)) - return str(config_file) - - -def write_recipe(dirname, recipe_dict): - recipe_file = dirname / 'recipe.yml' - diags = {'diagnostics': recipe_dict} - recipe_file.write_text(yaml.safe_dump(diags, encoding=None)) - return str(recipe_file) - - -@pytest.fixture -def root(): - """Root function for tests.""" - dirname = tempfile.mkdtemp() - yield os.path.join(dirname, 'output1') - print("Directory structure was:") - tree(dirname) - shutil.rmtree(dirname) - - -def setup_files(tmp_path, root, cfg): - """Create config, recipe ,output recipe etc.""" - user_config_file = write_config_user_file(tmp_path, root, cfg['drs']) - diagnostics = {} - diagnostics["test_diagnostic"] = {} - diagnostics["test_diagnostic"]["variables"] = {} - diagnostics["test_diagnostic"]["variables"]["test_var"] = cfg["variable"] - recipe = write_recipe(tmp_path, diagnostics) - output_recipe = str(tmp_path / "recipe_auto.yml") - - return user_config_file, recipe, output_recipe - - -@pytest.mark.parametrize('cfg', CONFIG['has_additional_datasets']) -def test_adding_datasets(tmp_path, root, cfg): - """Test retrieving additional datasets.""" - create_tree(root, cfg.get('available_files'), - cfg.get('available_symlinks')) - - user_config_file, recipe, output_recipe = setup_files(tmp_path, root, cfg) - - with arguments( - 'recipe_filler', - recipe, - '-c', - user_config_file, - '-o', - output_recipe, - ): - run() - - with open(output_recipe, 'r') as file: - autofilled_recipe = yaml.safe_load(file) - diag = autofilled_recipe["diagnostics"]["test_diagnostic"] - var = diag["variables"]["test_var"] - assert "additional_datasets" in var - - -@pytest.mark.parametrize('cfg', CONFIG['no_additional_datasets']) -def test_not_adding_datasets(tmp_path, root, cfg): - """Test retrieving no additional datasets.""" - create_tree(root, cfg.get('available_files'), - cfg.get('available_symlinks')) - - user_config_file, recipe, output_recipe = setup_files(tmp_path, root, cfg) - - with arguments( - 'recipe_filler', - recipe, - '-c', - user_config_file, - '-o', - output_recipe, - ): - run() - - with open(output_recipe, 'r') as file: - autofilled_recipe = yaml.safe_load(file) - diag = autofilled_recipe["diagnostics"]["test_diagnostic"] - var = diag["variables"]["test_var"] - assert "additional_datasets" not in var - - -def test_bad_var(tmp_path, root): - """Test a bad variable in the works.""" - cfg = CONFIG['bad_variable'][0] - user_config_file, recipe, output_recipe = setup_files(tmp_path, root, cfg) - - # this doesn't fail and it shouldn't since it can go on - # and look for data for other valid variables - with arguments( - 'recipe_filler', - recipe, - '-c', - user_config_file, - '-o', - output_recipe, - ): - run() - - with open(output_recipe, 'r') as file: - autofilled_recipe = yaml.safe_load(file) - diag = autofilled_recipe["diagnostics"]["test_diagnostic"] - var = diag["variables"]["test_var"] - assert "additional_datasets" not in var - - -def test_no_short_name(tmp_path, root): - """Test a bad variable in the works.""" - cfg = CONFIG['no_short_name'][0] - user_config_file, recipe, output_recipe = setup_files(tmp_path, root, cfg) - - # this doesn't fail and it shouldn't since it can go on - # and look for data for other valid variables - with arguments( - 'recipe_filler', - recipe, - '-c', - user_config_file, - '-o', - output_recipe, - ): - run() - - with open(output_recipe, 'r') as file: - autofilled_recipe = yaml.safe_load(file) - diag = autofilled_recipe["diagnostics"]["test_diagnostic"] - var = diag["variables"]["test_var"] - assert "additional_datasets" not in var From c4f757638ea3e78c635cc130ed965d47c32c1d9e Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Wed, 13 Nov 2024 12:23:41 +0000 Subject: [PATCH 63/87] Fix issue related to removal/change of private function imported in `diag_scripts/shared/_supermeans.py` (deprecation in iris=3.11) (#3810) --- esmvaltool/diag_scripts/shared/_supermeans.py | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/esmvaltool/diag_scripts/shared/_supermeans.py b/esmvaltool/diag_scripts/shared/_supermeans.py index 7099ba4725..8543ca99cf 100644 --- a/esmvaltool/diag_scripts/shared/_supermeans.py +++ b/esmvaltool/diag_scripts/shared/_supermeans.py @@ -13,7 +13,6 @@ import cf_units import iris import iris.coord_categorisation -from iris.coord_categorisation import _pt_date import numpy as np @@ -206,6 +205,28 @@ def add_start_hour(cube, coord, name='diurnal_sampling_hour'): _add_categorised_coord(cube, name, coord, start_hour_from_bounds) +# lifted from iris==3.10 last iris to have it in iris.coord_categorisation +# Private "helper" function +def _pt_date(coord, time): + """Return the datetime of a time-coordinate point. + + Parameters + ---------- + coord : Coord + Coordinate (must be Time-type). + time : float + Value of a coordinate point. + + Returns + ------- + cftime.datetime + + """ + # NOTE: All of the currently defined categorisation functions are + # calendar operations on Time coordinates. + return coord.units.num2date(time, only_use_cftime_datetimes=True) + + def start_hour_from_bounds(coord, _, bounds): """Add hour from bounds.""" return np.array([_pt_date(coord, _bounds[0]).hour for _bounds in bounds]) From de43833ff1238d1c0b5e70bf4b12d67583d8057e Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 14 Nov 2024 16:35:32 +0000 Subject: [PATCH 64/87] Update environment: pin `iris>=3.11`, unpin `cartopy` and allow for `numpy >=2` (#3811) Co-authored-by: Manuel Schlund <32543114+schlunma@users.noreply.github.com> --- environment.yml | 10 +++++----- environment_osx.yml | 8 ++++---- setup.py | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/environment.yml b/environment.yml index 270f0f6ecd..72ccf127f6 100644 --- a/environment.yml +++ b/environment.yml @@ -10,27 +10,27 @@ channels: dependencies: - aiohttp - - cartopy <0.24 # https://github.com/ESMValGroup/ESMValTool/issues/3767 + - cartopy - cdo >=2.3.0 - cdsapi - cf-units - cfgrib - cftime - cmocean - - curl <8.10 + - curl <8.10 # https://github.com/ESMValGroup/ESMValTool/issues/3758 - cython - dask !=2024.8.0 # https://github.com/dask/dask/issues/11296 - distributed - ecmwf-api-client - eofs - - esmpy # <8.6 safe https://github.com/SciTools/iris-esmf-regrid/issues/415 + - esmpy - esmvalcore 2.11.* - fiona - fire - fsspec - gdal >=3.9.0 - importlib_metadata <8 # https://github.com/ESMValGroup/ESMValTool/issues/3699 only for Python 3.10/11 and esmpy<8.6 - - iris >=3.6.1 + - iris >=3.11 - iris-esmf-regrid >=0.10.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - jinja2 - joblib @@ -41,7 +41,7 @@ dependencies: - nc-time-axis - netCDF4 - numba - - numpy !=1.24.3,<2.0 # severe masking bug + - numpy !=1.24.3 # severe masking bug - openpyxl - packaging - pandas==2.1.4 # unpin when ESMValCore released with https://github.com/ESMValGroup/ESMValCore/pull/2529 diff --git a/environment_osx.yml b/environment_osx.yml index 8285b43ecd..242f0a4f56 100644 --- a/environment_osx.yml +++ b/environment_osx.yml @@ -10,7 +10,7 @@ channels: dependencies: - aiohttp - - cartopy <0.24 # https://github.com/ESMValGroup/ESMValTool/issues/3767 + - cartopy - cdo >=2.3.0 - cdsapi - cf-units @@ -22,14 +22,14 @@ dependencies: - distributed - ecmwf-api-client - eofs - - esmpy # <8.6 safe https://github.com/SciTools/iris-esmf-regrid/issues/415 + - esmpy - esmvalcore 2.11.* - fiona - fire - fsspec - gdal >=3.9.0 - importlib_metadata <8 # https://github.com/ESMValGroup/ESMValTool/issues/3699 only for Python 3.10/11 and esmpy<8.6 - - iris >=3.6.1 + - iris >=3.11 - iris-esmf-regrid >=0.10.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - jinja2 - joblib @@ -40,7 +40,7 @@ dependencies: - nc-time-axis - netCDF4 - numba - - numpy !=1.24.3,<2.0 # severe masking bug + - numpy !=1.24.3 # severe masking bug - openpyxl - packaging - pandas==2.1.4 # unpin when ESMValCore released with https://github.com/ESMValGroup/ESMValCore/pull/2529 diff --git a/setup.py b/setup.py index 86aab79854..cdadaca2d2 100755 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ # Use with pip install . to install from source 'install': [ 'aiohttp', - 'cartopy<0.24', # github.com/ESMValGroup/ESMValTool/issues/3767 + 'cartopy', 'cdo', 'cdsapi', 'cf-units', @@ -67,7 +67,7 @@ 'scikit-image', 'scikit-learn>=1.4.0', # github.com/ESMValGroup/ESMValTool/issues/3504 'scipy', - 'scitools-iris>=3.6.1', + 'scitools-iris>=3.11', 'seaborn', 'seawater', 'shapely>=2', From e070fd5a86bc3832c82e801832cc5cfbdabf7ffb Mon Sep 17 00:00:00 2001 From: Axel Lauer Date: Thu, 21 Nov 2024 12:09:12 +0100 Subject: [PATCH 65/87] Add info on obs tiers to docu (#3624) Co-authored-by: Bouwe Andela Co-authored-by: Romain Beucher --- doc/sphinx/source/input.rst | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/doc/sphinx/source/input.rst b/doc/sphinx/source/input.rst index fbc16b45ec..f9bcfafc3e 100644 --- a/doc/sphinx/source/input.rst +++ b/doc/sphinx/source/input.rst @@ -112,6 +112,21 @@ ESMValTool currently supports two ways to perform this reformatting (aka checks and fixes'). Details on this second method are given at the :ref:`end of this chapter `. +Tiers +----- + +All observational datasets are grouped into in three tiers: + +* **Tier 1**: obs4mips and ana4mips datasets. These datasets are publicly and freely available without any license restrictions. These datasets do not need any reformatting and can be used as is with ESMValTool. +* **Tier 2** other freely available datasets that are not obs4mips. There are no license restrictions. These datasets need to be reformatted to be used with ESMValTool ('CMORization', see above). +* **Tier 3** restricted datasets. Datasets which require registration to be downloaded or that can only be obtained upon request from the respective authors. License restrictions do not allow us to redistribute Tier 3 datasets. The data have to be obtained and reformatted by the user ('CMORization', see above). + +[!NOTE] +.. _tier3_note: +For some of the Tier 3 datasets, we obtained permission from the dataset providers to share the data among ESMValTool users on HPC systems. These Tier 3 datasets are marked with an asterisk in the table in section :ref:`supported datasets below`. + +An overview of the Tier 2 and Tier 3 datasets for which a CMORizing script is available in ESMValTool v2.0 is given in section :ref:`supported datasets below`. + A collection of readily CMORized OBS and OBS6 datasets can be accessed directly on CEDA/JASMIN and DKRZ. At CEDA/JASMIN OBS and OBS6 data is stored in the `esmeval` Group Workspace (GWS), and to be granted read (and execute) permissions to the GWS, one must apply at https://accounts.jasmin.ac.uk/services/group_workspaces/esmeval/ ; after permission has been granted, the user @@ -246,7 +261,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | CALIPSO-GOCCP | clcalipso (cfMon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| CALIPSO-ICECLOUD | cli (AMon) | 3 | NCL | +| CALIPSO-ICECLOUD* [#t3]_ | cli (AMon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | CDS-SATELLITE-ALBEDO | bdalb (Lmon), bhalb (Lmon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -330,7 +345,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | ESRL | co2s (Amon) | 2 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| FLUXCOM | gpp (Lmon) | 3 | Python | +| FLUXCOM* [#t3]_ | gpp (Lmon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | GCP2018 | fgco2 (Omon [#note3]_), nbp (Lmon [#note3]_) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -380,17 +395,17 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | Landschuetzer2020 | spco2 (Omon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| MAC-LWP | lwp, lwpStderr (Amon) | 3 | NCL | +| MAC-LWP* [#t3]_ | lwp, lwpStderr (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | MERRA | cli, clivi, clt, clw, clwvi, hur, hus, lwp, pr, prw, ps, psl, rlut, rlutcs, rsdt, rsut, rsutcs, ta, | 3 | NCL | | | tas, ts, ua, va, wap, zg (Amon) | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| MERRA2 | sm (Lmon) | 3 | Python | +| MERRA2* [#t3]_ | sm (Lmon) | 3 | Python | | | clt, pr, evspsbl, hfss, hfls, huss, prc, prsn, prw, ps, psl, rlds, rldscs, rlus, rlut, rlutcs, rsds, | | | | | rsdscs, rsdt, tas, tasmin, tasmax, tauu, tauv, ts, uas, vas, rsus, rsuscs, rsut, rsutcs, ta, ua, va, | | | | | tro3, zg, hus, wap, hur, cl, clw, cli, clwvi, clivi (Amon) | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| MLS-AURA | hur, hurStderr (day) | 3 | Python | +| MLS-AURA* [#t3]_ | hur, hurStderr (day) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | MOBO-DIC_MPIM | dissic (Omon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -400,7 +415,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | MSWEP [#note1]_ | pr | 3 | n/a | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| MTE | gpp, gppStderr (Lmon) | 3 | Python | +| MTE* [#t3]_ | gpp, gppStderr (Lmon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NCEP-NCAR-R1 | clt, hur, hurs, hus, pr, prw, psl, rlut, rlutcs, rsut, rsutcs, sfcWind, ta, tas, | 2 | Python | | | tasmax, tasmin, ts, ua, va, wap, zg (Amon) | | | @@ -410,7 +425,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NDP | cVeg (Lmon) | 3 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| NIWA-BS | toz, tozStderr (Amon) | 3 | NCL | +| NIWA-BS* [#t3]_ | toz, tozStderr (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | NOAA-CIRES-20CR-V2 | clt, clwvi, hus, prw, rlut, rsut, pr, tauu, tauv (Amon) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -448,7 +463,7 @@ A list of the datasets for which a CMORizers is available is provided in the fol +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | TCOM-N2O | n2o (Amon [#note3]_) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ -| UWisc | clwvi, lwpStderr (Amon) | 3 | NCL | +| UWisc* [#t3]_ | clwvi, lwpStderr (Amon) | 3 | NCL | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ | WFDE5 | tas, pr (Amon, day) | 2 | Python | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ @@ -456,6 +471,9 @@ A list of the datasets for which a CMORizers is available is provided in the fol | | no3, o2, po4, si (Oyr) | | | +------------------------------+------------------------------------------------------------------------------------------------------+------+-----------------+ +.. [#t3] We obtained permission from the dataset provider to share this dataset + among ESMValTool users on HPC systems. + .. [#note1] CMORization is built into ESMValTool through the native6 project, so there is no separate CMORizer script. From dc23cdf484d4194aad6fbc8d673452b1021e2c5f Mon Sep 17 00:00:00 2001 From: Emma Hogan Date: Thu, 21 Nov 2024 16:15:47 +0000 Subject: [PATCH 66/87] Recipe Test Workflow (RTW) prototype (#3210) Co-authored-by: mo-tgeddes <108924122+mo-tgeddes@users.noreply.github.com> Co-authored-by: Katherine Tomkins Co-authored-by: Jon Lillis Co-authored-by: Jon Lillis <68286976+Jon-Lillis@users.noreply.github.com> Co-authored-by: Andrew Clark Co-authored-by: Alistair Sellar Co-authored-by: Alistair Sellar Co-authored-by: Alistair Sellar <16133375+alistairsellar@users.noreply.github.com> Co-authored-by: Ed <146008263+mo-gill@users.noreply.github.com> Co-authored-by: chrisbillowsMO <152496175+chrisbillowsMO@users.noreply.github.com> Co-authored-by: Valeriu Predoi Co-authored-by: sloosvel <45196700+sloosvel@users.noreply.github.com> --- .codacy.yml | 3 +- .github/CODEOWNERS | 1 + .github/workflows/check-rtw.yml | 83 ++++++++ .zenodo.json | 32 ++- CITATION.cff | 34 +++- doc/sphinx/source/gensidebar.py | 2 +- doc/sphinx/source/utils/RTW/about.rst | 14 ++ doc/sphinx/source/utils/RTW/add_a_recipe.rst | 118 +++++++++++ doc/sphinx/source/utils/RTW/common.txt | 33 ++++ doc/sphinx/source/utils/RTW/glossary.rst | 39 ++++ doc/sphinx/source/utils/RTW/index.rst | 11 ++ .../source/utils/RTW/tested_recipes.rst | 19 ++ .../source/utils/RTW/user_guide/index.rst | 9 + .../utils/RTW/user_guide/quick_start.rst | 42 ++++ .../source/utils/RTW/user_guide/workflow.rst | 105 ++++++++++ doc/sphinx/source/{ => utils}/utils.rst | 14 ++ .../app/compare/rose-app.conf | 4 + .../app/configure/bin/__init__.py | 0 .../app/configure/bin/configure.py | 145 ++++++++++++++ .../app/configure/bin/test_configure.py | 76 +++++++ .../app/configure/rose-app.conf | 2 + .../app/get_esmval/bin/clone_latest_esmval.sh | 19 ++ .../app/get_esmval/opt/rose-app-jasmin.conf | 10 + .../get_esmval/opt/rose-app-metoffice.conf | 7 + .../app/get_esmval/rose-app.conf | 0 .../app/install_env_file/rose-app.conf | 11 ++ .../app/process/rose-app.conf | 5 + .../utils/recipe_test_workflow/flow.cylc | 120 ++++++++++++ .../recipe_test_workflow/meta/rose-meta.conf | 185 ++++++++++++++++++ .../opt/rose-suite-jasmin.conf | 10 + .../opt/rose-suite-metoffice.conf | 10 + .../recipe_test_workflow/rose-suite.conf | 24 +++ .../recipe_test_workflow/rose-suite.info | 6 + .../recipe_test_workflow/site/jasmin-env | 59 ++++++ .../recipe_test_workflow/site/jasmin.cylc | 44 +++++ .../recipe_test_workflow/site/metoffice-env | 55 ++++++ .../recipe_test_workflow/site/metoffice.cylc | 60 ++++++ setup.cfg | 3 +- 38 files changed, 1398 insertions(+), 16 deletions(-) create mode 100644 .github/workflows/check-rtw.yml create mode 100644 doc/sphinx/source/utils/RTW/about.rst create mode 100644 doc/sphinx/source/utils/RTW/add_a_recipe.rst create mode 100644 doc/sphinx/source/utils/RTW/common.txt create mode 100644 doc/sphinx/source/utils/RTW/glossary.rst create mode 100644 doc/sphinx/source/utils/RTW/index.rst create mode 100644 doc/sphinx/source/utils/RTW/tested_recipes.rst create mode 100644 doc/sphinx/source/utils/RTW/user_guide/index.rst create mode 100644 doc/sphinx/source/utils/RTW/user_guide/quick_start.rst create mode 100644 doc/sphinx/source/utils/RTW/user_guide/workflow.rst rename doc/sphinx/source/{ => utils}/utils.rst (98%) create mode 100644 esmvaltool/utils/recipe_test_workflow/app/compare/rose-app.conf create mode 100644 esmvaltool/utils/recipe_test_workflow/app/configure/bin/__init__.py create mode 100755 esmvaltool/utils/recipe_test_workflow/app/configure/bin/configure.py create mode 100644 esmvaltool/utils/recipe_test_workflow/app/configure/bin/test_configure.py create mode 100644 esmvaltool/utils/recipe_test_workflow/app/configure/rose-app.conf create mode 100755 esmvaltool/utils/recipe_test_workflow/app/get_esmval/bin/clone_latest_esmval.sh create mode 100644 esmvaltool/utils/recipe_test_workflow/app/get_esmval/opt/rose-app-jasmin.conf create mode 100644 esmvaltool/utils/recipe_test_workflow/app/get_esmval/opt/rose-app-metoffice.conf create mode 100644 esmvaltool/utils/recipe_test_workflow/app/get_esmval/rose-app.conf create mode 100644 esmvaltool/utils/recipe_test_workflow/app/install_env_file/rose-app.conf create mode 100644 esmvaltool/utils/recipe_test_workflow/app/process/rose-app.conf create mode 100644 esmvaltool/utils/recipe_test_workflow/flow.cylc create mode 100644 esmvaltool/utils/recipe_test_workflow/meta/rose-meta.conf create mode 100644 esmvaltool/utils/recipe_test_workflow/opt/rose-suite-jasmin.conf create mode 100644 esmvaltool/utils/recipe_test_workflow/opt/rose-suite-metoffice.conf create mode 100644 esmvaltool/utils/recipe_test_workflow/rose-suite.conf create mode 100644 esmvaltool/utils/recipe_test_workflow/rose-suite.info create mode 100755 esmvaltool/utils/recipe_test_workflow/site/jasmin-env create mode 100644 esmvaltool/utils/recipe_test_workflow/site/jasmin.cylc create mode 100755 esmvaltool/utils/recipe_test_workflow/site/metoffice-env create mode 100644 esmvaltool/utils/recipe_test_workflow/site/metoffice.cylc diff --git a/.codacy.yml b/.codacy.yml index 06a0ea342f..afe979f5c7 100644 --- a/.codacy.yml +++ b/.codacy.yml @@ -21,5 +21,6 @@ engines: exclude_paths: [ 'doc/sphinx/**', 'esmvaltool/cmor/tables/**', - 'tests/**' + 'tests/**', + 'esmvaltool/utils/recipe_test_workflow/app/configure/bin/test_configure.py' ] diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2086d60173..3478d469b4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1,3 @@ esmvaltool/cmorizers @ESMValGroup/obs-maintainers .github/workflows @valeriupredoi +esmvaltool/utils/recipe_test_workflow/ @alistairsellar @ehogan diff --git a/.github/workflows/check-rtw.yml b/.github/workflows/check-rtw.yml new file mode 100644 index 0000000000..611601dfd7 --- /dev/null +++ b/.github/workflows/check-rtw.yml @@ -0,0 +1,83 @@ +# This workflow performs various validation steps for Cylc and Rose. +name: Check Recipe Test Workflow (RTW) + +# Controls when the action will run +on: + # Triggers the workflow on push events + push: + paths: +# - esmvaltool/utils/recipe_test_workflow/** + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Common variables are defined here +env: + RTW_ROOT_DIR: esmvaltool/utils/recipe_test_workflow + +# Required shell entrypoint to have properly configured bash shell +defaults: + run: + shell: bash -l {0} + +# A workflow run is made up of one or more jobs that can run +# sequentially or in parallel +jobs: + # This workflow contains a single job called "check-rtw" + check-rtw: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part + # of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job + # can access it + - uses: actions/checkout@v4 + - uses: conda-incubator/setup-miniconda@v3 + with: + miniforge-version: "latest" + miniforge-variant: Miniforge3 + use-mamba: true + conda-remove-defaults: "true" + + - name: Install Cylc and Rose + run: conda install cylc-flow>=8.2 cylc-rose metomi-rose + + - name: Check current environment + run: conda list + + - name: Validate Cylc workflow + run: | + cd ${RTW_ROOT_DIR} + cylc validate . -O metoffice + + - name: Run Cylc configuration linter + run: | + cd ${RTW_ROOT_DIR} + cylc lint + + - name: Validate format of Rose configuration files + run: | + cd ${RTW_ROOT_DIR} + output="$(rose config-dump)" + msg="Run 'rose config-dump' to re-dump the Rose configuration files" + msg="${msg} in the common format, then commit the changes." + # The '-z' option returns true if 'output' is empty. + if [[ -z "${output}" ]]; then true; else echo "${msg}" && exit 1; fi + + - name: Validate Rose configuration metadata + run: | + cd ${RTW_ROOT_DIR} + rose metadata-check -C meta/ + + - name: Run Rose configuration validation macros + run: | + cd ${RTW_ROOT_DIR} + rose macro -V + + - name: Lint shell scripts + run: | + cd ${RTW_ROOT_DIR} + output=$(find . -name "*.sh" -exec shellcheck {} \;) + if [ "$output" ]; then echo "${output}" && exit 1; fi diff --git a/.zenodo.json b/.zenodo.json index c087c4ae21..be799a9dc1 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -81,13 +81,17 @@ "name": "Berg, Peter", "orcid": "0000-0002-1469-2568" }, + { + "affiliation": "Met Office, UK", + "name": "Billows, Chris" + }, { "affiliation": "DLR, Germany", "name": "Bock, Lisa", "orcid": "0000-0001-7058-5938" }, { - "affiliation": "MetOffice, UK", + "affiliation": "Met Office, UK", "name": "Bodas-Salcedo, Alejandro", "orcid": "0000-0002-7890-2536" }, @@ -142,7 +146,7 @@ "name": "Docquier, David" }, { - "affiliation": "MetOffice, UK", + "affiliation": "Met Office, UK", "name": "Dreyer, Laura" }, { @@ -150,13 +154,21 @@ "name": "Ehbrecht, Carsten" }, { - "affiliation": "MetOffice, UK", + "affiliation": "Met Office, UK", "name": "Earnshaw, Paul" }, + { + "affiliation": "Met Office, UK", + "name": "Geddes, Theo" + }, { "affiliation": "University of Bremen, Germany", "name": "Gier, Bettina" }, + { + "affiliation": "Met Office, UK", + "name": "Gillett, Ed" + }, { "affiliation": "BSC, Spain", "name": "Gonzalez-Reviriego, Nube", @@ -191,6 +203,10 @@ "name": "Heuer, Helge", "orcid": "0000-0003-2411-7150" }, + { + "affiliation": "Met Office, UK", + "name": "Hogan, Emma" + }, { "affiliation": "BSC, Spain", "name": "Hunter, Alasdair", @@ -227,7 +243,7 @@ "orcid": "0000-0001-6085-5914" }, { - "affiliation": "MetOffice, UK", + "affiliation": "Met Office, UK", "name": "Little, Bill" }, { @@ -279,7 +295,7 @@ "name": "Sandstad, Marit" }, { - "affiliation": "MetOffice, UK", + "affiliation": "Met Office, UK", "name": "Sellar, Alistair" }, { @@ -305,6 +321,10 @@ "name": "Swaminathan, Ranjini", "orcid": "0000-0001-5853-2673" }, + { + "affiliation": "Met Office, UK", + "name": "Tomkins, Katherine" + }, { "affiliation": "BSC, Spain", "name": "Torralba, Verónica" @@ -387,7 +407,7 @@ "orcid": "0000-0003-3780-0784" }, { - "affiliation": "MetOffice, UK", + "affiliation": "Met Office, UK", "name": "Munday, Gregory", "orcid": "0000-0003-4750-9923" } diff --git a/CITATION.cff b/CITATION.cff index 1934c36ef1..ab158d2436 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -85,13 +85,17 @@ authors: family-names: Berg given-names: Peter orcid: "https://orcid.org/0000-0002-1469-2568" + - + affiliation: "Met Office, UK" + family-names: Billows + given-names: Chris - affiliation: "DLR, Germany" family-names: Bock given-names: Lisa orcid: "https://orcid.org/0000-0001-7058-5938" - - affiliation: "MetOffice, UK" + affiliation: "Met Office, UK" family-names: Bodas-Salcedo given-names: Alejandro orcid: "https://orcid.org/0000-0002-7890-2536" @@ -146,7 +150,7 @@ authors: family-names: Docquier given-names: David - - affiliation: "MetOffice, UK" + affiliation: "Met Office, UK" family-names: Dreyer given-names: Laura - @@ -154,13 +158,21 @@ authors: family-names: Ehbrecht given-names: Carsten - - affiliation: "MetOffice, UK" + affiliation: "Met Office, UK" family-names: Earnshaw given-names: Paul + - + affiliation: "Met Office, UK" + family-names: Geddes + given-names: Theo - affiliation: "University of Bremen, Germany" family-names: Gier given-names: Bettina + - + affiliation: "Met Office, UK" + family-names: Gillett + given-names: Ed - affiliation: "BSC, Spain" family-names: Gonzalez-Reviriego @@ -196,6 +208,10 @@ authors: family-names: Heuer given-names: Helge orcid: "https://orcid.org/0000-0003-2411-7150" + - + affiliation: "Met Office, UK" + family-names: Hogan + given-names: Emma - affiliation: "BSC, Spain" family-names: Hunter @@ -232,7 +248,7 @@ authors: given-names: Valerio orcid: "https://orcid.org/0000-0001-6085-5914" - - affiliation: "MetOffice, UK" + affiliation: "Met Office, UK" family-names: Little given-names: Bill - @@ -289,7 +305,7 @@ authors: family-names: Sandstad given-names: Marit - - affiliation: "MetOffice, UK" + affiliation: "Met Office, UK" family-names: Sellar given-names: Alistair - @@ -315,6 +331,10 @@ authors: family-names: Swaminathan given-names: Ranjini orcid: "https://orcid.org/0000-0001-5853-2673" + - + affiliation: "Met Office, UK" + family-names: Tomkins + given-names: Katherine - affiliation: "BSC, Spain" family-names: Torralba @@ -396,8 +416,8 @@ authors: family-names: Bonnet given-names: Pauline orcid: "https://orcid.org/0000-0003-3780-0784" - - - affiliation: "MetOffice, UK" + - + affiliation: "Met Office, UK" family-names: Munday given-names: Gregory orcid: "https://orcid.org/0000-0003-4750-9923" diff --git a/doc/sphinx/source/gensidebar.py b/doc/sphinx/source/gensidebar.py index 970722ff0a..f8b766ab7d 100644 --- a/doc/sphinx/source/gensidebar.py +++ b/doc/sphinx/source/gensidebar.py @@ -65,7 +65,7 @@ def _header(project, text): _write("esmvaltool", "Obtaining input data", "input") _write("esmvaltool", "Making a recipe or diagnostic", "develop/index") _write("esmvaltool", "Contributing to the community", "community/index") - _write("esmvaltool", "Utilities", "utils") + _write("esmvaltool", "Utilities", "utils/utils") _write("esmvaltool", "Diagnostics API Reference", "api/esmvaltool") _write("esmvaltool", "Frequently Asked Questions", "faq") _write("esmvaltool", "Changelog", "changelog") diff --git a/doc/sphinx/source/utils/RTW/about.rst b/doc/sphinx/source/utils/RTW/about.rst new file mode 100644 index 0000000000..62883fe2e1 --- /dev/null +++ b/doc/sphinx/source/utils/RTW/about.rst @@ -0,0 +1,14 @@ +***** +About +***** + +.. include:: common.txt + +The Recipe Test Workflow (|RTW|) is a workflow that is used to regularly run +recipes so issues can be discovered during the development process sooner +rather than later. + +|Cylc| v8 and |Rose| v2 are used as the workflow engine and application +configuration system for the |RTW|, respectively. |Cylc| and |Rose| are not +included in the ESMValTool environment as they are typically already centrally +installed at sites e.g. JASMIN and the Met Office. diff --git a/doc/sphinx/source/utils/RTW/add_a_recipe.rst b/doc/sphinx/source/utils/RTW/add_a_recipe.rst new file mode 100644 index 0000000000..6e495e1f1c --- /dev/null +++ b/doc/sphinx/source/utils/RTW/add_a_recipe.rst @@ -0,0 +1,118 @@ +How to add a recipe to the |RTW| +================================ + +.. include:: common.txt + +.. note:: + Before you follow these steps to add your recipe, you must be able to + successfully run the recipe with the latest version of ESMValTool on the + compute server you use at your site, as detailed by the ``platform`` option + in the ``[[COMPUTE]]`` section in the site-specific ``.cylc`` file in the + ``esmvaltool/utils/recipe_test_workflow/site/`` directory. + +#. Open a `new ESMValTool issue`_ on GitHub, assign yourself to the issue, and + add the ``Recipe Test Workflow (RTW)`` label to the issue, see + `ESMValTool issue #3663`_ for an example. + +#. Create a branch. + +#. Obtain the duration and memory usage of the recipe from the messages printed + to screen, or at the end of the ``run/main_log.txt`` file in the recipe + output directory after running your recipe on the compute cluster you use at + your site; these messages will look something like:: + + YYYY-MM-DD HH:MM:SS:sss UTC [12345] INFO Time for running the recipe was: 0:02:13.334742 + YYYY-MM-DD HH:MM:SS:sss UTC [12345] INFO Maximum memory used (estimate): 2.4 GB + [...] + YYYY-MM-DD HH:MM:SS:sss UTC [12345] INFO Run was successful + +#. Add the recipe to the ``[task parameters]`` section in the + ``esmvaltool/utils/recipe_test_workflow/flow.cylc`` file. + + .. hint:: + If the recipe takes less than 10 minutes to run then it should be added + to the ``fast`` option. Recipes that take longer than ten minutes should + be added to the ``medium`` option. + + .. hint:: + The line added should follow the format of ``recipe_new_recipe, \``, + unless the line is the last one in the list, in which case the line added + should follow the format of ``recipe_new_recipe``. + +#. If the duration of the recipe is larger than the value specified by the + ``execution time limit`` option in the ``[[COMPUTE]]`` section in the + aforementioned site-specific ``.cylc`` file, and / or the memory usage of + the recipe is larger than the value specified by the ``--mem`` option in the + ``[[[directives]]]`` section in the ``[[COMPUTE]]`` section, add a section + (in alphabetical order) to this file as shown below (round the duration to + the nearest second):: + + [[process]] + # Actual: 0m31s, 2.5 GB on 2024-04-08. + execution time limit = PT2M + [[[directives]]] + --mem = 3G + + .. hint:: + The ``fast`` key in the example task definition above + (``[[process]]``) should match name of the + option the recipe was added to in the ``[task parameters]`` section in + the ``esmvaltool/utils/recipe_test_workflow/flow.cylc`` file + + .. hint:: + Set the ``execution time limit`` to 10-20% more than the actual duration. + For actual durations of up to ``1m45s``, set the ``execution time limit`` + to ``PT2M`` (2 minutes). + + .. hint:: + Try not to regularly waste more than 500 MiB in memory usage. Typically, + rounding the actual memory usage up to the nearest integer is acceptable. + +#. Stop any running ``recipe_test_workflow`` workflows:: + + cylc stop recipe_test_workflow/* + +#. Run the |RTW|, as detailed in the :ref:`quick_start_guide`; it is expected + that the ``compare`` task will fail. + +#. Update the Known Good Outputs (|KGOs|): + + * Recursively copy the recipe output directory (i.e. + ``recipe___

Do9U7+}!rvCo0_EV~sN`sp- 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 w+|Z#u(`13(?;g63 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

    &VTJ!3iojNf9E1d{@RU45dPJf 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 z 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

    E(_-P5u*T3PWR+ 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%0A~%E6!L_*hJw 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 pzr%6?CmEna=rn^9 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 XvX_~E`jgmQ8Gyjk)z4*}Q$iB}$M0LH literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/recipes/figures/bock24acp/zonal_diff_clt_ssp585.png b/doc/sphinx/source/recipes/figures/bock24acp/zonal_diff_clt_ssp585.png new file mode 100644 index 0000000000000000000000000000000000000000..683ac9095609079a7077019ef4991bd6b6c883f5 GIT binary patch literal 241398 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

    F?B8S$V!NteQBKl$*@>;slYwO(Lrl~o? z32nNu17|}z#K?S#3Eol<5@2$VHM2@wK<#$VW~nrHYNvyXf6#Np9j=FXh2_gDyl}Ib zyee$t`>A$0SWFh#_%BXVb*nv*PfPJn9npjVj;0sxLq$}H-@jjxyrz0a^!JbJRI>0K z7Vtr#BAM&yE8E`=4f;CFBe+!YvO0~N*FPIv&xS8X$yPg-la7LBXH7;4t-#Avx1)@6 zgaE98TWZEbR!uir_YNun7kaP|i#4{`P@BA^Al>?I(FMwL3VnBF)NO+0Isf}B7s=HX zPIX{uzAQ|@q-3I zAi@l`W}H-QHi#%`)P-;MI5Ug=Rp!b0--&Rf+#mW~RSY4e>#Q*H+#=&A#D`G7(m;05 zlrx72dhaM=9waM|%2=I3*d;qD8_Y&s9sF zXeiGr#7_r*Wbc9$5V!(-xVrwRi!y)Zgu=?CVro|Y{418h1EKw6Bwp_I9(*lgmUh<* ze?!E}edieVvUm=fRoxK0@l#JW(6Pu8VUl-6jD_8j!%7q+B}`VbR_Jv96_3Wp>jHHj z4Kc{{y87J5cI{hYWw~l)UV?V@IK~m zdN5Ui`N!i)_0a{obpw*3K2P?x)#3Na3$T0mAYRzwaio)tlt>=2O86g~00y@o659Cz ziikKZwx}`AkXl9&3baE5GMCwa3S@($ripe-vd#@AMwr#xgfz#siu* zF$04WbsAf9HG6s+?RFW1tidi-;8y&2KvRrTMi#mr6$cvgAk_?XrJ#qj@=m>ogp5h# z9WwXTJqq$4L(M5q^eO7;qntUj>p({RIt;$b$W#)D{+ZC=m}lKAse*pvI}~n88$wY% zMwY*lA=DCzzftZ|rP==p)D+)IYjcD|RU#>2Y1^>UUdyoTtH%4ZpV{Np*zYMgYWyLH z?q*HEo;LaRC5RH0Hb$X_fz-Ij1k85%L%k=TO*pDVDaSAquGg1LU}k* zHigq1403|hD5PJi$bqs}enotHMVjkT?Qu`Z$zC4Tl_6hn?I2FPGF*j1*$nVlXM{ko zwIakI=t;w#B<#&b_0a`L3rG8LyOnGVvR>XG_I{9Hfqk31!p**uKGV%zaKVEQ!S2Ky zTxGtz(Y&_#_2Exn&JSa_FQ~bZ#OYD0=i%lT{e?G}RBHy_XkbI_o8fn(4>u~s5XK#2 zq}Ui5hF1k8hj6Qj57t--J1u2JF(V?bd4C0>j|3b1l*4p}Ke0hBe`>0~6_1Toe`CM< zhZE~jF>ZwOp?cby{r{bSF)!^6Kwn;_a%Ix_5p40&Hv)+ zESTa9wr&jx1cC;41`qD80fM^(cXtb}3GVJLK@uDW3GPmi!QI{6`CiUBRk!N?0BVZq z>F(Wouk|b$uaZVk|0%Q)c)4k8v3;3FqOw4h#$i&4Aay~o9{i$EnbkkDLSvGdnh?Fv zaZtEuF^DSrmle-!t9b3GK(#af@0N`)Qh{pv`atZO1aY1q^B=!cnO0w}>k`h5hZtD4 zh+NhJf$JYebP>`z5~k#O-+R=cUe4GpN|R=ZC&n_Pd3`PJ2L04;8_R(Q(Rz&S)vzPb z0w@m#DlI~Kblbg3t3+0AxyB3P!&HWC`RwKTFeiaLfoAeMC~7!LBa9QyJ4tJ=#Hwyv z?icK%T%2)>;_~0U&b4-3eE+=T@7ek}uW8|JUv|R^p)y@ZwB!Y?x}(?LGgEs*qILL$ z*a3ZIa5aM%sj(qVC^!a(XaQ@&mJJQZk*TSiy0b>4L$NP@Rf)Pr^eU1EymH_6ejQK_Ihu)01_5;f&p_b=7Qz& zF4jNjY;B>8kR0uSudH{k=lhiI!oiluF44NxrgP7R=qgCGfl~Y*8L%ER0^^Kujgb~` zJG#31cqQfAKGVv+I}k=zKgONW^)bnM^{7Ht9LZ7Q&Bgi8{{J1wfq)m2fO=Y_P^T32 zr||^StloahrJwHQ5v|*AMQMAWo3#LYbb(m)YxVqQruMM10lRPR;2=AI8zJpLCH`0|WyP;b%+MIvqms#Hejx7o;?GK|hAzAT zjZg1Ja#wZZk-mJ)=_sDFeCpDBsk?k@J_Z zsbQ>rYyE=D*Yfph4Qr3g%XKv4VHkG3;SVKToD=FkA0^Zs;?dQn07eXS75y0r6w!pkhE{gG0(HKaiZ)l{acR6eWD;;0Jr*h5M|F9ZE9#c|c>lHQ3Qm3YPTlz6)|7!8v#L5)#=Qj1|fP3O2+4DdQ`#PD$gP@BP{o2rRSxaGfYo7abbBrvn|pGS@F2x$YV(( zO$26`JgS_e&ToKcfd)6#GwJ(uhp+7^1@An~UI`inakc!H#Xt^JzCY`{&}Sl+ww#fhf%!s!HLkO?Ia(YFQWRB%yH_hj!q_W{*%ysL%GNA`u-KAm7)BoJ-bmu6>>-)aiRZ|rK zIUj<3;8vYW9-UB8cf6YV=IpurWCb~GG(H5)P3~>!XSZjs!_B3=tJKzAua_t~cEqFzMG`1X1;+UTj6Hy8hg>oOedz6|>nvIa z`maUIKcCf81Ft;9S{j9ak)vm=X>j7viE0-y5M6TyQ2lkm z;*-0}^0JdxS@pXui6+fe&~HTlVt+aXX>b{Z`Lj?&OocmW)oWDf{H1Ugva!YEdJvcJ zTI4#hv84&N5a8j;Um7?cNQX}po#AL%@40$Dw!`eH#~lc++ntpzrlWpZ8z*4E5FuOu zEMWRF4z_&)*R;}PO$UqAus+n74DyI7-&HJ!!3i!-mS=g!@Lm&ja4Ji@#5(kFF7sN=#{PM;(NxETjH}nw#5C+%e`a zXC%u~;|Y!hQt=3Xc02!uD7d+~l3m;3qQz}+(S7rYZGQlKdb~JCzF0G8x;9Xl;eHiV z`1BG+SX_oQ@Q2Wx=-YaI2%jq-LcAKU!mO*wl7NE5F!wk-((!@;$UyxJ=o(Y>;nH3Q za&v;Q``m0fCqB07an)7zB_1WlNrWeSSYR^h;)V8Lz5iJkL?s^Llju)&T_P{zx)80} z4EF)>=Q>}R^fV@}n62emzYu2kw=(+DsPNa0YS0cFApx9CqRU*W1e;9UB~eAi6LN!e6LH759CxACi+fD7G$G}D z(R5Tj(Vpi|MpOl{I;SG zHzFybNrS!F&qjg$fcan8jRWJ)Sd!cS=g+uW?(sDReE|O4Ai1kwm3tQ+)x4w0n7>CqF2QOKstZY`p_6+{-wOs@QF z2a;{NKrz+B`oYf60BhSbI~qHtR{yzc#r~{QCihUDdtbZiDZbUNzygJb&mA^{i!Dm1 z;R=aJ{+sl=#z|F{Va{q42;?nxFOHD`)9>_Q*3Y6`!&O5owX%RAxA0R3afNvKkw)M2 zXYb^+jddcIaO9A|Y65X)m*S*`-%lf@Yz5m*~zh-a1%(32l;JkT#LZR^0=L&1Q-bQ(WCLQnz zclQ0uyX1io?nIHg2oVl<;+9BYp=TX6g-HR00`vT>wcLSH(&#iYu5qxA#{z#9yw60W zZR&F37p^{s!=lv*kecfwuW|WhTpiofF-wkt)S<{jH-f&`1K(p=PSXBbJ4myy!LKQ` zO&qWMVyhhA-rdFX6Ok?ES8GuPKUwx*lCQ{^5mu6%z$FJwD}}V3-lzP*oKU6G$}sB0 z^D`cwXx~2+zaK20u0<6^v~5jl-+vyV3arYIwk1z$l<%~)lonp7z7P%JmRc;p97)&8 z0NcXljaHuM%H=a8GwiK@qvMM4B1krcY}6a0%4Y1uwFg(B77@dh3i4RmVvRbkd0&b_ zMziAd>P{Jv1t#h+F*L(8h2uqwhUTyW=MwKvw+8e3$kE{p9HokF4F< z=aqqu2pUfY>fJs&{VG=vE3yo{Bh(+xc<1s3ZtQFcsjo4!Q9)w9iA@?*f5xfZR8X8O zCLg4R0=bo#kSimcH1ei-s<1N&-Zwm-!@sQBEBtC^ufC3KUc4bft;pA*8(-Nt4_3*} zP)uHDR=eX3>GUse=nN*9w4AJb;hKxkgg1JPRXD=38GJ$lhA1k(Ptkv9?CZShvXy8J zQAv?a>GhTO;i4zRBEf(Pb8!mkZMKoh1|5C}K7-R;FYF8}^{gqP8pZt-ztV`!NLA|D zF2!%x^Fi1HR2J~TSl-~FsHP~OtVaAXJHq?XEs;on(E1D_*D$^b7=CyVw%2 zYxq9GFtX9J-;eb79VafxIr<@_j}rc6(n zA}2$5<&V?MdF@@L*ZY^p&JUl7(g--2=4&wZa%mzB9seGF8I_4ZkKR4V2m0#P!X>|_ zkpGU{&FCjS3AU7UP9065opL!MS5C@}x(#eCI}`elEMiqFn3&QuT4`jJJRjd**J{>! zP$j27DII>+&mIF5{Khn++VXy8I){SwGGNk~kI1@IoGc^W9Q2RyjYQ1PJyQ0ybGH;w z97Ty&t3t(n#JHRb_ttkX-f@J55JH!Zg zM`Og^1v9PXAC{b%j?O*yFYpA-MtTdF)kYKJk>=3_@CDAQ#tOng$_PQEk$u=z@T6ba zEZ!P&3(Pw`__6Y>2dL8EzvTtL7Oy}45twR);aUwY1U#60wCk{@-rMoHw^pNTZHm?= zjhE|KP?x$s7dvT7&jagFPlJxuseHz_kYovr{@Cvr{*BPQ z{v)c~_p1;bG`Pa|hw3EhR`dQuDv_MGU+MK5pDC8Q_V|a81T3BDQ>ak@6Q|sC9oUpF zH9Lc&s8j+lek%nDwx^KXzy-u)_3{>>->6(ahRFuz++E#^?SMxzz(}OhG*3O`o#Qns z27t;mtrghJ4ff9hVN%@r#ylZ)j4;L)F`Sd=ZV3^d^Je6Gftow&a{2H1HpfAqD;erZ-@O z{<67|W7M*Zd6)0P!i*S713_CgXhAk#1qoQKwW10yJuMj`Tl7?{-=wO<-mWaI&->NB z`%lEt`gML^<1KU(}p)9N=j{R~C9aevGu%S9}P*U2Cw z^*f!(W=TqzWYSZ%hX(adEg{ik_=hpy41AY(Y$1N|*CQM*BBbGfnWlmDfvJ{Q zVTe_M{UaQd-KVxta}0PA6E3m~C@7|&E4GoMS5*ISZim0e{Zj2d5Mav0J?UoT=3G%Tx(!FfBBfoO>vWUD^+;xBWT z)Iy7A)-U7NP$^~JLY3K$OKXQgQav#OGcoLJzcBJ(0OVvsTE|ll((BZL}@Op%boy&3d=S?hwgF z=KImb=+fC@Ldg`|Og-+IKaw7^Q?t23X_bvH(=hfGtFd&{SGsI%u8@#yU0FYdEWs>C zBcKD9mJqYRyspt%L%OS>q1N?x`c>j4O{gpKHL&YRKuD9Y>g~L#wH4DAR&yZ{bmP7q&sI*=*V|R?agGdM>$&;l0}nnmES!dlB~9O~V$mJDG&T!m-$?z_m0qO5iu#x{P|x^jTlZFi|W9 zBklvq@Z1br(94h-s|p=>K_zuoZ#%Vn(c@w}c2!_%t&0nc>XB_qlRpM{lhz=mVULLFY{hf9( z{Mh-r@b$#YipCZeWDE$H`!!go=h4l3`c)K`O1)FM4 zmLXl5GVCm$w|+a;4RMZq#G^dqo3wA7q{P;8SCvOK&u4{H81{_^y<*xaameYd(uF77 zN`Le$KJW7%q30N2bm#0T(3srK^Zhk&$@bY!FhY8_`b#zEoNv2L`yfllrOVvCKcCBC zxBhYO!t1U9$9@e%!q=qo!O+|`=m$CKqPUKE63xfytQv6`C$@gdb~OXi>JnrF2=Xtw{9Ev z@2v%0mwuu&hq_2cEP8e@aIemTZ+Kgu%Wd}MC0x~*7KiZqTLV?B`-einb%7m>*X_|k zO(}-QGy7%B`~k>WkP^Q{}yHVqg zt<%Mbx+72yd|pCr_T01_Gp0lyQsV<^Z~;rj2&~eb8BK1!;i8JvRiT-+(PHE*trR2* z+JPuTalqF5#9SV3C-YXu`^N5pcS4ju^y5AD#sab+bhW(!SEOY<#k`eOsZTY=ojl{A z2VXnYLh0t@7ol6lfo~qq`MS<9Qj8SG>0fD%@w`8ocz3pwVcnK!v|fEwL5eMTI0NvY zr<}l+*}dJ664^SvEQJ1*!i#XSO- zpV`CvmC4ou+&o)6t#Y!oU#N5y#dx1TP#0P_BD$|oJsdKj@5A>yS@aMmmH0a@Sd7UR zP7g-mdIJxNKAkyx^FG`^hCI676$yrj@T<_h8=K`D@BSM=mC z9;d?w4UH$P=u!urphIf^@v0J2Xnlbfry?_64gJLt9MB_vg!azmzg~NowWeLaFXT7D zwtn^&&0jica-*oMx2eU6rBpXEF(AH;k7)K9$Ef{k?wxZ78IAHyq0EHF&u_vsn{0av znDiywqG-F_enH^b+>!udMX>KesGH<`Qj8mHK>7fhu9CL*dGAu0(K7@Z@03v2r*ji* zd1p+IqCY+=X7BsM6fxY(cLQEWqSi(@4lBZwit)(} z79=j&(T@3o3*WwSuwVvgr6&+5QrEbm6xx)PfavJ`=UHF~`k)1(Ioz_1>` z-}8kN?JV;PZ$LI(Hu|F++a-j~Cnr!bP-XT@G1)&HubMI@IHY$Qs1v$6QW0?h9lD7$7(h{(WL7irbM+y~qy0PfUXrx3XwT@G zGr0`v^zkLP8^^({X2{Sn8!E9}LWPmazv~s~H;6Rq&1YPB_^hBZAm-(3gu!kUGbZT7 zq3?NM{RFm0G)1mugZ-!HjPk8OG9O{p_eozWY?lXMn*#_m^Bd#RTbrFJqR)%k zUXvil{JaxU+3X&x?zMb$R62SiF)@1GZVjMbBbwUe_0e-=hQ~8O&uk1O!tS)dSMp*0 zVKH1EBlvk{uXDEZm(QUFW5u!Z$Kgc(bNxKWa-?LX9$sRWz4?}M*tu+9x2*t`2K}w~ zes?e_E3dHV1!?GIhMs3+vp2=JIn8U%TK&rGN}6S9&+Qsqo8C~#ZZAJvPbm`%2X<|= zF2cWdw=C(jIX$h8@6=xynKJ16Txh+_PG0e}uXyA5vU*JKak$ z)q`(X8#}9$Oa7jnE7Oa}&voh%XaE?Xw>ck}-}emWK&@Hd`b4p{`%z`kW!&0t_BKjE zv5EsM=+};h_GepwasLtoFjk}AP^pzZ$JRPt$8`ZQe*yCO9e_yv*Zwrzel{+O%3}VH z5U~Cc{+T}TwYfhT&8RkR8kfnK%v_1yW)|SH?eB8j{-yps^27TDtM{gPiDIP?5snI_ zi^pIXQkL|lYD@Qw{mP2GhBjndbgkNBuQIqi*-%z!>C?u8Y&UH{8E)eYz2DVQ4S24t zH2P%lxs&;}>Y{$~on&{VBk!|UiLo_H$hAM}+!un0C2yzkM}(Zw?(?+so?d>6E-PK{<(7L-><7KS3gbBy{z+qK>gb1@D_BgVm$d4qF|tL~dz zcl*tL(q8phkDSZ>j;n&vpPRFn6c}&-Eaw33vft}-%k#1QE`z-XVhE8dE{=`^^cyD^ zRp^O1_GGK=Jj(toh{^k>Tia#Ue{jlvuaE5b$Uvq=@bl8cgelw1+P6F$&S)J~i%?xx z7->x~Pq}IVEoFPmOK#4;KF<1?hROZwalDz|UIc@(%zBM3Ki4xkaBv{ zIG389_bN@``RBAUphVI)`R*bhpogP(gq-0!t?lgoQuyv#9N(Efb3RImJV!}rG3Nt` zgfpQ$>490rE&M8DG2*oz$Fn4gHG#RHQ=vPcrT1`JU#&7-_$zucWX4cbKi?SLTT|cr zwCtEeX20v+^z@ENeTL1L341f9rv|AMMdp2T9f27-g<$fwVgx_^^q^(`5iTs=1HTx1 z-;b_pEJq^~{Nzvhzqo7Ej#|< zAP-|-b_@Idqd$v7|NBzr_hP}XTa6r#f5k*wX*@!`cC39_#tdEhj|2o?bS2s%B!ph5 z`^N;bdsVP&jUK|Oz{;}NQl!k{l|Vkh9gz0%#aX!@R{!cFh2AfNBqD3 zY`08Vvs%r6+?z-ML|Tv$2m~=)MDqVZGUs@mrz|y#`&H>HfGd(WmMG0{HqmI{pa>`P zXa2SKZ9MEl>n?_PP=2pfA@0p+RYU6MexrE@spK6v; z)6kkpdDz81s%37<1K_yt7mdx4A9{F;wyu@K9)L44swCL7gB3~s@ZB8Pqu;pMs3quDPAL+|NO6@Nvf;LX?Vx#vTcR{Ww-5*RMNkJ}b<{u@&0Q>#=p;Teip_1qq->p3WT|h3GGj@j)DP_5 zEPW{FxEA-f26;DU9k=(Jy)dF;{f|z%_*kY44CV=pG0$;l%BH*V3&lYUcFhrLun!VwnZ#pJKn;b6pbBrbGkx&=`J#syx>;T zI(#nxWNon1-;qDxN&$#Gh1A`FdixMy92SK7AJ^4lN)X5r;Ix@z-r%hK|4^>D-JbqZ z8>!ttIcMz3&JOj3pngOR>zI8Ro2$^!{z6AyHxG5wVeHvgMd`K1gZ&BB>)*}S&}|nc zMdI!m^hqWU-Uv5~n-YdY*O6o0ai!0UG5q055!Nr?dRRJiSdDHC$iDu z`ZA^wQP#90ve_nP7cjN){WPiI;|~!yOKz9>kHnGq9(E4GZjQ=lw`DH>j1#crG0H8wJKsNhd9-;LvV6-Oa|)?HDVxCc6Cq?tgds5oB0jjz3qa4I1a^%-3!-_$ zf$)UPH)`=4au`6nqYBz-B&iyUXSqH6KRhmgO?V4l_`91evF)VDypR^1Cr*c-FHN+b(Ri#!gUsN3y*?K7vWF#;w`+Oz7+{j<^T&nf6aH zl~>ne(-6)0+hy-jKVy~s-S5&h1XXV|x_SMla{>^jJamN8^tq<~|o z=g%J14tLDu(UA=N5?;5SvC^s^Td#J1^+dzO_ac>12BJOI033=t(iY#LbAG(c5l|Co zZC*TmX)Ppcb@!?}8W)oO$$0X8IPl?)6YFsy_CSM*Y4>loC83Wu=r|2Ub|Ws=qdRA0 zt0_mUWl10bwbi=UfOeRh)512DrFX?R3bh>B7rwT5!K6>I3;A z?){?wWfa?at(NoN$nt9SD^|hpU3=1SdZxx_#h(m!>!~iqR4?q=|H8^oRNngqFx|*P zhrryU%^HndFT0)J+zlUylyRf^oru(Yw=8G9c-3T+bL<+Ea$H`Kex$tPZZqX%8uh_B zz8?yWQ9uN#^SI7y5^|cq$~PtrcD&USS9iML zMq3MZj|QN993rh#M7hXm)K`9D7ec+_+ibW#LOexn`7@{V7o;*evnJEZj%9VoC-(Dm z`)A|7EvDyqWqVIlM83Q!^~t(lemh_mCQm0K(n*yO*3#bA=3jcrp6jjsLe}4!PXiT| zUc)f&Z`hd9aLV~161@zMlnC@4l)t7(pgi)C6%(1#AS5HxcA{eWRUeS)0pLE!A*r?L z9^&KueUUz@*}y_MdkB1b* z{8<=Yak&aEesqS1m-N6Pg~Jz!H-@uU;V6?&y*SW^v?LUdF~z6iD#C=t%8 z#RZ`Lh|+eYm(1a*6Bp!r*jk%bQ9JLuH+Q;-+=RNDP6oU7AMWII`Tq*}9c4Z-$KSYR zMXcw9Wo`D#^q>_(Ii>0UrIy8u^_A`Pl-fLb?SQx6Rd+Z}K&XR~Din#AC6_)s!|P+z z2%(cBh_2!JaqX)Pu!uYv^(|th+G`ine$fRs@3M%$__nQcIX`01k<``Bcn?Udc!EH_ zn^{||&|wo(`Me&@NuE_n>YyZF;#_2kvRL9|HMah3i`{d3feS}P1XaK)r<9~nZggkzB`w6AWxAN|sjXuru zoo*i`=q**+Hnl&ZRd~HTLV0`tLl6}BcJBRnA80F6<;oRr$F8=4{F~{+7xa!+KLqPG zzF!VC+*NPSlsCrD{o4&%-mo$R#9jOap!fH0&yxGyV)g7KWgXXfQyrJ-Z%f{nqx?Y1 z$y<8eFGcD%X3EL#%qh^3-9e$JUs=E~rVH_(4quQ+5sakGmG#F;s@mYyipnOEDWxA` z7hn3_=o$`Hp=IOW<~(qo;9CSwHHD2!%-N=5#T`1UXTK z-(ZKAI(j!Y@=6DGN>%d9nbhBXn7YGPyyqc7Gi&eP0Di#`jW8?#IIy`r&Z*gaDSF8+EYa)gMe;kl| z=m4-9ATu-d84MuYoiSNIa7Hs(qB7u@Ppzes3#`{-*02mNTUKIB4yy)pZ7c&gg2OH9 zdoj;e#y^H0F#yu<#_>jq>DTAQj;^%U0!EZoMw}Gxx<~7ls|_4U*{*}%!#un>=4RKV zP%~~VABDzySQ^vV_fjYAAlbEpru0tHL7R;>8GfWp439{05aG_%9>D`PnI%q7URgdTn6vX6drTs2`l2}u|OQm_`f zVpXk%D~<#M5iYEUcmJ-Trsa7LaDai`*EJ+$d*~$Mag9F8_EMaQ27scEo40z2DcdEj zizt!R;%R9sek@CqkM{u1xFu=)sV6e+t_4B6=Ph?jh^$@9Gt5xkyJH68-RviNO*bUV zj+<(Io0cfa{!G@*Z#qpEz}I#)FH?2g%Dp=Gka6|8+ZGmJB%cXI0fkpvU(fmW7OXPt z{=h$G41~zNiLE z*<|czl}X^yT_&E8AfI+&L+W}$(e~OO$t_|M&2nCyWGU4S;`3&8&$xOT=agjT2(W(S z{dV`S^IoTS0~Ht1k6w0Z6-t$hUe^nHw<~# zM0WnLU21OCTRdF8zR6EgYgNe69`kr@q@}C;l~g}Ga(g);F*&m2H74nHA~5EWy?gtJ z5LQJ1Lz}WpMfU&J7%Otg^WShT*tYzrNjoJB3+mPi`meiXn z!Z77RgI_%paScU&K2q8=-jpBr4bK@*dw6}FPVX_xRTi7i!s`4+k1rXwXX`A7o_v2P-&uKDwd21N zg`l+@tt?=vl8rlGI)d!OFeGT8XrRB)6J{c0`4G3En|vgnwsi7@#~>}{ltS7k9qJnV z4cU&6|z*sQzdiG+t^r;t%lA0jS1 zX=sp(GcvlTf4laj9*ltu+;C2C+!lLipaAes+FNr3n|)%*Cn4(z?8|%*q)kw)!pd-s zDLmI51gjGw6Cq$1el+_?!W@3601I7KBuvG$k9W3DbTNoy`dg>6ClZ%~I8&Tbeu6IE zW%B3xn#Fz+swd1?3iU_QG_l5KlT1<_%8xmH(4ohBOV@L}fSm&V$2A?wMQ~}oLsc{W z>Z}q1*?Ph%x#7LBuQ|*5MbsT*dW%`I$qDkG50M6r$C7(Z@*dP-c|_=6x6?^$`KVj1 z8gITLwfB77U{5nl=AIrYMXi_#zyrx)d==r{XrwhDBIp{+;}Pu#qmGVFu3+tWwey4& z>mwx&?M&a~fy3;nrDqSo>j;EHh))BC0e7@L>d~*!4H~ID_g4%s{F9l?)sW4%*Ro{ zBHJ_h*9Sgt4^J|7FilvXE~8&PKJ<*+*!0sLp;oY|#k)l%2m&pV=$a?O?UefaMDAYh z3L}zZiO_YU z6ZNO{-sN3{HPAU~DIq+IR3L_>Ot^gY6f8$R494%{p-yt3&c%Gkr1bpKv2uw|$9QwMoIc%YKrSxn3 zx3sN^>1hmggoQi0j(WaSNN;QV+DQE?E>2*etS~?RmevY*kAt2uLt$q0d>*I0D|kgt zf+HDiLn(!)jt1(c?gQ5*baM`P_Y+3^H<^%em?LYq{R7k&P%w11s{4zH7g6^(Y@2Fh zpWN7(Z*9rp7F6b*Q+}9U*8$a`LZbrVi!Huk%7OebvAsB~y0B$8~LZ zw@+Yrc;v+-ZZ))Jyf1lq>=?QhxC{H!Yc@O|GF(TuL;M) zL}O+2S;*X~+Q%QN_@*oo!3R^nGLB^7=3_X{r8#+oqpXa<$+elssjLc}WyO3>DCt!G zyz2!N8TckFpMNj0yz57-ssqxvw3Rh&;UcDVo z&H}u(c-L0}S|gUp{Xn0yirCSXOhGLsiI{M0>usr&aHdg1GWV*|9pBPK75j1(fIuqk zL*h525&cW(c+)f7{i|%#15I$iqoic)5RFsNB#(-b6QP7*vy~R2NWna6-cP>JFCPlk zv&j-JW99Ml_!EhHZ*=pEm2L{mt0EtBbO&FbcF>8J!I^nBnX&7RJ2kE=uHE0+RpDAa zVTZR)if5pztPD}lr6S>CxGX;pr!@G5_^n)UJRFna7r1zzN49VLS*qGMxR^!?Njg)D!%9@&kZ!tqaoUFs2 z5RTH+RpxpV=PHSO@9|c4k*s%ewv-d9FU&#oG|p!iY%5u3h!(D(M^q|D0U`*znsUn6 zF_ZxBzAInwa3y0jJTXB9CvUAM&*g^ztd#mc8E1*&6!hc86Spi_zlRXHxnC=xEcTw? zUn<`wgj!>cdfuomf9Tj~(?@sdt2D3_S!-k#TIpHDhCR^4*+Ur%Fpt8M)-vMW_o;x-p9UC*;;g?c%5k4cGLBpO<8 z_ouhQ(P$GqDgtK}B72U6dw!{q$vwO8eRZO(-DcHcz=m z7ik=a${+aifR3ew{yVQ<=TdZzQYeG}9qYp1;HD=;Rc$`aiE9DQvDe25$3xzqw8@AK zj4f$!&Dp<7=ejGkPIl@pD?S^_pH#DAotJcHHenLACLLKbY?g6oB8`$9{!L61Q~Rf& zh@E0`iJx&hm)XGUZwdb^ePy&~95$LD(I%}jv{W%{KbA@Q1Dl{UjZs{hk6jmOR6YaV zz}=Kp=P9LhB*ovG zMYjGERR(GTQ*brm`$di_qWAsCzV(Cws+_^QAjYzM%lPd}PoD1{aB>{`AMK5^D+??U zL~lK=3m4(j`t`c@WO9I$UTjr_Cg>|!l98biBMZ57C)34hv!6)cD2tF_NV}#B-|#RF z#s%BnP#=b&UYRedG;U)BnRA&ME#>{P=4e^Vb^A?S<@Q^uWh$FF3Y3qJPYV#CM~WSR z7Sa2bu694u(B={@!PESSjG5f#^m-5PDoy{mfO*^mno?9!z(ctY4F+VH2wyPBfA>zm z63PEl9;uiE`S=p)m!CxiSKQL5F{?2ta7-Z`;wr>=rTzg~KS45zzTa{yn&4%smBfR&RxgT)wDJM_-&Ey7q` zr(dyf2%p%odY7k6v-29Bj7X?^!-Ji5#^7k~M$$m*m0V8(Z5Q{qDQ%EiXXc?aesR&#y93^)OHzl7vU<{(KxLfz)RDxdgNRL`u3#jiQ-_|hVA~g zoPAABT{b}!oPW31M21fc;+Mp`P8YQY$4P9^KwMdcRC-rF zOo?7%{UKb^{h$N9hV6e8f(C03?;wnto?@#`c1&2Uh&Jpt*u+EDuju&=EW6-IXK`GS zZ%-{;|0&NPND-n_0zK}MlYYTpm&9X5>olddRZ>2J_EApPjDXcg&#hPO0pe&yYo^EJ zK#l4mFnEe0_(ePKd)LK^pV029rfzj)Big19-HN<+TLKqj3#G*g9HGFV%Ju7)Ngm10 zGE{$@-fB4HEMW2HN6L`C03o{#Z^>Ziov6OCs6Kn5Z@mK(;Ekl?*oy^(@xJAK^$Xrq zs|bu}_FFS4oR#w_Z-s{okM*jf({u@c$xWkX@%W4WiCqdLTJ%-L!}IY6$ON`FpE74dV2i_i4hOj$d-GsNV@GvUQ3YZbZO)Y11i5fBNX55#1T?p$qSG zv7M4iydJUZogVNPr75EIZm3vLrw@NVtTJf7tOb8xm>u6D0mK!!w)WIcre;HFSzyhhJ(f%jwfHeY>OhSYp9^uWuyVjC;nQkH2andw< zc(P7a&G7-t->y(74g4Piilm0}Il~&o$gD6vdVCcjCWVj_UchH`s56&qDW7jE!sWfVt|a!&^)`kdwOcD46pwRm^?baw&h!Y)gclGb45x7K}jJd_GZXq^SW|efVG4Vz)I0dy>zl z(HC7`5ik;QOk|*b^M87%a$HYsIr&2wu-CLz9VORsw&jU{G-@E%>!dg4+P2gR`(rpC zU*wBlS#(nw>$TPL^0VNh3`2$0=QK@N_BJPLGwNn0EX>8Q@k}*9h7p-Hl5?N zMXOAOi5qbz#rG@OISJPn?)9A^R;vgdf2R-c9$i32N=A$>arj_zdUmTxv*opzG;R0v z8`0|p)2j$QHs7>pMjiV!Y_X_$js*P{8+%KA0hl_SKL2sQ+Ns1a&}rg{ zJzXCPril%P6q%;z)$h}gh#Q;|{M4{qHaiieC{P=)BM-tnVtsJR@7Vj)MJh#cv?-Hi zQuf71Zas99)g-PkO{mJ6xiM592LW@2m$njFIz$%v5~jROYvM0q=B+xt)iZXKfLmM) z6S;~n=Od0!tZ;E=zFKFVn0Y!Qbp!z>14ti15PZONH+l0)Y%A%vxG@Ww=GIX#*4IXU zpT^3lB?Kk%`EVQFQ27K$vz@BvC#U;PAz5WB|Ia))UlQd%lUjI z4O>vW7UYYzzS{{eU74r~q#d$6U3CnqiC8f$Xydv^o9(X8p*U~>ZS!Jb9!rWo-FufV6Zi-D z9FPU|rQ@B<7yCHp#W;&QBX5tZ(6fPwEBOcM_)B_kN||l-N+>g1C{}j%uiw94mTXMF zMZh`&jQz``O79>5EWfRaYOfYQ2#Wzb{L^TL^i#GeJ4W8UM)j@nDny@N z1o*u6!?Gj{dk@xj54Ed*#e%IRrc;dpQ=%Dr{vS=>6qjlLeVuEvZA`XpPp-+FY}>YN zH%+dYY}>Xm*>{uv*YkTn??DHh-rs#~ti9ISwI|XO%1c9o_dY+*0|LWpcFb3z0|sOn zh90QCEAI0o&raYwxslcDjg>u~kfj~UZ+zw${@I)w`g79ABIGdqquw^fr$8HlX1V5q zf_No@%8LlyAbTl>{zY6XdCca*&PAJRXRxvFeoscQKO7mFKtQP|LJoLObPAY|bc(1j z>dzgW=D}w&E+o$CZwAG>%G%hb0vrm3Hql~E-gqtOb>B)653>>|%~`YGXI(?tSuS4C za&ww1>hG<{!+VpGJ2QkCK&PjSC*4R@;5-*Xr5X`3Xg&6Oz|nAUU;Wo9G>-e zSOYhc34xQmIG?v9pM5|Emr|M;6Wjy6o?5GE3Z znw^5|&G{zkY5|st4TU^_V^b!LI=WYAV*SOih{4qXuBcNsBmph>s|%i~n0cV;O@uV| z-KP8>juvRFnhBf-rM9VVTZ911fXF&7;lX>ZRe0+-)CmRL=sHnvcm=rF6c($i%zLi8 z1}a?td`Z|3!%$bab9?}RF*AmZnykGgh$OX5Rdv#Sf6>$GAU1sQ^*j08pUA2zOdYbr zuUZH+3Xo4cMz$g&q;=XvB#W-rBh00pxnwB(5>y#uwPa$GEkYZndzaxO>GZS1i=6K3 zRH!T-N3m2zR@ba64JK9FzNh$faE;?;a_)TrT|Bqobpq)t8LJubjZtf-oUG(_GTcD# zir9m$xasC*s~s#m>y@`JQTL)2UrPr4^ma_qgn0Mj>B`vGycoxk0gD84^J#4_M=h!M zQD3_ekC%^aLnHZ!KUnmjW9ZL*0-SBO9|J@61;-a34leee+^iZ&K{w9%mTxD(?HV|E zZ*ekKzv~2X71C5`jz4InNVm|50`0^j=oR_ec!9omDFufCpU(kjS69bH5ybliA7=$% zT5Zl$34%|!D+WG{fKC4#E%DLWj0d-02D9KhRX!gG6P3d?p5dP+?Gu*%)j!gC1VV5DQ)064s}5Y>M#g3|E#i}zE=d0sQkpXyO|8ER)<&ca zj*NvPB{oIc3vZbbWgDoPy+2x^lWSOh-n?hJUkmVg=UU%i0HtjEFKo*Jvo*CL*4atN5IxoqV=MsECr9#k;L?*Ti4A)dzyY1{BZU zQB=~`}UH_}QdB=~}8*3ddehM#m8Q(rYCMkm?4oA8T7A*?p!G9B@Y;g@gRpn6+bx|0Na zt?AID#yD4leWZf>@-HtYv-0ZuN(hE@cj^`F^()T86_hdNv^~Kg4=xzQxn$mWZuIqWOyEFcBQZTcz^YJubpr)zm0WZbXp{3RW z6KLnRAw^Op2U8*8z=z4<-9<DbTLMSU>f=AP3BJAu2~IS_%d{5Ce}- z=1kqy%U#F~HdO}XeSU$D;)MJll6{w>8=H2m4|WxW%5M%n&?gSFHDzs%F0nF^s(Kp< zv2`Z$`?CUBzq|XaEH=CL@D(h*%pbuWpHl#wAnEAQFB8XM|8ICN`=A=}j`izuEcNSH ztK@(q-tzX74r$_{M!$$0fw)$+4tl5i!Srr;CgU$F1r{XzUGE?=*ASEywbBTm zsd#lZcDy9z#7A7-oq_URcdTYLc#)4q$K1j<`(G|&DMEPE3YgrM0>Y)6nld?w z@cw8U9zX{}p}4;Vc_bmmRM+E-&@j4aHbjkIR@me)nNme=e0zLuup75xTkM>Tbdv6H z@B5if(UVBJ!Akwff%EK}Pv0&)(7!p5Io>}{FB5@Hy0{wlYP1ipx>u%lr6dQJv;Mm& zKO#=raxsRXeCvx29Dc3Pum3-QXm;OW{cq^_uThzD@CQ!59J5z=%QPkbaTA3(EX&W3 zqApYT(Ydc@y6=l!ORRe)IEWk zOr;tzv$A1Yo^uaTn0=#teEsYV7G_$p9Jdxxa32U?;7d}yh;Y!12heM{L%+TG5%qWF!#psn_NWw5%87hiqx*g*91z({@L+_Z zO7!EW^FMWb4gN^{4=KDv>xmhw896T<& zu&EPYp{#53rPmmvpr_6U;B~kj|3e1<+uk<9i%ML-&So~@lH~g9%NO3y&Lf*Q*Uvm@ z-^=zQ66dF0kIKep^0~9v{0Vk9l9Rr2=BBcL%qk}Tz8|a7hJqd7VxqVySk&%dzo~jq z;Zh+z{|`j~GXRbe+}|byjL$x~O;VRF^GQVxjfu15b8HVl_~1XD)smVQLes)f zf5e@D)#_8`jqS!bl7<&;s+?R2!rGvyq^|dEwm(GqP)Hj|?EM{i&YkJIqI2D%PT}W! zUAFkg(=--lGMR$TMZnFuZJ{sgd z8{A=fIMRUa1b-737%gDeU8eO?llIg2r8h|^u}L$&w1AWFnWvH?CJW2YySvbm()kb@Q$iMOZ z=1}(Hi+U$vrq*oE-p)P;%iMX=kDl{FR5u6~Y4EMxZgx{WXy(CGxTK|HFmD`hQ?XKZTr+~@Cl!mxuX3WJ20X;jut(pM+A z=8_w~AOu$|pIg(}o%C@@&)qcjX`UqyQia29g*lZ^uO+g}de>(gK zp3!BaQE}Ukp5CYE)9lRe{Wf3wLQr-zOPz(zCZoQ`TT~(~FhH)(XuK$AA)q8~}CqH`_fZ$L3~?+}Uyz?Y#zf6zIiV zW^*i;wjE9$W4tMTJt=#SdjoCXpPg3qatPE4d2qMr-;<|}ojrOJMyn^+U4n$PxkvUJ zUpnn>36OoJIyVpWW?!+Ek>69T=`&GCfB(3^B^j9I{QX0_Q!V=6g_Nsr?x-G(t~+p^ zcz==ACJs)Xkl)5;rLo8ll0@ip!1v}2C0=M-{Rc~?(-;@g!59Q+k);7gRwA?QT!m}xC(nRw9h$>X%ZBl!stY9>v;XvLE|LnuJF z5iv-kCs>Cfif$*b#&g*@B%wE9tUylWx4&#Y*#+)hNWZLN$n9bMQ>hJepacBwBhjF! z6C4cWW{i>@M~~9wn~Q8Jm@<*@gu3gR3XKELnN}6p?1{WeWI_5Hkha8|iZTed9yZ%C zUO&NNldHddW|w94YIjn&gNyH(vE1`ms1j-#f9ugVB`nV<61wMzs~m~s7Y!5Z{>vuz z-)dn7K$ow2KK*Ok|I&S15Lgn=T8jN?^v7&{xWEV zkg;#~gcV=IovUZZ=ke^`9q}*}`AQrl8BXY=;pc4Q$8gAUL-S54&@_%4^Zq-?ko@-vYwm*o(FZZ`K>)CIA@d%)u7O* zt%sxFN%VQDwXu)Z7=sl$Y^SyNjIaj=6Ly`6aM8z;(U%$e9x=tWN%YllF&ISUD{;p? zTZsqBO~w(A8`zQs@81f!<>4f^(A&yklV`%^%VVi2 zz=1l*vCSTxC-dW>9I1kZ(y2AbostHS0GLm5ow3r(dAxq$F>0zR4fOgq?5osLx=-}D zvysYad$EBEQsW$pdL_f&UtZTmcdc>tgOw)#^~1o`H(Wx(!*Bxo-9L4HjNCiE>;U{% z;jPsa&-q6btg*}CwRPmV85a7*PVk;r8+^3yN{)DkPzJQ5VdiCWkIux~l$C}s3=wf0 zkFVM$BF2jD{IhOc)iABh9^}JjA2ds=^|i;(mI&x0PqPoh5j<4+t22bK47WdoSKXQ2 zzQh0=vYR&YU-fZvcjg$ay(+c)xo~{h+hS~8S@jFjYA2s_LeE6%C<0=TQ{m3jN1t^8{C<-WgDn&+Bx_NDq5slQL;m^8MRXDQx z++Iv3Y{4hl*dr`7I5BU}el})tSl1vSfz(J^8Xb6QcTtzfPn_ zw3tRo+LDBp3JtH^`xo4)Pg)!ydqTe1LUtO(V{s&!J}Kyh-~f4st7K~+<|5755IGPW zZUL7iB-T6M_CC`28Lgb$qx&k9f8`fXfPzLLDm#7s8c^BbK|Z&p>c>xX8xv8$e>@Ps z@7;H@m}&l!_LT^}<0Fd%`S;vku_{=`{NX@maFo@Vf1A>+2U9)9Do4c!+_UJ^dD>nr z4)*rPw<9DcvFy{kHiobGNJvO}E>oPo@8^aUWo7^2fXgh&;A{N#87uGmZoe(o!L?R# z2g}a%c;kJX%{OZ+j8BDJ&cjcMX{b{YoUa#bTF-CU0qpYuR9p_e?fLliWB<;s^ZHTA z`Fu&Y^`Y7vSi6)67?VLEmj8Hr>voa;v*FP7Z^+6_*q6$yHh_Hw@lu-B)0yYpR}wSa zq)LS@)3SgLx;iS+J2m8f2U0};^PRGhzw(=){3wyB*C#WJ8`8>`uVHib@w@`^^1OIl z4|ZZWe7wvv4k#Z$F(gzOu)g{UPAP^ZA{(tbuV!gxpC`^%>qr=P3EQ}uFKms=jTMfp zIF@+xn_4r~G$t7|A(vZ&m8lL3K^MJwO#I0>^3% zYl;goqq$1OS*^(+Ne%i`G!xQtWaD|dIebU0)H=d(%pAjP=TW1Lrjn&LB4?x5|&}K@4NA zML%B#5KnyU!=vN?{<>@J7rEPqWoE~T53cU)VE+4?;3>x&a3=~mE%vp=j*QTVL>alqQZq#lKDt}d`%TnVGEtdt7 z)6L1x(UhD>;v(bE zvX;S*#sC~RlmV|0vOx0zMw+81Z|G(;{JZe7!fg^Zn6XOH0!c!u-Vjdlf6a}!Ec zzpV!oXCKWUp5${S7^IWO<@%37-6%6^h-SWxUS4|bC4@UgEwhpV4Fvk!05?(fiS&Jl znDFza5!VoAgv3gS+ieufv=Z+fD>60O*1+U%ioDS4JawJ}H3M=_Cg^+kH-lZ7gj`)P za3y{2=``=!c?QNO`&bCd#PGp2b84Q216+Q zvs=Rs|8EXXcZhNx4}{I?@6a3cJN-tcL#!k&2Due$^tBsxFMDr}Dgjx=m;(RIGiiQV!@~ z*o2_v(c-MtEQC^_j-U-wc4ZT;eEIRHB{#pBz^9}NiY$*MHp1Z5|GPN?-OIw!@K~!O z(VN2CYNqGT83wJ!_q!jZZj(q-hiF`UwN52@%Dv2zAurux5OB3fK$XNlz;hym;1|R4eMcz zGY+~56+#++Dw^V#mo#7BgjopBJo7`6)Fw;|rv!BFlC-+rKI+Za=a(Jb%Vs(WoT1Hs z^Y@-WdAYzUki@_jUi*hJ{V}~Ju<>#6#fyYWk+7)|)|77lmZxRgoBqE)RXG?KMFYkY zTT_Kg{CoirB@1?-#6Wa;HYSl@+HZHwqQ%>L6oJ$!pW{a34KV|^Gp=Ie426yp2*)K} z9~LB81<$3MD-wHT z^iVu{#9?}##PKRY4^+pjJgxaMrNkv}ABGLKpFL_D9>TBKpG0ZmN@#!hv=hBD-=oeO zh$Kf*wV=Y4xo6sBbU=)x4ay-6R$$4+(dfvcGoPQ2V*BbTp~XZu zeAcPL2}j`9cCF-!f+1F6`L*IpogIP9kqS}ghgFO$(ctZoLkk7;q7K$db48sMVZ_;Q z1Ph+N(TB7Aj9N}0R>FWVH4?)`X3fo0!IYmmt>d{H$Y)EbJf|%iJzSr?MfHZloerdr zI>Bzx$I;|D%!LS#zT2(e8OfShPmu2!k}$nP<9kgm@h9iR@~RcEKtUjYNzk2jqVf2> zJpie%R7mDIbJt>Gc~IdcTanhO5>ZE#m$jFqEVtL17zsbfag`@F*bhpnb$DEMNbN#(4n^$AC}yt+l7Mb?~z?KK1N66|&4=8)&uwT8uK zYD8$`%3OT31uPgW7deL7s@6S66bQ1^a{8a$Y-fxpL2!7)W1dOv;|v+q8#7f*TU-ab z18Kzksy<*^`VGm{2FstU{Z7f^!epi?=cjeu=s_k1BME2Lo`PTsTOP?A5JbKXo?%+x z8hdg~m4Y~dpj!1;mUCS$dg^*YsOo zx)93@3OhcnykWVGHnu`TMYqT1bx%uo4`o7=2PdJ7*`qIUEM>0=(zJ*~xr4U@lZeUH zP-6eenQ7G#0<%~PRuXOYOpIc>SVPQDZ6SLI`ZodpT8tevOfzt0fet&oGvCz4%po)C z!fU`y+N&_1WXDA)V6#4ZyN}hd=8=9~N#^F(bjIb)^OFdy)8b`=r{#FkX@;P&_r=ff zV7xYfl$F7XA0t(jXF!lA<%KJbBQN2BP;scwmYT$K-vxO6Qq_SXbZ;+ z`D4TW<7d0$DVv?xI^U1;mrruL0=|`h={9r1WGoa9WeK%s)rNY9-4aBb!9PThHXoIsTHvr{^ z8AP$rpo*1DMxvwFyJzj6Da>x-7gMK{vucZj;2PJ$iD}$ksDu+2!u3>=#%0NiZXpn} zIuqU-&0WYCIVy0rX7+8q%!UJd-Cg#Q-*AX^->^F&Xgd;$HAU!TwNQ-VqJFQBfr7~p z5vM586yvXiOCx3n(hlw|?z zendyv)vku5a)qn#WBbyPY$A5EIff|!PHT!w4OUvt&+GRdXlw~}Fs(*+Hyd3^rQUgnt(djfG`~j}(`iBfBycbqMng zDVk3&=;E+vMqwnZ>Ukgg``?PxqX+Ea!Im!?;E>B0%43Pew2m-R6s4NzAIbe1(6|`C zg4x}N!_5|@YeqkVeXL&4n&mB%5ghLG3K*L|W>#4VAgQ_kNH(!08(Jmrry z%U7@FNN@aYOZM8xI2p$|Z*aPAG1YT~VbK{degFr~ZP<8_DE%N}B?UK&NN5omz79{9 zf-jEO7yq7IZkq13q_%^L*kvl?$(KYg2Qx23CT>K`mPNCk?D}Em1{xP{*+3m1S(y;E z1kI1A5!d3B{+U3_G0|ghd%()C zxJm6tg&4^I!H<*Um-9YO-L2&_`aZol06S*{ikpqEAx}djL#%Y>H?9ZDisUj0D=aERV+#p6Y!wq?2t%EoL|-yeHf6 zq4zY_tiN;Jg6{A%Uh#$h9{I~O-{t#nqWh18aL%-e7oGh)8R*Z}^9(ROf)H0%JXHh= z{V2S7bMsQy=+V>y$$%xSMMNPf@$0P%J-kR3IHJ+1(A*mPpCLlts~fTFlkmFdQ?Ken56me;Xt^#TLA_R*brWY;HPqG80)E&P@`umJI$`#hYI*YS!XICRV~*ejXzR-c zngu6Lm8c@aiE4F(ord2n*M8eD0W}m^L{d8_hiTnkuL>5~tW*blxA7lBYsn)qQw@Is zz|(|&H>+~VcGl(wiGv{zGn>d~uBF~DqS(RMi))^hr^6mglT%N| zjDgP{4MJoAnoK{|;1`mi(P{E5TJ|)_U(aynPLMEY{G=Rra}KV?#h#i#-+A!a7B0`3 zJ)TTXZABBJ>7$3H%yg&Q@8Ri*{0OxE31}1FFypM#cX7}lmWNXW%uhhmRow%eF?D^; zgtNsG{m5}kc15J6 zh;ubvjxFCmjvjGtJZGBTOh5B{pQ;lGZ+X_lG9ihUCT(zw*^;C^U~k19aUt%eN#&0< zo1ChK`;b$r^T@APQzgsoeHWp$YAJ8W?UndzXxBw=iV!40vsg-%qlbQaDEq8PdpNV3 z;GuWQI=JDQ>Sf8Mn}~9>#Zrhx2r%_B*)Z*Ng>90h4#qED^Y%f-*Fh{%*-NL{*bh!L zBta1(VP9)b`ga2U7@hcG3^BZ$8OAJi!ga!tJjlZd3c&Lof=#lM41+~ zf9mflm>E*7yWWR&{yg1E;>1^)$IxT@0tqxxpqcxRFZ!0DkElECyN1+u-3G~R5o|3O zy7G-p`wBE=pv%5j(A)>V)X^%n$q#c1VY?SB?#YhS6{gng7c+&F?(YlGXnubQjvSB$ zdbyk5F~jy5&G3bPWw>f?i7364EqGsxvCmFYisiKDwhUeveTO9_;IiGVaqy$Bsi}#; z%ltxi^NykE@)Av|4sM^#iIy?~=Pg1?!zm}>t4f3aYrz#M^?v_~cZ4vI#z;{gevP8_ zqPlDIWppjj=qT9!c%>r#c8ZXQmO4Z^TE_;Kc{MSG7z@7|W#AZ;Dbe7cO=qMK>M$4~ z-|&&rzU|`}2c@9zVH9>!uk=bc7b!LO#L6LMa}2)Se(EN$_DVQ|Vr%T-ElfXNVUXl~ z+IGa@vFJRO_1b2nKrbfCafCiEZkopt7boe;D9Tqg$4xo5d>oG(h|9+_Fg1`uyOql0 zq@{@JOH+odmZ&Ocyb*1=D(wO@*Cnbfq)LKO>F67ACC1HXWDQ?Ln2Pa}57(U;y&(2F z=`k9!Y!LP9oU+MVbPXzL>|VH=NJ0_+`>7(VYC@bMi-KS%lWTajzjg6r=p!67y|N0s zYmhM|N1G}-VCS8xUf9d4vxcW#`{29=vDFq1Y_pU7 z6ki}f%ZlV4jec+dUp0979$q@U((D&v@oEUQJ2}3@G4wa;FB-XbWF#@!uZS^IOq7c2 zijvuZJlLy~X~<_6_bF?Gj$LaeE3JUc_T{AE&l16&J!zj{r_LU>N$x7UaCD2to-4+M z?Suq!W_@3`H^>fj>H=+|z|L#G>jOZya|GDB#X@A(QFBzIp`|@b`2rr%BoL*y&_(mMKj05P7*VI7$(ME@g@%QiE0%W!Jr$i&Kl0Q!P!L&-5!P z&%{v5Zz9S(B5om-5{heR{z1E68Om4~QkCyHUA}ZA$mtl+g5FbXtgev|y%h!q+(*h) zZhuY`pWY$}G3*>STp?{P+_Frqg_I;PGwP1=r@!G@Xx8!C=0tLfgt-J>Y0c_d;c1kL z#f;)130y7R4owx5jQkxyg}FBPz_!nJS!!)dQH|D;0r{&d>B5VV?KNk*jkbP*cLcK^Aocq=~=1^ei(4GvH!rwKi&FFC8Tpk$^k zi@7vS{6(1olKU^g_&i@7#q(booz0h3c+)hctm@(V#&delg5E7BN~%Anfko~{2qqzk zY+=I3;_^_Sk&g?c1!I91_TW8qd$|-dsM0pJqB*{-4`c4fH6yQ%6e3(k&P|9f6b;mo z=Is*cZxL{LgzQ<1aHu-CB1$;O!?7Nt=9w3lYOtOjgOXy;D-cUky!Sq6r=(lCzXP|o@;26^no zh8~5A5_&{(@jk{xII6E(6}1Syx-jSoY8<)gJl!%t@$m(QMNjR#u4{T#ZP+rX@bMtm z+ef)xahKP*HvuuP!%f7sey}eT@nX`^sOhc{BUZ(TZFpkgqFHzaFD6L<*c!a|`=BT> zsc>4@L?R0Bi?d?5=}&Yu?grbiSXev`HI%P~M`f|=)uw#&9ndWzbAL;|CB!P2r$I0) zpV51Ag?J4OX9Rag$j@vFm#vPeceeU4U3Q70x-1OwYpwD`7LoKUc}}3HxBsFL4O~dJ zImzkphYPI4)BElr#68uOjWsrOAS90FkjQ64j}&%N`Ny3!tPe72$x~-{=>FT~2*~fG z$=Bojf5apO>4(tlH@b3M|PHN=?G7#_0h< zPS3#1(|gc{W_Qp8{7qQv7oWGpl@yC2zr5h2v2Y8ZJg%4gF_z0=xHJNz5jq&`8$V-FzGj3L*lh&NYCy@{m!o+0!#C zMm5^@YedQ!B|a-!cGNt%C0ocbGBnk9^58Jh0{Xcr=h=ZnftYH3Ok90B(NuVJ^NZEg z^H8ue-a(x`EdP| z!L_OTAEJ=YvNX6>lHTNh#Oy}jFDo4Sa`S{8?&-Xj99Ue+hMRKpM9jNvm^xysGrLx- z^NQ)8YxkeGo=Urz{-RUbzNU|cNh~8f38kt*>l*4gvm*6E-v2T%UD^NVKR222f>^EFa)lXZo1Ul#E)rM&GiGHj2PIdh z<=M`nJ2JM`5&(2Z%D3*%2;?SLvHWKGbO2nRJd`{orrzvYZ~lb_0KRPE*^vA@SCiI5 z>U^TotQ$fa8%RQ z1M%~#IUnAGg4U}d!|CfO`0|;xRk}lu#)dA&I1<{6gy$a-9dzHke+{IiTm{VK`g=!= zukNT|K#}SwLln&>+J~Dq%6O40@=>pD5K=Ys$!koKl`1j0lv#6s&=x_L`g_!eP!>X=kIJHc+V`aIT7yD7$jb0Yv=$8{~NNFk|6HW(rw$8(Apq+e>m!=g@shi99YV3vWRh5uw92-qq zh}l0u8WF}&EtdRl7qmL20kER}`b-ZnGmPB30ZNue`?EP{*1j7|k3U;86kAFO^i}xA zvx;#a457OV=Rz!os=2_JFT0+%U~Iq)ES?(BHzF02S&#_#CWdN2pnj zK*sBrD#kz8pSbpo--T>!H1BU5!R}PAx#-BNqzJmE_1zKy$eb)~xVsrYeX3x4Tq%HV z+K=En(sfCiI@9=cI!vhYrthsgIoUO+rvk6u%@PMpQxfYL2dVcUn?|dMuX;99Hifl> zKOKSs%6upjEr%GK0zThuzKIm<(q%_h+n(RpBQW?U+1FRAzwIHwGE{-QI*ASh8W;}! zZ*gu*xZ3~s&g??w`p5&8WS2R8i|ec#ha2hUqFEBa`1d9X7nxX!5e{Cx{=r`| z<4JO{;s2<3x7VZ#TfeH%jfyBqO;7LgiBnFlk`d^_^#q>7#*iu5+KAEi?eqFAY7%u( zUb&rIA1C3YJ3aFHm=g}R&JPiGlfaR!&bCAWxyH4qsoR^eY9gcIr>#&7#(gDXMuOc> zOf!1|m-`u(iuxcx)>OfW_S5G{YNm8xTi(Hys4I!x5d|$|HN$Feqa%PVd(SX4a|HH# zcSzb1hGvZCz}3-Qy^ufz-<^+Krjxzli$$mZ+~b?=&Na~O80(#}F>m)G-7_8hYs*k3 zs4V1q6`=3vh8590LUPsAV{H=NCbJZy_!TiLM;BEGXYK~(yxSY3CK$S=;JkF2U}OFL z)^VZ)%=UVxukC(XvT~O$Cz5xtp9z|O@VLvR0xJ-pc3cw+L$0uAY6=f#OX|N}bl-!u zI$nZjTeFXRzE375eI!6XuH0AE;sk;Nm1!5KOvynQotd)pVlllF^0A?C*=}7BK|im@ zx;(wjlb_nIO;skiqkfY4qV*#$1*wMiLo6(h@d)93FOZi!#X(%Bt+i?mB|7Wc+_;5v z&;$Lt1+WKzqk;ORZMC*fgilf53>naHA`&SqjJc;$`TK7N76KP{7i62 zmDF>2Or-|lh|qUkwa#O!0P8vUn?YR4fg54iNtKiR6_ui4baVDYCt=^CKHGN`l_C)o zlDpU-Ok=k65oMw2X=CoYm}yJia#pGX?7FTuDzH0)pzVFIcVKtBOzJnV1A9>jE?6ub zd1@?hHm7}BRI)lybz%Ss7u_8eKU_TMJ06Q0PvRRNd>Q;~{Ezqegv3Je!z%eotGTQj zv~LNf%3A#xogNR3VZzh)C`q*Lx&EtGfFKhA!v&Sbx@o4V@RbSOU745*wIFMM zN#ZnHkt0=NMV_s*4ho2uMx(yq|HaEsh~F$SIhtm6$r)XgFGPi*go2toiR$Kn{*Z zYl17Ms#zequ#Z>{ouwWsQ5|@sD-jn(fGQ6JN<{CR0F4tb$3khU7_Fn8>|(uR4Wjrm zn55Z09ZDsoXhl5vk*P9B{hRxC0ck3+Xi>=+rrhusD`TKnIVk^mQ`H+2KYsg{50fbD z02rp%0INkDPKb)1)%RHKRi5_Gv9cfaYI}cFs8N*dFR86K zF&CFamphzCQVnj>GS9B>~q57^#ACdR_?98F(A3jtd0DM1G^) zF;>$O*zEGNxPt9mNfN5I`R(B`0?bp1W>jR%gmM-~@8dGb->w=zPKD~)E~uI>vgH3C zN1;5Xg(R$a@m3m#kHo-_pRvuI4}OaVlU~7+18S;a3CvTj$Yw$IN$w^_bZyBLN2^G* z6?+qLR886YD-`U>8}#iY)Bbk^x31@T-A_8;sInAW?E?Ryi`zii?_>T}KxutvkW_aC zV(PK!C|H^9$e*RGQjFs~XwsHLC>kTDk=62CC7>^S`klls*tDuw=V(qED+97JWoy8~*(viFYHVJX4(5C@YiLx5jq{9g3Gl8?@i*=L&u|Vjmf<;e-e{bM?{^H`BJTAtxu#Ej)nC#CX5wF1#Yq zbq>5L!h-{lgP8z(*nx$ClNZqO38Ofu3)##ik(8{x(Q}i)5t7DCM(+ z)Bu%>T%KuU8eEXn4SZ>QcmYJBm# zu(jHqXU`eaCF8n+W7AmCuRs5Jgp$CGCOBE65w|Gm^P+wNL#o^}E`^<7z>tQBj>@kO7GZ1J`-FhQ?E_vZ;Rnde``l1cTZ~%wW^NNk z$mLi%aM$E>;h6ud3C6SamDWDj<>&#KQYstQPb|B*kO6z@+42%`Zk@LEIGF|zt4NkQ z&o_c~Ek^qHE6XKKD+r7=5y|phmw0L4y`11R@`+N)gpVkZ0>g$VHIUH1X|FpK&%HrJ z3YAtDPcl&3r>i)+NQhxKV}$G(=Sa!MdvNWx0<0f2uAx-bDQND5BgEvzAuTEGm)(;j z)x_rL&Uzm-xi8q9PYcR|_ZQOFM!^;>j8KKm9KVW6=!l$nyt zk4a=C#xV@fjgPug%1)2P)>P7lks*Y3Vt(m}Ycxq@mDOU*Y!uNjCIG9&uBiF@6;M+T ztt9BNvQnfb9AiNw)Sx%z1E`+wU$ugLz$2K(@NFLl#pf-h;LVg4EDO7j&Be?cBQ8p+ z-C5uFS>sc@=z#Qc8l+J&r0@hbX< zBGu|BO*y)MRb0-=#*Pa+(N2D+(1i^ly~q~-Crp|tp0jYqm8w|i$(d)4b_6|jT0T8? z1r2V=UTZFU$~x|%tG)Uph>0(rh9mkjd)ztXgUmsFux}R8fcx6JyW{y}bIqH1g;QUs z@@#S0PvOGSem7Uc4w&7z^{A^UQYo!MwYo)aPGNXvnP%Tupyx5WAfmqH#*oqY&~p|S z;6^u-t0_x}A5eRBlW>&s$A>W3Qs(SL;N^?2M#gR!(1ukB6nh^=V&q}O%^#c^;O|V3 ziKl_aM^c#5C(&<9O8iLvYjQ=KcMtwWH{KksNR?q~^T*xXTY6jC&W*I7jf`JZfneP>*S=LB#(&t*bu!!Z zsyFb5UF6xbnFJ1{U-fv)8qOs+jtY(@gRYAXlGu(L{@hZGdR~HX6jJ@LA(Rph&Ya-) zcpttpBNBfncIwD8ZNP&D{>yIbk&Y6U{jW!HIZ^a~nJ^@N0$sN3Os{l5{YeonT$3q9 zW9#VqYi_rt1H{C|>CPD4f#b;EvipBt?yuwmh87OGL_QmTS&$L{22ZA;u#8#b=w>@6 zn9qiFo5KLz;tlj$wu^_7JJ>yDkV-*Yer8M_&T6Hnu+~3FZL}FY%1w%KG@> zl`nSGQ8-dC+mEjjPV{`U$Mo_lp@bGTsI>Mv0U(nR+(w3Dps2ZrECYgA)fN2NB>P1)r*UC_6a*9|!+gE}aqWFn6;Q zJhJw`VF;WCYjMS9-_fnewvRfEc~?vK#Bq!2??c&mWT@UW|GAe?(-FPt7U4v4Osn5n4rs>ib4smi zrbM~AMsExdPk?Qi|2A&m9WCdrpKKO0XjT87j)u zn5bvE$9hpVSU_I!f$WU9xV+rxb#I=|sLOSAJC(x?2qf9svalO=`=i)CS%cwf7R1M5FR zRP*fUw6z!C0){{UyY|~hh*4jo#DKNGMVUOdT=xNIU5kf#xOt1ry`^{D%oyH)Sjiis z7Bd}xP6;u+rk+sNHdr?Q2y1M;gSA>PHOzVs^@zO;(~6p1$DMQO@0F}1Tq?FWu%Hx= z%WRLLCbI1bta7$oU-g;gq*=XVsdz@OAf^rJrclOJ%S46%I40dWLyLcmiXZ`(GI*Z+ zu`A*TJJ{gY&oH%AcqOSmHZN}*qj{gc_B>y+XU$W(CsmxvJ(6h^ekAPtqI+_({I_YIP)n+Po zKboZgmdktNcZ>3#t4nUO-{+FBeRIrnEwV)iRYmt* zR^TXZrQsCh(Mrf=dE&C=5OaOR7(;8$4TSn)6HWTdvf6P?-pzM~r+tJly%V(7mmK>9 zZoK?p>cc}tXDDm=12`^sk2emV2cbTZT^c`Py_T^WkfR}mH}G6Vb}bH(Kpc?)47F#t(cPZIIl7VStVUT0XKe8T z7nsl;f6l#?Z;sQu1-F(&Yips(z?~0cQ9?cLN(adO{m;|p)r(xGKd_yP9?>}RJRioR zuT(d0fdwYb3wiE+QK(^SvD1Dhm6tb{*pVIgbY~> zkTfWHz+_4^NBp6MIkdqIr^|IT3U(vyh4X6_}4`PnmRqvev&1ntEYlW_kSAY+^?~&oJcBg#mKQ zpB<*zb=_}{;mKmmWk&C)7sEf@I6N8&nuct#-{5Ha0~xm;TBWL<`szkVyf1|;M$x-k zWFMyTmozkotQM@!Eax+}O6ky%O?#r-xd3=h<)z-sPg}u7gwc3tnR2o5=!tEE+<=Jy zp61G9)eO`{=8j4tK;r)m+?U=trgmNMDU{7ur0iuy{67l;p>26XS6h{zv{OAPaAT?LsULb?F3!IU=(V; zC`GQozk=9!S$EXKWF4t=rZY5bat22RTyRYkLmt}OW5**Gy(xD#L5jO$dWq3@d`NfC zXSV4u-9c7JOdWVD*W*>hd4*+ZXKSA!R302gu$c9oX|hdKB*EG4+7`Y2nAaFNzXLQWvTx@#YiEE-;X4ok0b=7 zzvIulB_(E(NewScFQ>4coGd+c=_dc{LrYR<)}q@1GLM?B&K`nzZ)eFGIXEKuU6!?8 zIc@K^XT6Id@L%*mTcai7$#=(2)@0xeVciRcpUAN8S5Zs844EXa%!%LPZ2c}Fy~uL>H3Jz?0TqVL-Bo1}VL zN_(_(dF|s}><61bm9>w9R*vG)bUpxUi}wYqA(WD#YAM3a}uB#bi^%%giM&6@Xg z;>*(umDS{yBrT7?hk(kCnDMt*7#X!K55}0iCGm;GWB5@kB=bk3V#0#mmHkU4H;p5L zIZB}#3d@e`?AKr7l3KVrRdH8#eH|zUZE+S-QIGYxoH|&XiDwLuvu(#la4K4%v8UgB z9Z{V*a94Ma&m96bqJzQktXPI~NBEe&8vn~9n!SE~Zc6q>?1s_kh+w7BxOq(ffRNxW zFVk@n6%)+$R7ZTzfNB|<`9fhlcfjkOcX}LANs6h>mS!zL6DVjz7Bn(;pQF4jLI;~b zwo@GHp$nYfyKA$$8r!LG4p_QB_>P%P%&+8w61>88Cut98bkx<=;rOG1C3laa_cuTe z@eY8qm0EsF*bz1jt9fk0{oX9k5JpkQVWV>H`;%|YP1#}+?wSUIG%G_G$cz$*o@-tt zVrHjb&x!S{#WN`MXDO3J>_0&8VTbMtp#@*on}Rkovv6uxOcOGnOAp9KE!oZ@7J(hz z;ZFXi7f9*|+$Mg)d&Ng_9C04Dg3g_fs${ z>}2AQLrpdBVTGwq^cKR8@)OyIm_fTVaAIO6{y0V?*iaiel+!=0xc6nEyy3(0sg-Z^KbJ$vXC9bp0v zZbhJY3nF8XtRXH+ZvKf$Y`-$+@yyyH-rVc@tz7_(!7=v8!$eA?@t#MUYvNfn(el);8vchkUh5`1Qn^? z|3j-36@AT{q1MoIqg-vW6{s}kBo+OM%ZE6+Slwt-j!?Ru#tp(X6zW51>UzPo@tI)F zXeqyiM7VjHwnePvZ~*y{w4A}ejUv|y1%@UK_LfA z^L7;_53VECv)?&a051){9g)B$SERV{kRWD^IHfDE+*&)S19Q!}{bG~lfe3nZ;g8xS z_J$~7m{QTrGB%t8B@wO}Bw`8Yk_U+kThQSrC9k=lC~|k+)lhxApL6nKRGSXf+ex9; z7%jY2zPq zd)KF;32;@v_lnc`n3Qrq-ilWK-?JvLZ+j+NLH&Kl zVTv#0GMawCX0JZg{zy zn*~D8KvO&WuaBjzu)o=F5`$UL%jyeJ5ZrtTk-scFNz&l~`XxX!I?gPP{@5V#Yy}5_ zauA&HTfo_5f)U*)vVX(~-gF|krAPrkEdN)*6H?g3d@V17eoo3$FyU$bN9*#XSH^h+ zUTOXHNX=NTBVZTeEwbwkCgoZOI>z6YO##n6u`a&h_>L)ir`-X@P0Y(?x80}LaugD_ zgwPyACEZjqtT5$j$Tn>X_`}q_47&a8a4CT?pzbm5yT@qpCu8fOs1gv6oUAEXB#hy= zfNs2GGCE_ ze3o8}TKjJ#$mJ2k$sZ~*DRu0t->>qO@#0JEvpKzO_O)i#N^PK@qd)QGI|NT8AK;YB z)_nDL%#F8q09tLJ)*=-{jyf_gDyc&fL#~$o%a2<8C9UhCIhrdRA?azzI%%-7e%fd) zY~TObHH7caK-Sfo6pxMdxodtFqxW?LomOoi09*tw#L$0TS$qodd4k!v3g!S^{f9n! zd2#m!{_J|=k*M;klQt?Yl3=)Qc`4y(fCa7NuJq;IFJ3;l$qKEZDTa3z2>Gb@Wp$vh z35U24VkmMJ^MPE-B!ai1ig?ruJ6iIUwhP$yq9G6w%;9>dx<~T^r^7sMFKQ{(38M0e zjIc2Z;^>l9}>W&P;u#=T~eV;m4YNOY(Z0-l;6 z@c1>W!su>cSh2rL18*&AXDir-L*AO5)PU{O-ZP}y{>h{XXmy=ol!r~M-`HgRiO-Xb zM!!k(W2$t-tyXrOCAS&;y0Lv6jzVpi*XA{B#}`c0i~gMm4~j!U5}6FC&)1Xrh$}@6 zvAK$g?uSx6RZ^fgmm5{cp(!&v7yl`pEVOZb=@?Qwn%V`y{mmDX-K{##Y)^Txm78|I>8h@3j%xB8PzrNdw=Tk~N9?HN*7znw>DIt_;TFR!tsiW~?|DjO?_YB+R!B{6FAozS&Tshs8b$fv_Qpb1T_8#02%Lb8{;ZZB}IrXq@wGNIw z19q0B%;l+0M|hc0ETWGG%mN3cJVSFf+M*Uq&kh6?uK7jNr3S`czwaoW-S&iV&PZPV z2r-J`d6Chr)gHyJu45oCwhrpTRDI}CRV<7c3hZ-wak?rd^T&Dc^!tI45 zb)lrGR{>+Ja{5&on?IG8a*(&|qR`LWEpWb8@_;{Ow{I6YK9_$eGmnI!@&e{KFBAL$ z-C|V5eNFL=2sH)=n{JP(6ZUlK<-WwLcMv@x^f}x9z`M@$r>U&z46)uw)E@pws>4+S zlTuZ7S(|{^O2$;w4aW?zmRIl8y|EBF3Uj@bz%F?-ag|l~wXh1e6uDo_%C}G1jFa6i zw3L5fk}@)5&9x<{zgCMnybdgvj&FdRrX=7y)3$NX0BUUuP%eCVd9kl5tEwt)XmFZ+ z_uPip-^%`c&IbCIAFr2GSUi9{0UN`C4WxINPe9-a4?-K+oP1>)@kDdOOY$pI-T(7f z(ApAxp?4lzpNvL@mu(uXTh9I{>2$>L4{|L5iPK(({I!m&D{{!CX-rQtpEArmbKT$l z{NmGY(b}f5l6gjxs4hPfXLtw?IyyesGbjHqeU-g>KZV(KRK1xM3bMA4ClqdSpUsII zi#NNPLk~9KD)m=K|8nhaT0v@-JYM5CIX?7$U^f{ag_FwbZ~Ke5ZTZ2--=oN*B<64K zs%FK|oThr4MPq%5VK7k40SBdLMR~g~d7(vl8@cXhxk!k(uh~Mh{B(b@LZx0<*h5n3 zOgm{`{ih{$DCn=7c$q&;a!Y>O(s59A4I|=d{Fz)+*oPa&+Du;`4FCE;EE|pxnpp5o zNr&f|Ar~7B9#b4QMD{5q{sUGFthlnmc15#KUnTaO+Y5_W0!6jX>lUohHmha2`?^3e zrDaGq?0S3@wCB?Gx_&hExb8x{zi(Wm)p>afkW*_cX7bRT-!1_L=NdqtV`J}-Wj{7O ze#@D$y1{Hz@Ohd0Z=atZU8c$g{|BLazh8`(&1y&PeCX|%ZV!v0{(V}u(d{1qZz0!I zJK>%nbExY)JIG9!0B1v;XJjE>*r4xreCoKz^CYCkC?mUMd7q1#g4(!9N3NBGyV2F_ zoYO8#&Zgy8t`8zd+Wta8l!$BtmUnM3$Q0-oEZ+YIg`JAA=4Q^L=Jwpx-G7HdZh0s? zLFj6xnOeZ`+&25wIn9|rLeO4*52k+HM<7eNfR*U8<@}X*=^fHm_les^%Mn+h{RvW` zfas7>qbsX_%#-)$Pa4aMiYc#D zD8~NYsX9u^`j#kPvRhf`7M=cE^yZ7!Q>KYI9n_yV-!Q#I_&XWD5Z^T2dPYZi@;v*8 z7zas(BAL`g@^Wu{QB3AqnL3*xX1bEF%OAVGLrFSU!IH1eDT)ggwVPnjjWo_v^b+|#PDcH&PrWZ3k!jyHyulUBunkPra(y*GO%0MirFf|e566`p6R}_7yi!8I&(&fYqWGNCNr2N<$%7Aaptc?@%UQr30 zMn-!L!57@}aiquZ3h-l1ZuWNgQI4hmwy6ea3}R^W6iso?Be?Bx{+*jlm;2@5(KLt@hndEXo5wWI8Cqr*PBy%<*S+s<%k! z`-P^Yl?!HQY$pnYoYqsClx7PX`_h?p)XYjnjkDXI`uM>tE_TCCv43;xdX2>0`$5s=DoeS}fqJBQO0Wo88Dn&AEa4hMD-a*^9>GQ6K|Awtf1;MJvih>s{QkuyRYIV+Ij#Q*{d${Gu=^u z&R4HDmf>~+-(oxmw{Ho6$2^}E{DHYDQF3nUu%D01f?3OJ#`tOK|( zlpHa^K*5!SAS2N`CauH0#mq6+!1_dV~uvVYh_@~ z#qWlDV{k$EWpgRP5`dYO2cu+&+7O}4FjW+>$G@ms@^6cm<}4nyJ9=?FFfuEqXyXJ- zpL-R3n8Ccqv9%#gp*!v!8k{Y)> zb3z)5t`KDw>7tI(jIZt*gJ8eg4`P0v;9}S_FGl$WU_|)-w|j90HE$$gdnEX8Q29Tf zr*6|X--4}I8?P%}IwCab27he6EX05B%>T-r)Ihp9xQr;I+f_x;d1E=!keTO4NGv`M zvx(wj`DkF}jRMxr4+e3~I@qNNJ-BDY0!7FE%bz`#IsFHS6-*pstPb|naQwJ6BmLT- zOB!{->BLA4@X4gc69hJIbC*jR9Q>QcPr!wR+`p#A{s*_Ti7oST zZd{5lV&0wx%$6-w8v4PKDr&>R=6{PWT2a07gjtFrD+n2BY3cLF#kmaCGjivw%(E!% zd&9i3L0YXt?ZmbCw$xF;7ZHP+wx(l^l_!cZF-BStf#RQ$-jmF4Nu~INH$tcVV7XxW z3O8hr*^);_kQRKCm`-Jlh=#r4daMhwRI#J`et}S_W=?;ZqC}UIu!GOzGn})kU|b*d zSmpY9y zXEH?K&9L+1zKZzaiKFXTj{hb$n&5Gl?`bQ5fY&u<)wb)s`jG!ROyMdv+B5J!`ojTG zgBRxK2fSW(ecnBQaJQ#H1$HqGcmZKWcsA>+>0AvHdPDwHd|9WP;N2Bp2Bsoo~qv8CdzWBGlPm zH|kW4Z1Q7gA?HW`JzNNpGY8PqlVwX2?tTLTqY|=SWbh{wI{&I)zvYv9t6PkQQ2=p~ zKHM(_Jo4a_BIf%&4H~HxJmGk(;46QGYf_9%Qliabz#NOp!lzE3(P^$mgT3tnlXY<1 zc{md^Ikebmt8=^^lGNc>jP>sd`%6SUSN7r0&tO)Vu8>kX=w4dj?K+s+aXg1m$~hiW zFB+!O14xm*ft($O5z1tOho=E-{c%D74!aiZ0+c`b2}aL1ed*bOD4rJ%+4*H<@ME>E zXEj5bZO-SA9$biFY=7P}miu~dg8CzmG(mCJTFpXhvwu`HJorA7k!?(T z)S$vJdEGEU0^#)>MfX z$T8Z*wm53TUHdPd$lp2+}I>hO_uGUFX-GF}~Wb@^{!uy}^qcju>{lW!2k{oD4@S z@fg#^0Gn=YuaC{7NiM18KDO_nOlaeh<fyh_#FNC$Dr3qx##Y{nd=hSdw#EW%yGt6I4%(+LFqW<%OU%zka z0y`&rqB05EQ@eoo7gC@17(SyhMlP zMb)G8Hc+ZB%YvblC;2~pj;=h!@fo_ zlN+VpqOsP(^Y;ChL)W1R{Fa*xulA3>6M?ePQ5(|#C1U;#B8QQKBLqNdPguf0ZW%@Z zQ(951OGx?*BK1nbON2aAC-I$kU=b>hStbG$m4s}I5aUMfLAkUtUH#2Y6trMne+Aed8xOJHT6S^X5P3OlK#5Whb}dzS~i5$kR=7*Z6=x&6|A>->0tVr~L47Ch_9ZOZQu zq>QBdBVO9@2=65@zIHp}L3HA97K#-*&2N`0(0E8up~?j12o^noZ^aXroos%P=4kYO z_lY4lz8c&l#9uEt{LUfpjQ`CJF=8}bQx?6E>Kg{;p;}e`8Xft*8NemZbg-JtcsaK; z46MJphrGwM6fTP1J#oCF!D7R0?hM&o4H>z{Ywaeo5fw;`Ix6PrtfF2DQMhAqhV$#z zz)L!eanYVxw^41rm`89-$(2pe7x;~p>Y3m=e-K{xSYu*CT*S;z%iP63V7+Lw!x5b! z!f^tj)UOiUnAB7z5v7)dD&;& zs9nqiFuRF%{)F{KP7tx0;E@W!`YpC7Kz6mP_-J37`#i@#dHg5A??{4^twCbhGEAcz z^Q%Z!L~%QLS7*QFR5=nkP*FH{zU?#KzF+!emsPfg|M&A>|IYJub@O2T()+QLXyeSt zwRYs9ip(oJ=$eF_EOD;^z;WTGK~3ECNm4GeG?PDxeN!*=9@(j6tmA8d@%@25O{f=A ziO;x-^k?MYeiVMsg^H$3naF~fZmL&<|D#3{5{}+Na#1#BcRw01{G3Q~iA|*`(x14- z|Aif`fK=S{!shnB35+s>?JbJ>iXjXTiHX}UVlT`Gt*bDAFyyV{iim1}>k$|%2!Tpw zb~J8{z`{3i-ZL>hA35{ySY)Ol=L;YyWr+! z_Xn+b@<*XZ&L4eVJ0xH=!)w89J1?Nr8P2%qo^Wz2S%%W9eEfjlE(-_h^EPKyetbjt z5hVBpaY6=6h%xqD5*iM|(9#95*H)~yv0Rs77i)7qN4-hEc zv0m1nE1suTza%BCgL{I@7xn-u7WyeLw{Q+5m*0a~m7-3JS>IcG=1xDA9 zcJzo{4%jKe?@`Fet=@G;Y+`fe7-Amp%P~GM=PJ% z{gZ8<9D<$@GA1t#ii>6(`X10-?|x;Ez!4NINcMc0DX`mtFEHtwxIG#yNN6Rp`4ujN zEfyXOaPfsBu42tBbExys-w%IIZFq!?IQ@J4ta7kP@9Zdb8LKssxxmyph8Die4OEQ7 zksV8p1Cgdc!lDRog@~}HY#~@i-iA@US*zOg*>5lb{N-w7G$N&pq;x;*B{m-gq}k&T#usEGoX3Ig+5~DJn}c z|MrcgM@0J>R85b_yb`Ku}p==hK*7` zvL=uSk;CrT#X|~@peOl#{x7EI);P9m z)-4=Qi=l0S{;S<8_yb3KlvWT-ikd5IP)~m3rRa!xmdM(SuvPWACEM8?-nRKnuka7V z8Niq-k0+Z?Zg0fK&K@gG=yy7eAWp{BbW^-dL}6W+lKm$SXUs*q-4&yXv6?<`oc+nKMNo551E zv?2cYW8;}`Ea)M1;^N1o2$s`n7C9Skc>OWL)BiBS*eFRSGMiBHzVP+z^8Gme?a|V8 zD1`MDi-~F`xY+aJ)YG+}=73G2Qsb596iJ|jT^Ms(67K{F6pNy3S&az8c=t_hj=<6k zF6PS?4BjH)w;OsW%GwRk7gnNuUFpbaH=|yO2z2tjwbtTP{Y^J$Zv&R9!ekBonk>=r z?6)9O3M2liP9wevC#|<`ld+3y^OA;C!6P!3Kdpq6`r z<W zx35>zpV6G$+Uu!j6a=PS`d4X-?ZLNG0@{fly4LwEtnS@nU6a;aPW zAwu#lR}-MQ1bEE!%>s|m^Y^UU?Mw!RH>MKVMUb=ulF}UK;RGX!7vH77xw_u!eAr!D zQd4SuzeHi|x~n0tRV4Jc4g$ajEyUKVJbqDPlHGqPsA%b{4?4uYb^!lu}K_*&9b5PwM9JO@9EKc%wJhFnDrvT#0Ax9kX!D;V%AZkAIjN}TJI5#dS z$p&~$(Xg(JhcUKLOe5M}K(BqFF_e1n$I39`*fde(dXpip|6zSrglM&?0ZeA0h|a7d zKgxckV@pV;@j?9^gk1@T7bmhP>@;|;h*7YVgNo{}UyQ5Q;%w#M-kiUEnRP<>17fGO zRqQbPmNEU{aHxTxl-%b z3o+jZ^rrD-Fj0?~*O3dsx!qruY8YFoGHV=v?%d)dZ%9@xD*R|q<)Cv@GDWgf_oh#V zLcSewceT8gPGZZL$aw2uYg0ghi;%$I;5xqra*JSvXc(A_WBPsz=R%0aM20K&5gEQ2 zNks%}5~{Parr^r*$ex1lo$7ybFY5d7{Wo8(woZ@s+#_FeKdtyLKo(L0T`!c7 zL9k#o%5r5~K@|Hnhu5Q-&*KekCQ<$E@xWFEHiE87Yn=8#3~J9B=3~_3;uD8MLu!@C zA3y17cJOpLbyX%Z@gTqK!!Kd9rd^;m`rQwIBBqlY*U9c-wd`5~(I{~ir$|tJ&iAOg zd=1~JHBisdp6wTl{6UJNK>Y$F4T-3~8hY5p{L*ARioZ6M+=_hcZIPLXTm6wubNP*n z%3_6PQQkMbq0~sF=>so5q-H=X$6SBdoo z6^J#(&4ERs*#*u<5pKLy7?Ivyw7A3ycPCexe>Y+basaES#= zz(o~B(^F5P;#oOMnSf2(;qmx;I|v&bC3R!wLxj8$FUtXtX+gy5q0ItGQIC?8iJ{ik_ z)+|Ix(&t09%R*-L=v=LsUZS=)56$k~W1bmy=O`D68 zt1_8d>+0i}T@oU`hd8w-=rOfcTHK8acq9)xXrT|W)a>iZ&Se<>m|Ph(*4BpI&y7ty zbU9}<=LQdsFBTcp^cZghK$a;Zsxg8#&jRpP)EvLVM!CtP*?{X@%eMeuwrQ($=VHr zgm9vtZ>g$x#=%D4C}72v!6nEQ!8&XhlbD!QiKf+HvT~CT!>E#h=FkSB+VEndH*sW9 z;Si4S}m%M?#72e;hTbDHuM!o^Jx5t-wR zGvP`(q1BV{T?dl;GHR*{Yf5Lz0+ghc6)hhh>bmjA+jF@t{zUu5N`uwl%$}rSAz3cF zpf@rkSAp-q@pGbBlm^*L=NnjO7x{^LyYca9N+Ks6jn`r=$8~TJBg7U}oA*#M$0xD= z#;qxT>xTf%7{xdzWA>xxhugk~rdkt$um8VZFM8tLQyt+P5qWzfx~5$6PHuOlL~2ol8xS?V1P)LbK&F+zj(BiEOTX_)Yqd{{fHqj&e7{F3ej&;* zLG!3)6YQCar*;u2nSB>bTxz9~YK);Udj$+TT*nW#D?a#bzde}M5Q|$sqX+8RK$^>s zA|J2QV3R9U&$0L5C~7eWc3TNb&FToweL&vYbtEzqMt|usDfj6cq*8y7j zy9+r1iUUC#;8ga>Z>}Q@GLSL@Q@FE*+KO2n@J%i}z%loKyG+8rN|;K$r*-Q&lab)1 z3f#Jn(37vw?fY!HhgowwvRml?coRBEIQQFZe@Zl7C_`P_c%}wbNr^*bN7cSxTp5Yb zB8J*iUz=tQ9lb^WerbvB|2|Gm1FByz>7bJf`wGNyC)!L|Q2ablVf2K1hCtXuibD>k zt{B!FL9LQnm5Ni(xG)kp;nYiM!>h{KpO!QEjUU!>UU06i$9oBo)hz5-C`A1o@HHG1 z4uKNiUOe1Lrgb}c(;x1}fKxlr)5he>V$%)C|^O*0a=$(>ioEb7C$xAR;Pik3fG9)#$ zFu)@{tXdfW?53p9R?$B*g<=dr<|&uVFb$)R?D==i0S zXPWZPJ0j+0EFG{TunWOP(O1)d;l^8{#V~|5ghioOx%emH6Dq0CnMjwg8)i-bVHG-K zP|#Bwb=p6SkmUxPAHx6vH#+>~xczngvZ%8&%j2RYq^znl?LXB6mFr~@DOw$A6U5wU z;YMkp0?}VbK{`u7Hb=O;p0Qkgl4A3aE$>CUX#0w~NawTKjD3hb+44ubI5_*fHOzDp zjv>?KYaM!pang^CPlv#TUuAB%T}v)7(RciQpp6(L`$+AVisuxgJ;(_4nV^gv zoUrZS{0#4lT*=fh`-sq=!|qzj>fynnef?GFXtW!maw$~Ck~)P)w>s`JT5)FOy_V21 z!bXxKzUh?K(X8li7_sA*Bniy2Y6Uf?-&@l*`gxK&VpGVKND=lR7_2*eJ-CT?E<~){ zUgH)GBmB z1511;Kh{8;uw^7&1WmY5tY-|Bq4m!KVP6z|5uzOgTMp%U+vp;q>kzO~%gYGmd|{{9@lP@RlU5+$Nx1k|CxJQ=Pd&#~k4?+qhk_5> zvnZ0L_HhZ)bS!48IP3hcN6#SBaMY;SA)8_hvf=!Sw7<_ph9$+O7JzF$$`Wur`}_V! zH3Oz}OYm>(Rc?s-09&i&AkC`!ym-;*rl30pWu5PgyMdwulq1Z{O~f6u9H!3S@dClt zpI06#thgt*J)N@8V8I>F2;{MUcu#KDwVPe1z^e?d_T}~b(9C!T^i|ENm;BGHpbyiB zIF|RHh{2>%1Bm_AJytpF!5F*Q2*Iq4lsfVP8q%@VMf_VX5ZG*Nl<7=mg@2=$ox#U3 zga^X_8P50Fw2~o2zTY2`*KTW}q`u0W3+$(w-3WClG-$ybcN>u+1w1p_J%3jc z=QS-~I)sSMSJ|%N8V2vkAJe(yP#=E|b@nMpu$8aD;w}6^@uEnW#n6f5J5wBWTc$Qp zNCOOZPhv(%ey9g!F1K0Wy^405yYMa7Ne-Oz_+jJOE*oZg_RIMya99NX3wG7(IW4#H z%HC|l^U`)6ukh1&EM~;C$e!q>gG8$`2abl4VwVPS7k>8I#>(Jmy&zJtLIn$He0`|B z4uUKOaqbvgo{eHi05G%B-xC1U)h$>WU9j!D_+#=N$79O54-NTO7DRWi7T>)5Z`q1- z_du97VlkuNqgzhpDgP8`4t|SYx;)8D?s7a^)E;EYYT#5amI@#d0(NH`s z>4S}l!tKwT85oj;#l;;@P3mrhiXso?fj$oOvkXO# zWJ3t1q^(QO^zCoo!3$FoEl6$p6{+=_whDFDeorzltLj_&PQ0%U@#?|x@n21MU01$- z68o(A49#nlU;-sGao7%)`qjvJQ_f7g#e?aa!(V*g$tT5FIgE~I4maIO4FZxX!&)t7U^0tRgk?tt5t+>qX=tr=x4!gR#}Cpb7e{FatWdi zL-2;|t`a43+QW}~WbHlfa8A5&e!p$?P&-y*vzxTxACw^pgS|Ke{MtZWPo7LEc-=1Z zwY82OH$OPokYmvqO@-%9&F+dfvBX|VeguqpMztke>?=ydnqBT5X% zUz(hm8kB)RV-CYm;@Ce9OqgjLD7oxMW=kS1tza%GV=fuPnJ=PjC_UoVkB^%-LtwFo zSWOE2oAFCuSwcUw1cZt)t&V5C7@fNwWLQu*LP60W1tBtAf^v;+6@(kfV?iuqpHWSGa4Y~Kzak$6p1ys!tsg!O zTnPMey}-tO+`PQI6nFX6;JIN6R+EhRUD-pKU#=?)Sb2#+F@n{+TxS$tsz=f6CX`tE-;?-an`x+d z8e1^21P&I}$+xwMTRrXB#Z58f2$ZwLqQPQ!6m0RO)+)arUk2Wurp)J9W5_OC+xK=5 z+wbBK3w9)yyynuL9@^ZTCX%ZQ6g-;$#K}4c9r~bMHfJ$DKEx(BfX=QB{alD;UVT{2 z*vAeediN?k(j*qCLO3YPhodxFAcf|SV}#>sXA8~|xEN(hfbs{I^kpVbG5p5jD;&}I zYfES_4PxM?hBFR9n3ti@_lvR6x z3XFFT2ed&%@rdR(y{;|O^0Qa4B>^dqZt$+83n8Z<(l2nn#aoL7i{(;6QCl)#H zjzX|X{~~2ALs!97U=i|8&#%Hb{kr4)Q^-ds^2jLT*_aT+J~4z18`J{6pAK5^2XnK8 zrBGamu2zgm{+xpbp7+9G^uP8*=}T~B@nx+LhvD^~g!x})qHp@q73>zY%wuJvGSs|} zW%S+sAAY47X<|uco{1~McgNj%et)ptAL-%KnQ^{Ws?xKXuzh_0|9zF9J}x)8(_YjU zb`Jwb`1V_2Z?*HUGZ+3#)0IGaR|u&rgKeAL+WmJ-Vsn5CH1f@LJD0OVkN7se?)fnB z($M)s0pvKKj%FkdEvR-uu2yBv9SYg@5Aw(v(MB`RIb5X!s>|1ylZ`Sh>TRc#9rD?t zXqZvFp01numlZ8Z6=emx2Y!#krB*gx8XS}tFjAchW zDOP!f(rm(@OgcFRGv~a-2VoeX$GaQe7*Q(KViG3?eQS^8xLBP-Kl(Ab2lxKtQOu(QBu$Cp0`MdYQKGXPzv1ImC56}kMQx*$_+|+cQ{%7RG0VIP zz8c6@{NNy3;jwy}gD9TOj*RNrhv#lS8$VZ(E+m4eu-tfsnT&i#^X-DRHBh(aC`Nb- z{$ScOg)t047JxgkNR;DctIqVX^?khM5$-cIKM+e)qt9B8Gz`2uM00#7v?#60<3dBj zbtLyE0Eb~zq{xsgsjBZql%XyTJmd-7?%#G}#fe~=M>r6sGk&{}C=qs#=)mzsMIuu? zvS*XxwsUhF;{{D>F7O*_(5sSmEuqVqb+~WewzyB`CrE##_2>#Hj963s10l9ie}qYg z_EB2iV)|2nPS2o0;e_CX{h~{$jp50y|PIh?okSvJA44y#7*n_mg`wKvI zm>==A)b(vY5_aXkk42Z1m-^5x!Fn+xCNlT5K{sQE5K z)pcRRJ)Le{nwxG7L0NOZi9Va(D*7jm4$#A3Z2L99tWFem=gI_zIT}BF1sXSdd~9E^ zikMvGPu+|c+DJU`Xg` z^Ii;$Lw~YoG_oXkGZ0D(eG#||OGO8AVWx-R`OJ#VcT*&oA?P7Baj#zTCnIRo=;9GA zr!lJfzSAKcw9RyWH5{;zVV^xk+9@@*^5Blqk~5%S>MQAEY5P=%KGf?AqPJ>pc;_cN z(i@8FM`N(+h#|gs!*n5N?^3Rxw7f8%tK@v;v7&{76;Arb?*Ck&MYIXW^GNu?@T)KP z2yqKqOxg6Y0hiQ0kc4ioYIMk^XKMFF>}RHS?FI={RVcl3${tx-1m}wZ;}l2pVT~AX zEB)x5+awm&RI01GyN<;`9)y5lP&20Q>w5BU`5QB%7H@FGsw3IDzNt7i^k0N) z0}D4}{PT#1gIm2H+2qq_l3lQY-HpOn6DNkRoo0>a*0{wW+}hme%8M9We6-yEh84I+&wZ`OcarO11=`# zfA>&As!LQE#y>m}NX>8qX$n-iKk^(a%F-8JNc)YAJYS!`ps-RJ^5(JNg)`4rGQ;u( zJ}8M#G;62FRWZp4u`n?Ir9*eJXPad}Z35;|@nCbU(S-?kkLJL<01kmx@K;yUj!s=O zo#eQ#rGe2;2@Z|lw7-_im3;Brj;2|EwfWFjz5a)MXX`>l{>Gsk+buD=OB5Qba zp|TN(;_t%f0Wp<+Pk@p3x#H+m=!zRPxkTd(gJgS=K9ODL_RI1*jI}bCYh$>5O}8Kb z!j-Hiw?B<~_h$lxI!=;Uz`sez{pdoNgt;jQQsx5YZ|^^ce>ahC2oB;Nn(<(2N-^!u zAUJcfka|*MdO80Mi>W4)k52s#QFz9DpT9U;)b+47`q}V)Dp{h(U>R92^hn?iJI!0n z1^3Of-IkTlhJq=3ZVkEnL!_b4g~*x$6u(SA^Lla?q_chHfu3)n$trvYD-tCatkk$c ze{U>>P6{a|pn#JiNgDH)*fBIoLZWMBQ>zczhCf-NX#xt87Mpm>R{yPg2Af#WTQGj| zoMb)@F$lhe91sbQ#a2cp**`jq`B&EzaB5anmKQ2=!_)K>;8U1gPaR14W_k* z-Q=u*4sBOmXjh|mIF*&2vXj?ePn~{ih+R&(88}=_j-+o_QMWZ%fw50(ILy&lnIsP? zIf(;=QsYSpU*RtiI;b5NDkCiV)wV)rC{$?}s1PbMdPagQHGJn67w6Uq!@>b#d6UNM zl(`)OQ#nW~7y>hQ@yt-z(f2%{Ey|(+=%ZOOI!+(WU$@lpkIEeAaqWCnL(l<&nk7K( zzds^U)D}{8mhSc6axPF9tu=jT!x?$6Kd%iI-GyBUT?nZYnOk7A|+3AY%ON@g4=*#70ihrW%XU>p< zkNF=-=NQ-N_jTcH+qRo*+nj9IWZSlFPBq!KZQHi%`TqXTi{AICbMJHZ+Sgj!NRiBt z+(MF-w@H)X%s(TN``3K*DQi)Doyw#P==Xsup{#6^A5gqsw+nc)5=yxHQf2pL}p+TvNnGC?`voy%b~_40n9s{HQuZqdYG}g;^1) z5!y@TN0!BnVDFd4PN#bw?;;VMCM7;Se8SRtvq+!()zIh*DspOd~J6+*2fk#vg;?ue5}sbqt~4 zCbEWvpd2@jB=lH%05#XYX=~{K<1yqHLV?-U(q3N}UH%9n4m%U{EWT^$c5{TXWqEJKFO+g0M|pflGDC)07ns^t6zXSG;nQ*C(9M+*wpPt zis)ROcW=e`r_0|h@7}E2@w!YyufcutL168Pr(MRUaWK>UDG(FXAcPA?THEru`M$D! ztCJtR0O9QtRsSeOn}5LX&pU-5w>>6gWLP{@YB8og;C!j;w5K9`VrU>zo_8s5ETmKneTnqMivvKc+K`A}PBD zu2oRbS;oIau?}0u3oFyjkP*Tjs+84Q?|qzF#PsuPe_Rt8;$*KlLjWN@^UId+?x&Wk zI4ZOOjgjfjLt~bZL$-$wby>!oxe)s=508Rae{2tMux{8>g^+I=ta|yT!p=1-)KlZ6;U-z!szY6wP=wvgYPE8J&w$Wy|>V@#hP(=&R;zy0x%=onzdBsA6Z zW2LU;e)|3Gw6u|ab=i;Uu*}w-wv&nZutYys_2dy#xt6pOM^C@qbt$JYf2anl-*3L+ z4W^k(_ZkI@c@5fd;s&HqYIJvL;b^t7?XX!pe$qhH%OqCPW{HgvfB=;oR|eDSyGWeT zcWBQi)?7}BmfH~^)3YI?Y$eJGbkM2??EFY=>qk|;-SrxckGjr9Tm5==odu+E*@doB z#%Z@rN=ML{AxG~16~KGreyeiW$SykI&kb*aY=-KvuaC1)fza9|a#l(IAj z;=dg4U4Xxb%RI*gL(BSK+cD1m-Fg4`jrR$U!o#+l6BKYA2350hDAyy?SMUD+`U7M6 z!j!KNgm2@4mAAw5mxlK5#=n)^8mGm>@<~iZH^)Ox3^nbWxjH;OTQBB-?d;CvCr>_U zQ!X_nCX4rJnmYWI$rU+p6(uKK4F(jw8lff}peElPQ*O_~A3@N_bqD+R)Z;5I{vM zF4{)_({d$YL*Slh+mbe{!RMs?&bgRH0Tnjo1BD!-Y#GNj<-vY~w+0-sSzD;sPmDj> zpc{S-d88>TvkSq%Wfvce4Y;%bDV-7@(8A=k&QSflM(;}o{KGZZ8ggST=}U_( z^I+$HXERgxjp>~H6#f`O0@c;VdAxZ6owgi5NFI1mYfRyBKO*5wWxg-0a@V5z|7LWD z{u6OLey+a6cyg24op90egXA9=D)5BATeYT(Hbs#-B`~<$MQ^jUG3m6-%jJqhEsEw| zCL&xyjizR*ENl@FP+WZ9>MMwZg*D=V;oT0PV;BhWF^@SHGe%uo;)v)H)xnXbTO(Gq zEPe0GzySD7WnJ9T1V!_9SC13^$33JZmee`-4}l0oXZtZMmR@g@k0qL>e6?o(`M!R| z-OHW{L0v^=3!gXzTgTg9=+KK{yjsHj9MKoId>iC-M3+(migz>>aLRoffMh7Pm1n zvf`JELpw$JTVJMHSN9{o=@?hrPq18M+FEC-V^GTqwnMRh|1Pveg*9t6#e)Da#T8Z_QJDi?kwQta!Rh3pottT_b(;Vnr zwkS1bJN*2SzTn4W&fyzxr}Ie-Xm=9ngBK&X|NG;X23&2fyfHE6yzu6_Z6E*TaHA&^ zZkx1Sk;7Qk1qP`=_6|(syigLUZSfEN2V+87uB#gZESJS-yF>D>J0Qvu?^? zhj=*P8pn(SUUiKv0M1jXFjY7|f(u0iX5KY4T17;u4Gn_Rh<$(2#TQ+Aerpz}C!w%IA z1O7XEiX@@axDQt27Z&!C&0jD406bhgTqW)zgfEGSW~26V)C2S$oUeW4Q!7- z_+$#?v?a?CiHKlQXb~z8m=RUUEAgR`+UcItbq>EM0Abtb>bC@quIrHhCP8 z=|lf)xO7)=fbSXh=Z^3PxVJw9_6=TL}~b0pgqa-%kDJj-CxilS%8{ZZ$#TGGqLm2mM zs(psiO?^nG`W~Ia$@7BFD@7D@VCI!|6p}g;kdow@YN~nvEvA3|YK(NRGGimCQfJC+ zE(Bp>d8J8rh7h-wD;J)Ze*)PnFX)&2A(j)2*#Hk1VDExNHu>Upsbhuw`(A*Dk8%C2 zk217nL8P)O9(75Xq#4dy2(~M%dG4N#bj0dOj zi=$n1Ep))2!ymV`_!2D?Y$XmXbw+&MeoO@l7(f=?z5`~0(uNV8c>}X`;acVO>3Td` zvR$AjZxB7*7tZexNyVrPHLaJ-`^^&l7Y6csz;tT8%5MV#?cuYL)30ZMf1XbxN_A`f zmzEJtVMxe2(IQ0iV|jv4vgEDkfi_n<7OvIbxlPaA8lcXTWDeu8x=%@Busn?id0!7Z zQjTQ3;V%YGP&X1Q{Q%3}eXcE=?XB_WE;%(=q~PJ(cIL}9u!5j@gXEP9Yr+V+g<2~~ zIf2ysg-}IHhzA(z;g&5mtvUTmv0#GKX^E{e2c~%R&*PdozLQTio{9<8vJ8a1zH5oK zoDGT1@Px}(38VVn%8MV|>OCJHHbF+fBCw&Oy`c2<5&(x5FxaNHa`d*lYSjPuJnluK zQgX=bEQN}K!W_f|H<2?{)-7K`@;61jeLh9e@bKM&(72#QG(KEPHUCb=BRRSVjA$Gc z6J*vPJy2D7UqgbCU4VeNgN2hBZ~#Z`FV|g6j83s-flY}$m0d{ERXp5X0Vu-WZYVi- z)Ry<>fzQg; zPIp)!ZEJlY%Rub<2%@H$$nQL$T9yZIm}SHB(B(NXU-zwiRna4CuN%Djb$lOyk`c@8$fB-r;ew_q&hj%1JS-6uxFMCpr6kthkcdUG zV1G?HP1k0Q+86(^#J0KS(9K#HUw#@vxPa%y;{KH+WNAws1!L@lCtGSNrHjRRl}id$ zV(w%~)?b&9)w3#a<8UHM zBxKo@6n}IOmh==eLJ*qvE3>+%QW_Wx#jbvJcOOBZWu7!=&tN~% z4sYe6C8{~eVqDpnlwBXstbvquD9mCD1c@~iftVs$vh?-^kqG>;(~~#H$&>)wqivEJGA=7@2~57B$P{`)tZ5teNm z&s=BXGS1El6}{vjc&0_}xrQNCHScdYXwaBDw5VXBXztMg%Mqdcx<8s++atna*KyLI zQi?Y)sZw`@;GBCd!Fwqr|)}M&z8e_Y)OV~ogDN1w4-wwn0`K|@U4%mavVlvKh zu%kt}qHF2B2%|nnXc2LR>zUA@=kg}6iOo1ar#>+al51AGVP0QJ^UN1|T@%f+6>7eL zrtXISW@+p+Bp~uWVgm+|#}sCFcg~E>3`_=7xEv|2G#Z?*l!-!^|CA<@G7>PNq=QVO z9eb7M#PnjX=c#(Cp0LOTF;R4{*=18t_8=IrDIXSxPL>QxNo4dEB5co-Ho@r!3fbla zha!Mj{eijdQ39M`N)yC4JhW#atOR<<1AuZCRDtGLw{Me*xD#@WXa zZL?>7zW2F!J3TZ~qmigcq5F;0We#mxjCV$Drxd9S%g1fmXOxLOk;HM37Q(Ybs_vOf zRl~^-+`ETU3FZmG4CNwxOV~co0#w$VYJnG^-m+u}jT0U?G4bCoi-#Zu8#)rA5WjdZ zoqcm3+Iv9!$ z^f@?FW=@B<6B4I#NuB0zM2R8klKxf93$3+nm5G8 zCb{37uR4z|vtb-iQ2Zz;@lsX>Qr(B0%3Izf4jjv+<4qu}5zZPnPjn9M__|Gbkf2+i z5$y{p233!Ai0}iY>1sx2n2w=dn45lp)IbhUi^HXq9fI6tr_ml*umUW%fHV3W1lvFp zq1rVEDcJ2@jw;B{-fRd~r(-X#k;e`LU|OI16zV87mb9#G*WGA$ zw!cx)GF5&>y?s(Mnn?Yu%tEm*_LThU6;K`w|?NR#I8a$QZzWY`&MDwifCFRA5NB)W7G1+l+f#DEd9uq6)tS*mL z3{Inhwn{PRS{>scEL$`37Tli!iVIT*k+fo2e(R7^y?iCDgEN$ne8EDSUZN5*+qL9L zBvL9ORa>2xjJehBnh5$1?F3T$tAL(B+&>)pg;O5N=o=A3bx_Ac+NHJ%8f6hLPFpmm~xtt z7Z6h$?NemNYsWr3K5IjZWE8mC{%4a&id4Yk*0^RHK7QW_iLkDL;ZC!bLCUY3`g^)zc!-y=QZs*!*N$xX9%q4 zH?DtI#mVeVbkk`LP3p@Jh)UXN6Xrs0tHI<$vl#k}Q;cTy2?ISAeKsSHfk$xhAx~2GPF)!L#~bdj#Yf{+Vk)%hR^aS*6n;d z&g8%kf;evIlicPonFRrJ(-*`riw&D9FJsXt)_j8|`*4=Zf99`l70J8b-Q+sHZ~XHP zm`lGo%--^@x+8r308k7DfO}K~;MG!$yWmcx%iwb94j6+9hG`wph^^H?6HYJnMaM&v zc2`G=cA;AbXhd3rNaI7vz{j<=rKYQgUwHEvXhC@3E0pMY)I#D#iqVaPNg)WsCgE@} z7RH~Nf%@O%a@%a>HDiv?kvYACkFye99Ca@Cl+BH=Sssi;7>{-RKcqlmIC?{nCshklJUlyGby;cNBhB`P6vF67se%FqG9$eH3nR86?}IY}dbp^!n0 z%KQUtpqDe0> zm@*(6$43f@5dD2=1FXKtAV#$Mt2St3Tv*9pi)Y{`_XnV=6f!yrJ!l%Mul>f^J&5zp z)kgeAkJ!bR(I5Gc_u*+atowIIxSH$14B(_)R6DH8QE0vF4CIMnST;0XLjQs~j3kpX z3@dHusM>X0{L=T}Ohy#PlhH_mnds^*V%PJMy+Rx5ttFi>p+%h%tf=7WYofr($g>1x zo`k-nn$veekk&Be=VOKE9}J11WeVxr{scxyw$vy~wbXcVdv|%Hg>Y{68(7DQX;oJQ|QbJ^^#{Aaas^rP81$5War0 zDK%wk{)aND%2$Vg3U9x~i}d4)<>L39!Antk|1JR9(+*kYLf4sXuDXA*b7ErjF1 zsq>>G!5WU-qK@No5!vOK`HWvX&$+M8k}Edz*64iSj-f@Ko;h_+9aR*S+VVEK39Xm1 zG5v0sPR%}Z0N3=#?f5#?q)LI_i4(q_Uz~_0+0{)o{e&2@ zOB$P__1`=3kClp)p#{y2K{DL@V}YCaKsMDL*r3ye%oEfl(8)Ls$SX7`dALO#BS@s3 zN1P}Ecr~R1qHtSNL>~{3cb{ZK2t}o)x)~HyoyN=JH_24@Y7o7&CPVRPx!2!=7z)k4Ue-w6`b0t7N zOI)@@cQ6A9ScWbarO!-q>rA7uV9yzL>c(aNDG!jmGnP30ErZc?!mht*PAZYYXC;Ek zVZ=gC2>C-3)iaB827iIADc@R1y%mK0fW^;8r?%Vwj3~~9vv|lAsB2}gHQ+fZP(+q+zAs|1maX*qyPAnCwk?rm6$O0^!FoT(M zM{T)6N>L?IlVdx-J>HvOYmPgI*DsPc+vTnVSJ}e^D>_HChWe?$DQM4LzsO1g41yBt zxyHsPaq~)N=ech%P5U0)jU*WN{y^-V@CwbmFC60Ed15H3@WFJG=5j1FDV{TEHUJPO zocyAa+CikEz{61@<zd9{>x$a@?$XZ? zz~mI~^u6WenUC#G0p=SXlNYJ*pAafu?!WfoT3X|r^j6YZA9qJG^15^Ra|36GL5 z?GmWgQBNG)Hq2=Pf|l}GjqCXv1OFyb(O}8wDgjF-c`FuTMc>HPxUgoqOg0Em1g1o= z(whCkaV7|0G+CFQ$Eqxqj8BYHgw^e ztTF^2z4iK=iXrUP$R>tXwapKSAB~s3I!|(PG^<63Q79mzNJs5`mH6T~ILWEW7)32B zj1SLiqf;#4pG#zC2<1zp`7tOg_;4Ju14PpCt*B9D{WpGwf^? zmnoqg0Dq***x)O9v6nVOCgi>XEW6j8{9dLQtOpY#j|nK8`0Dd?BrzC3ePaCqd|@VODgv((O-zCf8TFS5>>Pu4dyK zvW1WaEe4-^vIs2PUxqXemaeTe^*)72&4AfSTT#ad`z_G z!aCZaLyD;is*ZwDxX??{d4~24XC!s8I9l=qB*6h1Pl@S_1v&r*n+o1ZIJ>X$zcOaq zen#jb7%be6miwzK0sOm9fRA>s0rwkH;VpZmHS<5Mftpr`v1{d$PnB)- z8Cw!e{b<34MW1BM86O5ay?5nbbyz~2(V;G<#9Fuz|8cKNWtS2chC4y=RHS0Rh|8tW zf%~4nNcndD3>2VYkiyI}5x%Uj@XA|I|LGC-m$tcA{8DT2F{M; zWy^J++RHEaOeScPaL|(Bo^SW(^YNpfUq3~i;mamQr@1eoU$k9TU9B!JLV^iHt)ooY zoC1QQIutw>T2r@F`aJ$j2uifn?;H!A$FGHaWUS!02tK!J4^ihWJ(uxj>LYGA zE`8l?SK=!#^@rFueV|>}y2!BiTu~Bt1(8gX*$7&eOIbd1w5gbqV=;(#16miwy)g&}xX)%01YLWnNZeqlqI3h&#LhqjR z+*z$XYCnqTTe3dDaq{%?0t9>$0|62gwzn;YFZQDtj{*D8`4c+Ws|&J6p(mEfmzzIX zuEt{S)fZWRVJAD`& z;ICh%TW0sO2)+h2@c5ZQw&313pU2b|-?lPU*}`r8^PJ{hcpY;%Y0<-dguS_RkBvY! zlXdU)m%B~tig_TSG&@uT@|C+#Urw~z5i|{_%xpfR(-?-h_g~DlqI#$__dA->L9vAl zD^j6-P=!jX_<#dqtihFSuNSP~UOD6&wT~V3dQ) z={B@YllueH`1e$h{fZ|3#WBTP&Ju+t1Q#t&P1t#71u*y{#_Of#nYLgJWo3e^g(qCN zptHP3Hh{K5hHNWye52YeTK?e6_6`~dWVPJgyfTknJ&@#c+b zW~F7jH?*6+)i8qb&!<4Ly3V{eLt1mJOEnJ)fD{F`YqslOq~P&cJ?-nf%waWgBs(DQ zpUw9{TS5e~Bx;Ncz~vG|swk?OZV{*Q270g#7r7m z0wZWC966&;Ahipbc-&4WHw8)AWoApb`Ty?Cw)Ur^K?qj|y{{Z9xNc4)-6Tc}tpQWp zV#rOshk6?I%OuztU?afm{oqV&G2t%o?o2~j_?PW&aum``92|8hU4l$*sUpZopzJu& z8P-uWExu-x3~Ch)1srciA6%|Dz*KAkNHPSZ9OC+;)2iP#gkr>NIz02pw8;*xWi^M>%`=W(7k-X@mnyAhPtWfb7S(n1Okq=I6^f+D z#^9$wW`9y}%kqm^nOWFvflvX=9iHbl1Etp#q2 zEHb%U!PsWZ10XO#!EXKla~>J4sknXx%3I8+3+d-^X_|sFQuwMI8bs}Cdil7*D@EH413w4onb~Np?^-s ziAwEoLJ!8-zmr}^4}UIa0@`dyz=Mk=!t@RkC(8;<;4 z_+<~z9!f99IZgyEE&zeNBP%na0yt8f&r4+nyCGK6onaU~S48ztn^JIx4w=jt#TH?lD}ssz2Y7$<$0nL7C`ZN_VXsPdfMN+E4hX ziGge0qMvHSV9X!2q)?)Ntcd%toF2oBwaICKEDf-pgV$pV^~o$LBQhv=K^Va_?j$uV z(%6V43?{TMiZzvb;-izuP6+XLbY-HxGbP=xxsY?rrs;Dg?Ar^J!8V=8H$+3kO6luPZ*A%X+f@t#Hcjnm6ZzozCbbpaT6% z%iwVj2yT`7(dD6imGCnh)=67eT=860Ba}LRU;mhRf^v-b4^I2)@15 zl#yNm0f>Rbafk);J)WXzr0!t`rPVbGb2%`%}nwi6wfgBu9+tx}Wu^D{;PVRjqF}6i6cACcY$-tVl zK)d`WR{}uC==bC;4ABEEdUT|#Y4Dh>@vP979BQ+!m}YEk3hZ++K5DKs1OWJ3GYMCP zBL@yThl6ST2SjUu=`Y=jcwtAYd(~w1&*JR8+xoVdgXnj3g*{a42zft_oU@yN&@h=< z0znx=z6Whjpwn}iB*xgB_2qt1nzY%M)0xl|UL^nE6f(2nI{Kt*9gLFPF4ijI_L#!AqI#pp~!?pQ*;+ypoJN2z><)h1rDmJ@UuZn<#H_Y+;0Gs3YX!nFMeQ z^Y5f1gD3aWK`d9qxToD8_Mn@R2D!%LA*5KoALp~p?Kkb`$qG9DO>}xZq;uSidLNoI zVbC;%2i37nIuaV{UCXntbf;FaMK${Qx3zh#reITF%Va`#J5HC4LV}-X*XdjYML3;? z*I={If&*r~_uu*;bCW6Ns(V%f;IF`7%cG#WmP~&kkkm8URDcU)4HWE)RJDi`(DlBd zgEX7f7msY>YmwTF<$w!d?py?8k_szVqsXU7yGP9zXm6)j)#HcKq^g)kb{2>O+lR6{&yt9M&u#eNk27t6Aiy7wE(@k&sxDg1V8=U0>4r}33 ziE-3bc!N#=Uc|qR?MXns`P8o-XuzonX8ElCf}+>I1BU0eBztg8<>`(YS~22mazJ}| z)V)!Y$}10}IK%cyQK#Ji17jCESYavvEn`N2exncxvc#aW!EmWb51%e^2$|uKS(Up2itL3QGn@$jL&gk~*Rzds1sac= zc%S>vJ>yS*OV8I8YNy)*W@s?z6LOBB?KeU3^J+@uF9M811nql-us<3p`yy6(3trta zbf*=(`qi&M>3Lm2CaWQ|)~gx5-^@OQTGmKQ^t-VtOHHUw2n-U9$u1 zmt~ayy;s;ZT$BjH)i5LG%BUm(`p%W%+`O*(+z+G6Tf! zUhY%5A#2qK&kD0ORlI$pq=p7SQgjUoO(A0bo9+k~W~3;%hYa>!Txxi<<=;0C6l;k3 zH(oe?B-QoM7yWhBkkCL*TEW}>fftY$rS5}hj@?tq+s)_#y~lJy2XIDw6{rAd)IREc z|GFjZejWT7;ko&Os%d?=d3#P0s6ZnGy6|Mbt&r#$93gm9;Qv}pqm4^T4kLz}p3a_v zl>hSbbszI{nyRoH;U5+ zTrX=CpwJ?6+xQh#hgbRxY{JRV$xk11kMz9X(e>q~yZF1FZ#m$9lqHLss z5x0^9mbga>>RQWH9FnLd$Z`wOs01~tP`ca!&za=m;&rJzK+Mqn7n}ol*V65LY`?sI zo(RPKAtd;$)@q8h^SRKbw4W*E2u3(tl(WggA`YE`OMvH_3jv!4Ofz50)(D#I{e1vT1DtrzrDmD~KNt!c~rSJiKSKEWa z+e+!O7H)du#Mdd>)^Rnk*(AcsA8R3OT`z* z6~Ufq48ORJEnmqO@{)Ux(e1aF_BL3kU~hQ=J{VUdem*&@LhHAaG{cM~EVDO<%pGr4 zB}z|c!sJhc@{TA3CB#g(ON|&or0wZ?9MGCOjL53)VN=;yShFe;-p_2De;;muL{TT= zXOboIVgNVtoWbL^P`tsXc)D8?MgRmT9RI{`Rz-iE77N1nAY$IxzZg@Y&ueUQ?)ePY zi!N;@?v0X>F`r~`;EfL!cE&qz_9B@Ew8PBmA;3y5v7yNDdNtw~z>K}WW#GjFaLaa` z?!8dl*6;U=w*5%j|MpJmdVD@ED40*A(*N&B0C3Wf+9B>Nr>+f+_z&0*m9$#MCmjs) zpV9Gd+_h3i<16kaBbS*LOL~53DmwP%F3Wz`&%{0fgGydaCyb9oRBb;3c)+>UCOW(Y z0V_73Q^bx!1BZCw4ArY1%T~)cS7V z-4CEM8%c_k!#e`;AkY(siRDMy~Eq47jR z?6;CLy0RkIv7=rpu$_N&N`$ky9-)CO=f}U4{boqglgbns*Q5vq@2XImL%$Yp!jR+3 zP!^5M%qfqY9kAW)T^Db=6*-&Bone9Lp5ULlAL+cVa4&6s{(WDTWO%fe!$A}%;8=QE zP5c>F(PX-S1B-q^Vi)K{HiJ^;()@z|TI7oK<=^wq&#tL-n!k=6O3=Cm*rG${wegbk=?;To{ z4zA4hcJqJ%*r^r3yS<_zFO-cZ= zpSC6Ddf()fFik|R^=w#rVP!ob#HV+oYDHz8)gYoF5r#+K){rq$m|4WPX9A$8!99b+ zUrqd#GrzOL%IY~ogXSau2~!GTO#xX|Gdm-bQ(V(gk-M8*=m6=peNtF``lMWsTrZ-N zrcRN`=y=}I+gSPHhcHc0XNY}%WFkKNsCT8=={|aVpDnh?wY|D?*A==_H#gEgMhm1~ zL~Cw)9rJ~wqOz%FpVa{)O92mb_)nw<1b{0xz1v9+blZ9Yx&VD{w) z3-A%DdusvRC;6eqcjrBG^kDE-jCu68F>5ijAvH>Yb_KP0&?2YhdSXm^e=)zhNcljK zt=r3zuD`hQ#T7ulmQ<)EZNU}k^?*;nT?R$`$1t3vF$KZiBu4aE6|T@06D#U zrKbAZ&$Hv!ma@Bv5sw}*lqm`^SzkHGaw0~+Ju(Ry)M5hz;^0G3p|1r=+04}tybg*w zNWT%+11W#Ovt$?nhX4{j2Q9`;0f3^r+rme@&Fb<4+4Z5_?hAD1E9>Zi*lph5aRdaz z?Vpbit7ulZA{)idA-)5rA3(K)kt*Vh{M!$Il@-y5ULSCUUmZ&tUb2Fiv6Z!kS*8?t zliL0~<^ZJ5#wthtmvCaU)t-WD+ZwR*<7;C!1Xl`Cf*#Tb>|!Uk;F2MT~I zGl8}kdBkI=$XMkvG*OTJUJDfFrDHdUxg3z@yzU_TEP<8?(8*K;C+)EoJpge^(K#mh z$wg*?Gx<3CAzO7Y6y-vvL3c6LD;FF!valkI zj$lz!FMVolXSsXPcpX1jwc%E3`G><2^~=1LCtl2M4gF7KqPi&)OS&7@ZN0bc1m>A@ z2f)P-@r9?q`6}1#Glv0MlUm(K>1P+2=5~1r-iiaL7ymh-f!voqF&&g1)+VpMKrM^nzJ|arEz_rb zv`Kzf#Vv{s1AnMss{BI49R6z~j@&?wni3U2sC1QW?*Fj#I*W8T@wht%Dz4xPMa&%H zV03kDZa;Y|%l|+zwDenl3a|}I#kTv+EEwtYqUW17i^J}?G|P7XZ{Wm%`e(__QaWPW#xQ_nMFRa{Gf6g9D1$lxyX2z=Pfh+13&NUl zh(C9RdE)i=4&on49%CVR2!t&Ii~xrY5_jHm&AX_IL}r{8)ngxAvWCdPI9E^m1uLJ9ApASJl1Ks_==U169DQECe-)35X z;yjc0rL)cTL%R5?bn^TRB8fJU11U8q4OYZjj)k46;%}pFkbA!TJzHQ);lW*vrR7iiTk<`I-R8?ZowqqyDv90zN}BeE`S7{ z2i-=9Dk2mgLy?&MK5F!$iJ*eBIP`0#7rF-<55DvdFbWv(er-omk<5 zUcQ&jfrs3e&avN2K@P;ly>*k}rDR}U^J$>9L@#L$TjG&ssG44YFW$M|m*Mo2_kR-i zI6&f7w?T_zBS~N|<|d+9gc3yuZjYpr8E~PZA;NV>8@Q`Z32lU$;e200niO?DfN?Z1 zEzFLm?oFL@t7#-L<6PvX-kilP=t_qZDF}|(Cjh~wBzRWVrot5&MN%OsHRRj;;w-6c zKS;$$l=b#kEeu``?7oJpQxYrqvkIu!#0=yLzX!_}@X7U)Xwen>N7(T?YgMnmSKUiU z)K}ppAIUfl!dgVvB&{*741B3GMOXR8pR9gMWD2+w5?k{Ntxwu}e!(~j1-y-|bs8)? z#Z7$h=%w$h%jCEr1GS{YRBAN$B{hiZ8S*qbUQVB}uK1+rSaugnv`2Iq79$yLKPm8s z7&47xyxosFn1fB`b_pXQczNz8&TKSBt08Y7c0pa{W{(8-d11_)O!<6~&c2PF2R}+u zhLb@?JSpG;oDciUrH`aY@a4LLeHT;QaEiRk4uAw6$2_?ryQ69XN!y2K3?LNHXM!7U z$_+9p^k4fip$4#dnvLOQ1UK#HMDzZ5?R$G8Q(`;MpUT_jahmxU#y)WOU};j}!~k^Y zTV_N&yjZ5_dI9l|Zp1dam@)9VKCCnL3!$dN{>6mw7OY&0oaao<3?8wG$txvEIuN2YFUp_y+20;de||)%WF{3R z%cz$Hr93w4%pnnNvK72esPMy`6~(jH=o1Rv^*dsW4!IaZM2n!Ep#|`I9@uj7lK~Nl z?lfVdM8Unu7|nY`@nA!~vW}-x+~Gb!4z8DR{m}YtyW+CC!l33)-l#ly<#aEV)wtNT zguN7FUTHlM9TU%GH#*Ou=Am7W$V55zmNXrnTS~!-B2ITo7)|2C*lI3B%7N;Vx}q0U zA4X6hLIBzg8VV$r&4b96`ftCqP=sDfSa3!-UazYEZ37WS_cb*z|v7{@=h`L*3?bnD-_ljr4**|2prbuR9;6QM+&{@r!|wA<$vOsqmjE zi?D~l+j{Wk+GW*tJOBNV9JCzZGy(qGO#eK*xfTmRHZY9c3#BC*JdDA^Kn6#nIx&-L zV;+OI;Pu}I$M-kQ>59R}-VDqU!h%Ceph00u;)|<9OK1TIg(qdRV9|+)4!eYh6ob7g265S2Mugl)mZ5@qG`<*9!MqKXwq@Y_$b8DW=jF&J zg;(cC?$y+paTQmi7^fWXd}}^|E&L;)uY>!RdQLvV0ulL}H-^&Z(+13j!%iIe3hRT) zlW*KS%?IS`KVM{SExw7_Y&`4P%dbKv9kz19UCIT+NW5MBPFG@Du|&Ag<5MPNRBo9> z%P@5q;Vq&)VZz+-Uh@bGbA`K@5!mc(b#O5ep2x-O=~)>=+0M8P3)QU2)zeNTczrC? zP9h43BlXy_@C)rg|D{@wN(j6w@jn(I-T}6-r0;xPyOH|FvaN4ycr0XXi;9SVMu-M3 zRsL?U-D)3y(6Z)#s!(9IUZ&f><4n`@q{ij2L&9N<=Ez^g3kMVrW|NKXg8#y72{y{U(NxVhzYqC^I#2fw$LJ(ZbL( zcF{2LTYLISuZ?jqWMJ`zxovW~K#hcsw|v8^ck7`d)O7n5D7gY(E<|sM{qT|hP1fHE zBoyj8K6Bv(iHo@k0z~Re>K)8+ff#k4A(e$j3@^4G0Y3t^*QC~e1dST1x&r{Tun|mB z3!~4~ombEZGOab~2%D%g-eJ!%br{AgDd^E zp#j8q!|+84MHuZSzC;~<_9LU^)BFONqbVF*k5QU4941+>Ns0dEj~yDeFzGs77x+Jt z&M7+5uG_*<$F|LmZQC|Fw#|-hvtrv$I<{?gY_pS7-}!H9)Tq0vddJ#pues(keVyf@ z1MRfPYanPo>MLX>6p~&Z(Bt+x1%q+qFlP5EHplOPhdWdNqu-gVNiLcQzN)vzuU|x1 z`mQMH`tCUXK*TaI`PY0jj$mm8$ew-!js|Dbdmkx!UwUpDY}Z-7{_TDP{)-i<(QQjo zAj*uMi#yBTtiy86HY@hEgKT4@F{v8m>L zvkMM_0qY(lzlj^BjKo7$*vLC0NBN>^fX13yW!;8VM3M1d zoeq$AGc$bY581N^z#U~gZb3zx&sRlEd?dD^^Nj3_VPMM$Voy`@%J#1royhFB4H7>% z&9m#0%f#mlN*xfZzQUjaLCt>O-3p(ra+>6f?!{P)o`UEBp&;VfD*`@Dj9abI**y_G zbmAQJQY%WhZac@FKy3a|t<#ETlVd*~@9~vZoo8a;>|U~`&*#Ys=j@T+vS%@@NW4r+ z$mNNJ#ReGW^XK)OK@Bom5-nkq5oIx#lj(_a4Tzy(suD&HZF+7eL=8kowZg`hIyb@L zJ8~(Xi$)L1*vIePv1Ej`Y_=}Es7j20jX9Jm$%6e4ii_XcY$?rw+D6G4V5Pv8qypm| z{qM00y!cY>D2pu^hfiJZ0x?3xdMnSQ2H|b?`&03F1~3VPv+B?AzvyAoY4u@f>h&KC zM+ct%{hHA19T*k-ax%D!(yVtrlIi{accV&;{yHE3+g0x6=qzBxdx~y00o(6vk4S6# z-?S4i$O`*9G zs8`^zfL~RD-Dx{z4?)lUM{e+3@e8zsf&eIGUd%0s958p$!1eXIR~e7;;-|6EgnE4n zDcTT3T+qN8z$juxq(;XC{pv#oQ|A*?x)jT&ngW9s886x_4EkO;il5W*ExzBXUBa+L zL7;AP^>o!zJ|4J8*N-6q?hHNQ8!&%|nrObmhbaACPMBUEEH{ZaM@rO$9M4Z?uZag$ zCf?6TmktynPEoAIR)Iyt>Mvz$D2_GJL6&K}UPQk79hBcvx(D|9_w!N;s<|E{1P!q? zHSgp&oOHD7K@&fp!QdZm2j}Vx(FU2!4UjZTsG2o3u{&D7Id^UI5XZOQk=WWIV ztlnmofrp1jg3FORZV(tculL`g*UnR|N36C*g<7E+4_^c>e$3FX-kZER@)u&IzoNn< zx5_e_A|Hrc7V`<+F>i0YnW|c{x_2nKayA`mj*+r#zsDHNYDow|+CRs-K~2@0PS>l(=g_N~x4$EBy!(5)WFEo}0fVMP%!Z zQG#aq7q60u-Cj_X=YzyQRk?(dv+Mc)NEZF)JnbDoBrc^TF+FCa6K zz24)`VAgU{VKx=_6y(xCG5TK`&mU3t@Hr+PP53-S@h@IDKc@{jhTxh~x>4`6a*}RT z9$~d6Mj7ErMTlb7Ji}Z;Y7Q5D~|t~u{j%CcDxJdDQDnKI%RIkC$a z_@i`CA@|(SCddt7E{)1ULn8x4sDpR5Kw|IS4;kkCJL9_cBX}G^1-Q3V5^>8QF~agi z#jHSLr=hd!_vfNo@Z>rn4~7WxQlno2FioQPYuNwWBTCT#u6TyAS}PXy)@LsB??Ue7 zE>yjZ?|7&r)7@wIlYuZ!m_|hY_O4k+7w0b@qw7mSW{n+_lZjtTRsO>+10$!JFUnk- zMm$GSds9TO4Fn#A6s4~aQp=CXBsW{rbn^clNGQ}WEG|lM{=p}T4hLo##c6^^$-!a7 zbQg)8_Ght9+I=12eC>l0=o=MyW+wE#75`El?vPAEr!XuEJ|ql8hz|WO<9aeu zcRVcBvbiWebdQg&jgp@z@gcR&{Ez~`N8YMg>%#Dr1I6*l_+dpx$Srt8oUecyAyv2v6gl4HcG~w4z;&ej$cCTEtaPC6<^>Ve+o` zzlP;0BDC#zUpVQwxIH$s-Fv9Pt{N(#$&1B<*X$?C!+~(w*h4)$_}B2Y&34Bu7@DSE z(Zmb3NVb-`05o>oc1Jz!E^IowzwS*w874m1XSjWum11@a_+lRtKanc+?y9HVA5@@# zD8Hf_%Gs}8wl0sE0&|0xa!rW~Ippd3cmY=Dqr)1awc%EiTZYoGvX6GWxLz_X4z=5G zsKV<-?FU|F=d()o6H#!ahF-=6+@6-R8|i0wXN5Z(DUs)>=(o%FSQu68X6ri#Ax_Y3rio-f%fHS1e8yShJFz<(8lc-URrc z$NHUe6NQw%ygCz&fH_xvX=wFVgVgAh?a;G^GXEjX-=8kL=A#Y73Y3WRW>tUvQuOfP z1UBi%$Hyi*0n{a2AD2xXz#<5u)ntwU?9cz=?Y=@fcung5oQypNC=Q8#pGpc&KndIi zPJ9Ok2TuWb(}8qFFH@Gx$~rHde0JTox}z@wj|DAOIMopX>&3U;5%Sf8@ooSF1otKnn z7Dzx|i0WAnrv3qQ;Yh;0cf_rBN@7A$R@*cerPZ6}m_Gbq4A5Juk4cTSKsE1-ln!^v zQaAy69nPHX3wXc#f9}?m7BEQI0^)TW$IQ)}ENi8w%Wo|6*`!2P=926SO1{?gcYfw= zt7{r*kH#y^FA~jZI-b3}n8@Ny);ocx=k^n1lz=+FfrX)vQts{D@T$owGQ?Sh@cEA` zMj|{PPUx&~{0dO8n^Fb7LRIpmScF3^WB9^S5MydE{0(9keiQ3uxB^`r~Z?Ru?FXZ_Pz_~eg? za{j2n$m*t`I8D7}?c{wshMQPzrJY%(TLP#J;dU%sVjSqzZw30}K0E*O_ zQ5P$f61r7#kHzTkJk3p6-kCfL!cBO|O{A->IV&uKk}B19_~VX0E&l~IhjigL8b zTN=>y?TJR1`duh7P3GEe?@Ch==ta{pvIQeB;O8&|gO3l2K0WV5+?%^2M3{%3*s$30 zhV{c&4p#o9wf*uGPK`G(l*-u7u^8>uc_ys4w8tA_f@c|wN@yn-h0_D0KwcQi3Aykq z=E^-OJ+bLVhG!+e#jxt)GgR8kKy4nP^M)qt7eg$Jx6cFbiwcF()`>Eoc`416Wx#Y3 zfJk7>+G;-{tl!HCYid8*vs+s@;I285C#UD;k#n3;fUZe2%AK3ak0sB-PUD4!uq2C2 zAi+hWUxcoUAjWr^>9wC<-ntXZ;tf^=#=)E+6|4ln;W->C<_z}E@UVf=guj@PlfpBZ zqR1n_22vyS$qh=R!djAv87CvbvSrFEMz8lTx+y}7$ma{;2^1)CX}onK@rN)3VU$%a z=+bt7f&fJ>?t~hHUV!UV<-6av(XJgnHDTe(%x&in#)GZgv1)RgRwv2(!Rk%Iv!9xP zXXHF@mPUmy&rYlWAjUC>3F3D?^K|2_FDhn2!rlig6$zD|h7E$sJbE3Oz2x#G%P;tO>p={QVdaU4~OMtiTUNnx(*H{J)eWbDol2K* zmme}5mxbl>QO)>2V~SUQ$aBmnoX*8LN$?=ku{pJT{rS%iU08lw&~YvO$1Sc~QNb*n zoUq|hBk0?Y$)IsLbS-StQE2bOQdaY78`$I+Kp&tGqk_fQQ-Kvsemo{BG_C&wg=Z*% z1$M+nE0mtTvs?6%_Ohmv5a&2^c?(I*ix`+yzcVHWxmgcGo%j;9$beL=1q%Zv&OD_N z^%e9hzfKEt>)pVVk-z_qJ;P&dp3tm9uk}>`S7uXL>bY2=H1pd@mQmY=EX*BxVkzb! zdxqRC2vT+#7*}OBq$E+SoYX0XY%{2sBVpMBN*Oj&6dKHuB*lO4$=76rF`MlN8fnN3 zI}I@F7*%m%jJrB~qa@&0H-88Xgm=*@?PHPry%NTB8%zp`_?EMHxKwrvn3Yt|oi!jTMfQ$qrFaFS}f5s-#&S2an1HP4u`QT5G>kA!C zKZ*$p1C!#(bq}U68e177m|p}dzokk3Q&P9A)B{3fk{PX=_m$ycxy+(hZ5x7BoCJS5 zj$=K9$X#|muRX6@(r0WgOj_STfk1eR1(d5eUK9v|0RfEo*NpxNR`w(o}g{Jcjf715JvJIZy_-P1DbWRZtk66lIo;tXqNae$)mZ`J zC2mcRhpFkIMWluxTKQWd85jdH$S9k4=piYR%<)yTOn7xVePf$gOzsOQMHXb#qL3LM zDgFDIL$JKD7m5W0oYIyX`sPk3LWdA~GE?qxb%uEX5230kFN3_%?| zy&j-QD@!0SB)5#_4L1}hR$1obq0?aUM!<=m9>aWs7|G3L!ja>-iv{<&q}!XhUkecb z6p9+z4}2!`VS}13SM4h7i1Ss-pRYK1d{>P>Qn66& zhCl-`IVR*{&w^a5?5KHB7j}~3XKaEKPMRftXt#htkj2g6*6`iiOL0}hHo)VFV&}6P zK@TTW=i5>L+gkM!;|2!EACamt7g}lrLOXAL3c(o|GL_Lx-h1(@L-p`B`m{d@nMT~s zl+>NX^b#3b=GCsjK2tG*(WLtd|-TycGw zVw24HNn@p&F@w5~gT%OOnm#&EiBCW$Tl67`8C7PoRS^TnUGYkT#DoG1)waZ^)l{Vu ze0EA|zGo7~5i8g4|85OHqon4%F7PSHD<~)kd;t>GUESTC|2?e|JzVwtrC>A~3`1zI zojjh-rp4?QMHacOQ1pumhC({%WcW|=rPZwcZ_xiq!W1H&FZwPs>syezf;(%mh2sDu zKantn?Hai%JzK;W96~ZMTS;(c!SHPYo4>S0>TeU$j63Qd0%MX(v}A-B6cf<`c`Pyo zzn-|HHl^nhnH*UlG!WJwtw2IZamTtzFqNYTPk)D~AUoP0TEiR76}dOol;znPElsOp zW3vE%rj7KT4|sT^gE(9W;B-G<##Fz}w&-n2az`DS%}Y=h2E?t05X>K0l?TFrnK^U`!IA&B7Lc4WbXj4$BDNu%IWVpnWBlF0?pwyn?!mf6-n3b|KBSPUDjMgmFDvk3 z_@Ch<$7uxTznCoMViOk50yXphW5cLIgJYoihG>mM(nd;cVG^0v(&egLOB*7QV}7D z0E;}k3QQkj^4-dhu;a=1z3%|WmcYLYbTHfrfy5>J`Rk8$#R6Dc$+{+=6n z|6cdG;gYU>-}>-TI8so z87y?%?dz{|Xc2M#TC@sepLfm@QZYU7d4-f3;bGs48Nz1FYJ#oF&cJ8LZNaT?6T<9` z7<#*%rZ1hDtWO7!+|$<|))GX&I*vNFJYTeJ^Qi9&>c19D6 z0kh#2jGrOaOT;Ff=l~9$$o8yr{+yW(uz~Wlg~noeonkiPjG%f5qaVh9?6^uPc^thwPMm@Gc)}3Gn|TW#p|waRtmQvQkoy| z>1XvYqxDYm;f93q+Qigr+Nc2hd2xrzLy;7wu^(NTV>!_@d+ec)yszVHit{?NbM+%R zH%$)BYmG?s^ctL0++8nSQbw)%2rVVz6xFDC(An?eg(&3Yk(9aOe@LzNaKUElm7DJP(ENw3@leUkYbggwW$UCW?DV8$tI*oO8$%eSG;QW;PL?S>qYyi+06XsW(AWFHAM7?Qx$bZ{_QvQ8QuSHdcJ@yQy^r@A zr^es$ZGK<-kCP6I$CJ;=ky)4hQ!20hFTv8X=e?NIPh@t_$&X9{it!)invp8dB&Y7t zc3@AaOe_@~_MHz!>>)?MICMl2cXrbi5qEj-2gtr_sR})1nyZ8<9!AVEL!vjajKU<`ZmX$Yn^Etk6%jgST~mKg2Q6koHndc9-| zbY7)pP1T4bil%elwx?KqLC#RykY&#OIlNj~XBY48eP zQ@y;*H6jWWG=T_fuvIA>7#~+hq7mmZ zl)=t&Gqu3n2I%~PI5iPk9@j#-HX5O-4ml601_^4ijN{*i99axyc(Xsk?fU z(3b^dJ^3pYs*G>|os#pB+$zzy#w5>crcmqzM7fw7pLK~tZsi1WtaTdr@*j&CdmhA+cG>q-^nTNT=OO6*JQidAJ%y!V2X;rc` zROb1S)WYKIIZjbPq1sr+C{>F-IJE==ACvaS7_3eLwK%c__P`MGandmtEkYX13fOi$ zm$dGS3lWy#iSPznA*2^?IHx?fR-ZZQ!gV;!w1qh+Y0aYuE+;)%tloLjvg`1@92SY# zx7W;?4wM*VFm8v%-v;L-(PQJQd8<|%esjc-rop8E3Ijg&qf`WGrwl$Z0k033O zppnbs#>d&dFD9Q})}eCeM`5`h;(bn|M#h11DRnhd|by0T;?Y5PfL_wB>6y zYy4Z|o-|M^Ty1ZhAh*{AE*(Ks(oAnwqg{@AF3N>2HEc3vGn#Py@uILAm`x=mg^M$F znIy_Es=qVG-?`9^w&f_JX!e;g-cmjn1|T68EHTNd`tW$PBE;DB21`dT_)1rossROz zo0Cel-yvpkQ{nXVpO#jPU)6g2gds2zsYtL* zl!uL57Jwd{beV4Psr%GI2)@quKK2Z&37yxz-O%SNzCOYS3t5wIGHBzqbx+m>x zBbKtod#cN@)x8adPO9Q+?1&JXQx0lA3StE?pFr7JX|Yr^RZ?B$TyEHy;2|2JqR#39 z+T?`S>rljG+dwMbU}=a|K#fq1P*9iMm1^V33Snh7mqgv9Ci(|;H42(d%RQpt%(5Do z4sr*B^=}IQ=I}LbzdRSuC^DY@3E>UDIrQZQT~)Kt{gO9nTvhE<@D2I zW4f#ax5FNDek@)Zas@b+)pHd3Lo{-*(5iGwDAA9}+%WYQlS*Z)+E=~M{LMMwo@Dvz z>x|+mnB#f}FSV&I)e;mgneXq(bkNsSRfAF4piM{h$SCfyv^Y)hTOrjpwvBIL8Rg8D zOo6Wz*;o|9**|GvO}Gw;g%8vVYiUCUeeRr6BE}d+8yE{t2=Lj&k<>rbqe>?el8wqg zflN+RAVbb<+*^Q-+e<8V=d&=G1=s&&}I73C1d1@jEa1*l?f$R zSl3R1if6k>;uV;NxJV5i3|cM-4cG(>I%rWT+d(~In14eiJid-3))SA#(<#Pbytq{m zC19nRPQ2S-aYmf%B+n$^(1YaUH-GcE-{arv@2%#U0Y6BuQld&oAz&Q>XMiyb_=BW! zahJf!qPx?~+DUydGdd*EdHG%Jq<`Lp#-HvAa4$j-)o1>cA`S0oOiG&%36Qmx)nTBC zDo(finP72Pu`&fuu@34x(OAd#S}RCLZCH#f2*&q^6H90$yzf=^thn+JR8Q89%+atP`By^4A6A7g zRHx|Mxe`x|kwiomMT7}@Bw5KqsS4rK7KWJhY~WF4Rd@r$K3vW;c|g>vC>2Jx?hUa@ zvgAoN_qtVInlDwYhDV9M@qeQ_D%`p5%(M1w=veoEIIeCg4;1RTthcs>(_9D;#x4xJ z5qT^SMdZgz@=x zFGzhr*<$Kd3Du_Puh#f4JwY3umAQR)C0N9Hgg~#*F%Xd;6wR?QwUl11r9z(AcHy?o zjy>)-u|al%MvY^f^yH=>ljsueCO(L-eWI`Zh_-)MyI)s_TuBxJ#Y|GJxUDVdb{2=& zbGV}`c2t(iDae%(*K&d)v=X?<)XPE_&=h*MlcIAup5@dnx_Tg;<5V7b62G3x2tqxWXwq-PVap(bim*fhz(n<#B+JJy&F?NUa*2~1hVZ2)%BOScAb}QLv|dy% znn=jjf%I%xX7*rT0s4ag*6>eZY;2>{E#MP{1cH^<^J6i?Pp|lO=9=h!Z3(SCY!FJpAAA<@3IVd| zvdVO353;vU6+WlKwDt4?(%pJPXJ99wKxcc+*bO(^Qjds2xP~YKdr!!fW_b~(8;koF zKu0k1$@Tz|3Xu{LZDWSx+VoeRcG-FD>IuH~j3tAJ+{6sKCYEJ6qi_!svo#`B;+)6Q zl$eg>0!qm!QYgTL(4Z}`Jj7aUklFT~l^=M~ND|nARmgQ-EPc;dKZa#Sc+hQgkc#zJZK_@I7vyrNFt(SD?yZHRBLGI z(1M1jVt$&c2P?sSI-)CPS;7}`8G-u$03q}(wCeFWXHcm41OW+#R^^Py_KvDVLVDi? z1vhATx3*u;i(0B9^!*yxOh;;Pcm^%DaC2iF6AzPv>s+nhNXF(OqQjmaUxK9>QkR(kD~c{f+o$YU&mDi>ZA z4Z#LIsSFl5k@?w)_m&SHxVC>q2fzO||5_1n- z@AvVXxhW}dk1`|p?aN`mH8wN^frf@=yVafu$Iu=Cguo0^d6!ROiooKJ_M=0tG}pUC zYTx~=K`HcmmaI0mPE_n?V9KDK$yt)OGL#LxK)<7lk2xyAnmzt`wtuRbd&JMH;44y^ zH_BEcv0>=34_#j(ye8q8t@2de8b2ML#!+%04#IT@(eQ}^G_6*pis?N zV)W1VKw0MZg+NQa7HbA1>h+e5366%YLJRQARLWGeHgml%9=L3xFBS2qXc61dkvO`> z7@bHbsSP$G|1dKp9sRmPELPL&I`%PLf&l5IL!Ar;L^#-PNf_ey&FkxNEsYkbDiR}i zd*0qZ^FoH)D=&zfkhli0bV}u@lRqOz@{4VCQ#=z#@&~Yd^hrf4Re;4^U_o%lh6(aXW7Zj{cUMMoK-%9K7nSB|r1{n|{~S4b!4 z$y>jDvYz@^|6(w(a!rlo{aeqw8&~|Dw5TZPciann1^j2i6a2R*$R9|iyThbp8jG7Y zr?ntPoR)*(kW_rFInu3uB}NN;h{99LHffBtn>0I1uRKoV9o3fLiS;}W(5f=3{m`2e z%-}%B>Hc`L#@9#xEvB?I8McN+TWyZha^+g_q5QMi9yGG8&% zT(p8msmQ1kY-~Gv+i=v{&Wm$cHNdJVz*V;#s;M~D5tCcK2$7YFF@RHJ)l^o7qvax% zkV+=c>9aPUm&!E1r&}uVbk)s5_1idCo_YSm@A7?o@WlGPg8Q2-%Uy!u%9ExI=^H`{ zP~g4og?6p2h^kW%10QCc9}{Pe89x6B$Y2da(AlsY6kQibwMZBuB)wOlyw^xx)2Hr= zA5s{_@hL+#pCO*gkxy9{I)E<`k7X4*KrGx6XnsT2_bm=hds7>W`w@{Ty)AF@tLX0* zLLYtdbf4&+xc-?%TN8kQk%NVXL<+j7<3vbzV<_a+DL})Dq+<(N0@!5XOy;agD|{~f z_TXqfZiT}CoGWDgb@*4EY|QJJ=+~|nnPN&?5;Nb|-jb%10u2KGmYOd=hR<}4-OF;g zbaUb4Zirfc4DiMwwGAbN41y5N!U!oRIsYV zMPQ{pO0$72RZDqmJ(u6JOR=z~5xtFf-elHH@+mulEeZ9TS*1~|jM6Y`4}~3s3$i9$dNwuRF^~Z(#0%#hXnc%nk@Em{{sJtpOGLg! z@r!4w@0c?b#@jXDltv4*2|jm~(qnidxORqY1)*!)ULq0*3yWHiy}uqCanL|m?qx_{tfJs(L@O=`E(16t9Eqg76r5O9byTVqnFm@VtRqT{2NQj~E$2M1@ z?G`ggADlvOcC8~Vi0X>>2!Pe1waY^@Qu$C|E~zcYiP?)*a-QLKp`Z#AKW~m%W@PW5+7&p25rfj4ZGO@ z#K*FAwaL&LCt}v<{-atyDBVtQJ08p+HQlvL1oC1K6A($Q3?o5k7V-0~uor|1pbtT6 z=+2e@MNk4{VUE0mz16a16X#)3R&_2tzyR5tVdi->#ciQi7z5qqNlZ6z3a}7l*@_DKY#|P9J&BoV%!@j>r(FSgYyG z-Pyx7<%MA(S%Bx7s6%OVpzTfLnRj!r5PsLKc#ZP=Tx|fYmVg#eB>K?YV!DQ-xWEHp)G)`Y151 zJuRax%7QJ~PFG(a5km-j2(IbXiGgRJ!Q!umMylDPo^PViY*V^nXD zLXCZ-Dwe`&-x>nOshU|{crTtL30Gu;ZGhQYIwAqJhAq}`Kje+R%LiH{+IQsSZN-0j z>rcgNCpX%=gRLweT%n=Xl=|1-_ZG$@7a&C}odfM;Q&<|w&Q#hI)U55T2cJeE!CX$( z$9zj?qau~=cFUZ&fOz`$weijuOuKL7WTBT=I>q$G@ub_Y1Whm*S#=_j@H7XBR0L2L#YPMW364@aRnN!V>q8#=kmU>&z&-=qj&Pn_dZJvOf$MM z{z~@7XpHBG$t~%`zlSM`=-F-1KCoFUzjsnN`|j(oOR%vE{-j z2mxC|p~1mimGNR49VRc&X?~XERX!u2YrT^rNgNHZx|g2xgA&mZ3#j=<6f&wdmUM7x zs47;M{TwXRN2+!)CY)$#hhi?&FMFe{B`aN6fW}1i*bk8M4AGblDAhkUPJo(Xj;243 z3;l876w{$p?42}_>Gm$DfApvX!CXVqW?~TkrVM!Bo4cD6d=^y5!~0kz`p7TFd2H@* z@F0_c^N`D-&vz@y>hefcM3TzqoRS@WF`|Sdns+M?G#$fDtEvX9@A{ENyv>83S-AA$ z@Xj^;{sy|HTJEA_UQHf5_&?XB)19r^OaAdMJt2ZU7%FSptnu~oPR?AGfxH@8M9}Ux z#BnCwO%+vXhxWNZjC3D3c6#2p-v7-4^^26rfc=SHY^;7q&R3RkF45iJ%=#=>4zuTh#MJtI9}xt0KxU)h*N7tm)U0c|x>IjZ8Pue=#Pa6mPC=BZOst*Lre&GzrQ?84+) z1M$camZ7aj7Xo(8=i?qE0wRt8C96=67(Ko;jAEEfbr;Pa2=Q7QDR_r9*<|B7ghqI= zQoKvfWe^u*D(hB z>i>R;a8L!~MLT3H{%d#p-iDa4kT;KT)5m;?74WpAPhT0c1fv($-j1Hx*Rn>Q`|K&> zK^B$DWu?XV*MAo)w^o607rLGeI^F8WPu~%Ri-wXO5tN|gcYSAqgNZ{64&BUx)pp<) zq-?!p72?+T%(pGC_v0Aoc@wl%eIS5chb*h%W;$u_Hv0yAdj1tCPWYV9{4@0+`yD3K z#Oi@DnArhnm28D?*!-tS%01(~c}(zQ?NCpO%%4ZHYwp(+9+w?{6YeyOLqp~^IweX; zy-eF?zu}41nnGgpgOhD^yp`z{9q`Y_buw|v`azP_K_Y5sw&0uO2wV7*d|wsu%eRvx zgxJC&GQKb0^v5g%9S~27i^pNR$6n`!u&VDt0DR9iKj;N1R2T{+1y2&GE=F(9M=$co z6j@&)-ll4*Zl2JcDoVq?h>%GbWCr`mMQ-8+Z|Xg^xts!glk@5dn&RJFiv~*MC3EW&K z<^elKxM&*1@4I(Jop?c``c4b{$(V`{OsFvSI9J`_rs9GS6gNs6P#Hi5T>DB^R-Jjs zQLkWR5~T{&Qjk-K(X8uwp%y)Ltf%cJ2(i|#;MCdtG>GkFPYB9Qccxv6hOfgcJuo8q zDf(@smgsgrT(IAQ^ZO*|FxlxxvA8ip32y8WJjuK{Lkntd3AmU23pZ=FZG|lrv}$-Q zJcYufphU|x3s0)edOAkDu`-p6N>9HnP1J#q#=5#kt-7yQ#Q3$;*570NHWBw|NtH<1}EAUdG?MJIFriHYkL6aTsr+ z{g?&uZD$=qhE#Oz`90r>Bqa(J3ZXhxwo!Wev_QI@04a>B5{>uh19-$*HQ^a<7I}h< zhqZ6*5>z}iN4jvrt_Y#2j(}1sukG`&!b3I?YXL;G|4#L|eY$btkuoIQ1JsNk z$f%<<2U^+#?P0t(2X=UvY0VMpF>cuV#WpgI#Bt!A*6~b9e+MJR&cMQwp=%4E+tN zH3uyeh8zBd5NEKm_uuYhd}xrIHQLN2eCM$^36yHqz*d7+gOV;}w&)NHl@?;ZYp7Yy zXb>#I(Ve&*%xE}A=eEdwmJb(#KFEh#iYHo9yFl!SnLWFBp2j8<`+4x+nGf;vFE_yA z&c@G1i~pIOEeNV>SDy3)vq9JWrBV8KqE;IBAcvQWfVs`HwVHYURl{$t5axD?ji(&_ zfT5rLsFd83;40qsVq*cxWs{AI^y+iX8~WXw%f`eZ`BaOd$WSRksN!wyYXrq`7GdD% z3m59BY|-)F?*itXv@BOTc+W{i3Z?szJ!*M{syWDDoAnw&(0L?UKr_|&_&9f4Vj_xt z&y&V~ymeM~cDKUtHd`YZYHwKZSab>1fUifbJ9l0H`c+5rMxlEC?3FN$JhuW3;t$s7 z^{~m@Awwx{rOw%ERK!_D*`RV?P3Gzuy(P#ql!BvQ z+`Vo_EFJ~of_C6&%9|5<>^xIC6Rq(W7(bCfbYGsEuVvS;m0{+F?zS*2ChO-R*hKP} zR_Hb6WKmR~aG%DgEM|++6gF=ZJd)8~@4(NP@48vt57wY|Kd@STQ|*@Z(W~)^xE}0s z1mA$+Rg=FaQx?5*`0KqeFfNQhemfXqL{2p}eJn>S@Ipx$$3p1&*uMbtc-gC2dBd30 zn5$Uyt?rDDRCIPwLf{E$GZu;&H^V7vhR=jIgmny$`YuAJHrUuWx*)p)AOA_QF2~X_ z_kRCknf(XyX{L+2Fg7cLJfJh zTO_Hy%2aJ_jnxkY+&dUY+1MO-UQEC4joK|PExINDbR4~EaWa8bo6I_f5mTc?@%$$? zAID8H>shB{mUEnrX=C4?(f%ybQhi}>r9hsCDDV#uqb-KzQrecJ(=V0Z4v_=r*hHZv z+|F_rG;p2JcOBlG>uYxz*|H0xTCceQ0j(3fa<*Rs26q^=9G`dO0am1zg|ZnM++Zgr z@|aF44}X{)N2+sbv9@#y7ka%W~Iz@<%y`*!yJcNB*uv z$jh(?9PuYrwLTDv$S67I%J z?8&fy>nWH^+CC}sTP~pWv>p#v`kZ%jLx(xLZXC7yOqg=FrX9-&Rhv7K0vAOormOam z6n5vzHAhbfR)#pmY}L1CNAe#9lrikBaz9E^#f)Ik1o6wVAh4%*(^s;XmdZK0?FHGq zoIN^m|E=`KgXY&`dno2LZU5nSf`gvcxdXFy#wz;a@}eD0^-IU!lCm*X5haV*N>*|o zWvzV$5z?WqvWY{4*lR3M6@nW{Cg3wAT$<^&p4J3e>vgEb)383Nax9LwYQ?NgtG{zg zC2vgYMl42wlvA5DJz1<%%TTG$IuR9&dj0A-BOMU8xEf$u*i~h(yhFlM^?tBf(VJ{} zgTJV<8of%q{$*8QAk3pFU^h)&_vf92;are{Lf&gT8WBIFIfJvLFWaIk`#5k2eVZ?q zD#Lz(32R1ynFt>78UGkiyQEr`{UK!Ul zQS2(vQ)y{mU}#3mQ{P&K2N;wjwP%DHleg6Y$X3yRv|}_-Cr zkxv+wyJV0&QG@t2rWaV4JziF%tYMd8mOE&DPvDTe%Z3{`GEG%$`{uJZY=_&k8u>~H zk39whj^fYNH@0ot zY|z-Yo5r^7G)ZGy-}8Qd?9A@YJ~NBE_nvcpDpaX@JAmzt{=N)%WTLHF|DPIa>P6RP z>ht661$Z!0_dZ^iov+M)XDFTGUCoqO9!7De2zoNEF4C4_XC+T5lVT~q%#r096sGA? zC}y&OW`k5iB*Tl(qfHd(Xq2T?OycbRHv7kdyjo8u@VN+t%1Bi`INLtZOR3!!27Jbq z3c6+Bc!VuxeDA&FZ?OKo8lfSJ50V2C!9Hoqb<<76x4JjAJYQ_r&rn{Z%@JNjp94Hr z2zt5Y2jsie)+O7GoFNneIPpXX*4EYqM}!DmGm10BPPoTl>4Oop|M)lJ%Wx?EQ6Ous zAvYC+ZrR#}S6Wu7GWy#`CRzRuy59woJ9&vcyPk)+H+=URcxOpUHT4I{ZFrxDXKbV( z7=Jtzx`NjvRYFM_w;`K7@w4(0HW8Dpj}~JM$iFU*w)x3$$^^5yo z8;)ji0EQ5W9%VH-{<~L<4Ac5S0U|it!%=)Nk-}?5!V)~S7;71ek;@-9zs0zJv5Q4Kuo!AHMxP_;_yY9iHZF@td02 zX-lZn{ETzR;Lu$O)5Al&lNuqU>qMH>3BmHr%|3Hn4YkqI>K|;<(=dBua=m*)g))We zJ>fPQ8ewa6|H)7nGxtiRZ?JOX$2=gp%%}CWw`@4Zf%HGLO4$q*`IEt{n2+j+{hpta9>22 z^N*O1m6#r_3R!GiJq;LfvkIqbjBG}0!b$hpx{bn!#F@ae#Pe0dr^%?$N|+XQwZChjc3K(pM9O3R6&u9_ zpJCa9$ZtR?H$S%;j7AYv?`gxZp8(!|(ECSkL9@hRhjuOf1=*hWI)yvP8AfD?SBwwu1>>eg6>-!$W?*8avqm*XRM21Tv{S{VW$&WU&MY+dfo$Br2G*g45CJ zvJU!CXASvD(bV6&HoIp$ECF24=DQk~)|csAT`94ULY@@OyawD^7-Fpyd0xtLoC0EZ zC?$=6N*gT_DOVBtN+RY_9d0;xR1}DxiiO4!r*HMeE{mUE>oob`@C9Jadw}nT%QN2( zC_@rl6U{|Kt~)-3+ReeG5YF3yk2>?WZhHj-c3Q_K>BC01I0-#6P-yTf zyol$r-oTQ;dlFq_r_2}!hAw*gfj3)cE9z6<|1vx z>{Qn92SC3uYgeI(jkLk5JfSzwYu!*mkU~fcRf|*?2i0ZjPTB~~Cd1%U2FLNff_i!> z;*x1`dRMI5n73LD3UFS^i^A@>T*9v{tcv@!;@d9V&^SX$ZMw-aSk5MV|69!$vbN;f z@n?1FJm(~s)Z{1wZWy^KJ*)r`+030tt@E@?pe?Ibo1+?8o^QI|LjdI1%s-aQXk&X> z%{4SGDRow-#kES#s!&{xA0Y}YxAX9nS)vea*qU6t~{fp;l1BeNN&0sf?8 z^GyE2m(^xoA&QOIir}|0J3!v<7FUn7mZZ0DLxjJg${{a1S&u<-)9XtfoPRT80Bg~S z113p12uMh`!Ps4av~^v{1qHnyWk$tNbve#Fv0I)pAyuvtD=$sc!?nzCdYhPtovTQy1MLj$-APrSPiFipE zP;Mq@1Fb^*`uN974Ug$WQR%h}@IC@qGf-*eaxMPvgPB09!ok*xfHH>x6C$HEG!IK2 zkUi&k$t@!lWLBEmytdlf1}#{BG8I2Z?+#l3A6~TaZn$%yc7Q8tAeeqHkly2U{{^ra zc1B3$JF{XZ0)^J>SQr$TRMyo+rfGIF>{*$)OY!7_!u!sx6;8S0f|p)WE#;&5Bkkuy zLs7DK{FIpdWC^fXLjWgCINQ%~qoBkS?#&CHj4q^#o5%&PYjbQ>S)T#x=#2z>0TgoPha#%k11`gP zMpQ;nB+jaNtpc7)Q+XLTG6y6`t|6Vm9(?Pt;o4JQrYT<=(3+Y7G)B6CW~?R(nR~>mFQc ztBYaHKOp1PW2q-GKSo3{E`!S>t4~UeWvYtSAh|t_GD_?4-O(rvyE}SKFKtQoZkBz6 zsmanjgM(^u{XT6#+CPMeQ^w{t50{x-}@oJwFXbhdF;zmb4!Jl;=kM1&~8ek1K= z(`C$SZH86P;lhA$5~>#i+f%uD!H~Ayog{37%X<8Ma`n(HPpoV^n^d!~p?#D)m*=vx z8Umyt2jtvLWNUxomLg>|D;jA&jt4r6@j<$MSy1x$xanj@xo0Ups%d zEepv&ps5~vSUAB@*^<0e`^R;V2-+kIntM2R;iigwCR?c_9@&f&RO(-PygPLUS%t;=fLC1 z7V#ElYGR6cJjej%(nuSS%(2ZbfHi771-H$Wp!42z4=rhwft|t9qjVS#4by=CBpPoGu}ecc7IoE}(`sJN<0S-U-8orUhqO7 zBQw<>^Nmb7PN>X_dLhzSz9utO;QLbeRQ!kj-zn+Z@sg}C{SNGD>gt}Jvof_s9QXN| zlgF6n`Bn$e>+pv<5>h(^b&^KSg6wXSPk{tTyoI8XGr%^MIzx;IXSBAEku`Gb9TATB zpR3O`LIP~S-*N*<+3#^;!>U3$fpT@_(8kems-$vjXP}-6mkJ=QQxo9AFsYgAH^U9q zV>W?D_hXiJe`-p!_*aDS#Qk+LO2eL36(fLJ;C z)UFxIU)X~XocT@!-x>fDd=QJWH^Znp05p0Z7hSq z<}M_%J-c=mTY;A=$Y7t!TO4RroRti8#7FlGSFQ4k7SgOGv8-s%Gb(b=BBK)rBg(V8 zOIMKHJzlRc>3jgZs@R}zVP|K@IRHQ;;ULd&`ca@%iZ8B;FoUKg3m0NMrpG5y_m)NS zYGWmrr7Lj!3^=)IMZG{rP-;{evr@lj7gLH<-7!&8{n>?-v60UR1;~66nB9U^%sKJf zu6>mw0;~8$Yzz7*su`X?u{}{jDqXM5@(GvCr;*bTO%`oG!$TZj3T0Ys zH%Fimf&b;K)wc-RQXZaogh!c9q#_UZxoKj*5bxjov+FBXut=1UsLxRG@iub=z2^Be z{tDbN-jf!YvwKF1Nw{rcY(n!7%s0g(tq-!xQ}P2aw(r9GCTuQp)<$7Szf=0oac|uv zCoGI)Qq;p9q!4I?y>1vO$Yjhju=d`DJ1x=D-!onP?VWV;(swJM!c45qN1xQDxzkoXOYAdfi zrJ&mb(~tE}`r#01s4j!;`pdLz{ugo(cZ)j1aqWzK*Y&_7?9PA)%^X*DU1Ml{SJjnteU;WCF{a!UEuCPPiW6 zU>(-4H|CK+sltWE-h@Oo)7!Sq`Nzdk@IhL;e?fniHx z<~R2H7gHJ3ixMnmmD+4U=T&wGiKkvNvJ>g-;j}zP+GWWkf8Xu*oZBIaigot30A_k6 zg|w5PTb*Muz=4MbHZB||;dl<0D3M>j=vFC>26jHp=F3!ROaaVU^jXub>@4Op;eL1~GZn>Q> z_Y5XR$1J#bRFlwIDZ6&oBR6=?p13!01h6cX%lT&Xx6)67>8!$}bzjCn*X?H8de?Y* zI+H@PU{5E4{`k$H|Ke~GOvE$*E~QQxyO9SUGAK!#;;r@rZ|N^rZ-U=&B{{-{@k|@F zrtqsa4w8-y!6uzFT8MGC#JL?HaZxo1`62j`&c*%AowLVbyw_Oq9Ao#xW{^e0)#pxwVJhC22Y?$ur~KT`uAJ}gP5b$vh)_|-&i!lm%^5S)&&@j zpU$!9@a4F#-a-X&VU`ox`{$!a`rWD&^s9_(DH)~wne7_#mqBcXw^|vXE`?P5C7y*z z_XF5F{-WnSLwM}?aaL*89i3Ly9RW^iMpIern|@DQzWacPZf-!g8wF~diX{b2QU}Je zM!K1YLYqjOS82DD>bilrBaj|-!0_do0om9fM_>o=X;ITTX`AfFyXocn^y)AQe|_-b-gU#6DHVt zMC_T#-4R4S+6^?kHKeNBvlFMcjB813dEL2wiC@~G(H6}_=?K|yy}8fC*6Ri4NFdk2 z(^sH&Dsv@C>o+RoFmAFmo%7KRhKwyleF+M{oEulIf`bHa!9J(!B=F?^PK=VTlU%=x z+wK8Ikl+t|*imq;OMCep+jRCT9Ec*8fw&=tu0a{b&zD|B!AVKNXBdl%HyFl@R~&6! zLiGdsNVfPtj-M%n(4jOGCR(HIKPj@0ml?-I-lPEH%g36(#-V0V_}K7YWt$uYm~*i9 zkdtG=6?3!LRAe0z$(H->b||pMO!fPx>|b!(e~7O&*d0U@t+tQvCr>Q3Sz4G{f3|m9 zKuU%KJ4?39G&kSN-<0=w~)IUWRrAO9r1ZpSFO0arETo)FCDutc;8chn|| z+n;QxFvW?AYtfp3?$|5aOFZy!(A9_goP#nQfL-!Vax)#(_HmuEmFjP^7ukDXFBeX( z1X3iD@m>dO4%B*Pp&rWPExc*B5{7ywjd;cJ3Sg3%=r1RIS=G7e3Frs-=nyAT(boQ! zrgtH-RTIb^qOXe=2l~%Py+3(uO ztSdq2Es)M3mg1h6-c}UqC|W|mtymI$Y{48BwUnZz64fe82XoMRc9y(>Uaz)-k}*5z ze0+hFf8R>YNiin~Fx+=~3|Ay+nQ*hIEB(2cC~~`;QaiGYn7UV3-LLAeI0Em#pV9=! z`nb*gHacwm4eN}TV|LG#fhS){_Pg2N%rOxV5)V?94YI<%kGH3KP8VvBoMBL&$(u~I zdu|kpQko>PEGnxKqi-sz52_&{=vE`&$x%s{q+Rz7b?;)3x9AcV?(9%9&R2i&=-6rb z1a2S|;}2Is=gm|cUhPq+E>0S>V%OSv;n%R|Z9YR%44@S)>3f2K{YExo=q6Hf$~yVW zQ)qV-F&`~~r&Q11DNmY{Z@yBt+&FiV3wCq}4@DGa`vV`2?&{s-Jd$d}>^A2hO ztbe?C`*UIJJd-_9KPKsfGW|kv3hZd}JftnneuNcw!llCyi*M#&>&pKrieQ)(E_~Ls z25OH^l9U<&1x$Bc?SLlUwkgXUB2q22mTji+gr;Urhgg0q8Jgw07p-hw8BS?`B5EOR*(+Yhi~UwLub8r$y)=C6!@NNGUt;MQS_)zv3_DP z9FGu8L|2;8B;#HK6DRL-1$?R*TxcQ!cCF#ZbK5_JR%O;sFAJk=hn3xtA`j)QH&~wA zIunN@Cws!~^p)xyUSgds!RZ;!$0j#L(42Ge46LR4VB*Q2nC_yuQq<+)X4Y|hxjy$c z!2E%Fg)JV{NUR7ZC*Lfd=&=G?Rqexx#44%j7<(10Nd9r86d$~+{E62zt~q~w^Ck;u zkw;Q09!*-lBp9}pjv*g^c@9-#vs&^{4Tx!f$g+TgW^Ex`r8G1`L?zgGdd4`mQg`NL zQ_PqzJP(LTXGHfTK#1f|A*HHQx*05Nvb!V86qBqIUTqA$-1 zvHp&T$!23?Zu(Boic=X(L=+Ww!u^hbH&BA5aiZ}jHH2j=^AbIITQA01&5uy_i1|2X zMmhK*jS6pHR=K;`VxG1>rOBMVD!2K=}ar{7v3R5Q=0* zWQjr7#y?;3lAM;rqn>nBe0AXusaZCh>z$z3Ue z=C2b6a8|8XB34_i8Gso#Vx{L#53!Xktsyy%pP3rwknqOe@a9}@E*t{hBHR3?Yz$nU z<1}XBa)i``X9{)Xp-VB(@fxC|)P2?LlmwBec<^25qz1H7P-d;TT-t9g65E=D!eS56 zBodtCAwC@MP#h*@0lm>!YZGB}w0@XIKe z6lRTH8oI!_MUYWXkBSPt6mUdHu+}OVII+yE_AZqrtz^+g9;1aE;CC=T%gyzIj0^$vQ3!-p zaZJk`wx@+6TZ-3Rfka5xM|lbHtf?BYE0mEW=w(}yRUgfybS}VzS#T>g_f0{Uwciff zAFS8RZ{{HQmXkU1o7=SUs*nAI{o^w7b>@_n&{4#1$Yb8?g?+}P3`t6yN4^Hb8&nEn z6&XHbo_r=0hK z=3nx~!l5^}&Ir1F!CLN+qYr?~m)Hg@u~f3zV1b@UB)WV@LB_|4d|AQ9eBsQQa1m96 zI$(9-L`fzkB4?HS%gsne?bO*g16I7uagcI_Y*~uBAr>OhusEX8gy-J;_nPWjf}NI& zW}F&~M#G_LdCPEuA8>NgC#aW}Kn?U!+vaO+iBsElqOWmF(d7Hu4rDhR=t~*eMlK@K zD&tzg;68%9@zxfb*O~X|OjN|_dg%)6p{p{j-Q>9<{g@b=hO~vfJbna!x;{#&`?Z#C zV+G|?y2?5~^q7OR_2=Y_Bbn!+U16k)c{N;=zETywiVf_z94@i5u7VANyD1!|RD~6S z82HarCd|QIw7)ns zHF>j~Iaeh~!AAah1|E;r;DL)%| z`+If5C+cVcB5TQ0xvFQpEWP*p3|w01^YtFAKz4AS=ZFzi>jO9aDjZwiZ*jXf)0}O1 zs!7o=t3_W4LScHRe_uYP;l77Vls^bM%pEMzu$zo}Ujzi`*qk;fw&f7pc>c{k57t(g z!2qOZLiT}ODHdG<)2V`CHk~sWiJMmI+AY~fe)JRj){v5MW>0psCGr1SRebSuVThAp zQZ+K>dy}!^_mtu*CCPp+=%AM;2D57(po-&Co3O;oo1<=DC>J`>2hsPlIVuqpFJqkZ z>DxQm`$uX7TK@9C91+MpN%BDI0c#3|G+c)n;2zb+GRIXY2cz@yTOQ>12( ziI4f|J-;|k&5WicFl)!!S;-MjYhGd~+4?(l&jD-=yXq%~Q3jUi9U_v-t2%hGe6=yb z=6-%lahsNrq%&b!yF~g{A7cgEor%SzxZ3#=ecfH&M$gdCairV%J=zdVu)_u)eVYPj zG8oc0Gy1a^c_mT4}7NYC_fSVeqz zJh6dgLiVaL*d#dZaN8`BOggggz~TZ&k~j*BN-p{2tdfH%EM`9VWPrlN{KVb6T!Our z32BXAiHF$1J+Y0)Jhv`&n2D@kYIGFOGUl4;E>bMWDoYF&hWc6*QUR*JBW1i=IX_sj zV~)tiD^V;Ez9H!~MzM#!rs9SD)#YQ*NN$ofT^CmzwbW|=&3^-ItC24D#W<8SY*}oN zEH2;Iv1DbkG?nu(g_&QbuYl616!aqdFa3bwFAvP)k*~3r+My8t!N@ne!<_#TIJ;!5Z z174zXs=ivD)MO2lGzkP~`RhrFV>T-IPoEl~rRZF>zKq$fa|bRbx8>Z=fSix%OPk_l zzx%t5#DVC|yAZb#w8w~1>dm?#opq5U@dsL~^!y}AK602z)mTu!8XY>m018%Psg&|H zeSQ_o0dnTM3~8Bx&hj^IUkk-7im#6vU9Xc_cqTWVzPBOvuVMV6I@7aU1E@|~Xb%#E zNkhTb1!0`W!p#nSlt8H!W|9PJB}%z|Q5^(A09=Mrje{e((HS~U)X6!8G5sl_WpQ2-^qFYPv-c!90 zG{~e4J9mUeqKG;RDt9T!2z&lLid@f<&<1B70CmQ+zLmaHQ=FnN7NvGJXS>B%xhp`E zE)~J!==a?YHPQ+F$K&+B;|xggx$KA#F}fV8QloKtIZVG({JK}{+J$7~5+>ynnALIF z?FB6@EscLW8~oclrL+P~DevXMo`3w@=(9`|&8DW*8=QLqlX&;to@9!4#WIxzr;5^&or72uzi6Inzg4Htyw&>D-s&;^vZ^1o@-37Kx`g3&+WggbBE$y5^^Vel_&i;B;4L3xuHL@>fXEW)Nma>ks)7WSKxE8>YtZueSC>RXY-&hHng*d&_akVefO_1z^cXUUjg5aqkZEX}SX6O<(CjYnJ&D z0K0&L>y#6lHp0AFgqAlGVaH`!jThG*-iD(SooHEvK8PdoqPOYuDF@m}|Nc$*mNvG- zf@#(>5pjD4m8$jpWH0*I_E!rssFWPLF#id$f-C$|1+F}r7;|nqab!qY4G1u54ps`{ zs6UFC0Zrx+kz!*~j#}f*#v&38+32`Rf(AT2^t@{~bNoP)<_x}j{AcsC-Klu9#mlg_ z5)qK{_3-)@G}MILuXWIYwqncg-mv zUdZVNNNmi~?Ia|&r%gOox}afDmnkMGoQvNH z#tjR#@+n3)KcfViWz-wq`7NL2TRp>mTj>QnKL$4abtBb93R9ZzlQiJjg{Z@*<>gGY zKQXW%OE8wK)ASf3QeArBYuF#WbCQx=F|8dP9p~OWvKjPPMR8s-6kMDQ&3h+z2R{KD z$u=cW63BRJ7>h$1jI#un>3?N6X3)R?$a=PPha7votuAR=9D}AGw=*7EyoVCvxBqI( zdyQcY3p+98K1-Fp^d=fG(S75-inTK|1qlIP`T*usH%D`vK&64Q!ZaBuGe8{6KGY>V zZ1+)Z-ECf(j3UYG#T<(aTH*zn^Xsf^MlxDOyH#IKX*P62fZG1uT0LTf zfJ35wnqACMqRoJ4Cb!t;?)mtM0RdKpnS-p!bK#VOm|=eVJK{PKD~&+>b#{vqYf2 z&VJm{Cq;5Zj6ph4VrO;5SPoifDP~ttgl5rznz^Uqf*d|OkmI1Zp}VqL!NrG%A$I)5 zHYu8!CPnNd?;%cmi_q7Y?Z$sUEBZdQ^F9@v@Wbb##rNEV&<9u2^*xDfOzviGi(fGF z2}jgMj#`QYrK#31Tt><@Tj!R*8+wpNxS+JDyS|wFxHt)_E=a;i+9jTLxgercS}pcC z3rB^Z5ky+D5HO7Wi|YxnyY{sfF@B^+;rhkr08ovB_t&Not^2j;mc+a zaMwlbjoY&t{F~`${7TOJu+!q5)JLv1-q;4fbh%~gz$8*RUm9Up-F3i? z>1T8K3GPF?jN)(+DwPB!I*&8liURUqs^!#E*tD$vWM(h!=*aPkjy}FvwMP~ESf$ZA zD=#|bn!b=kio71HB|&2GSMLoT1A)6$Q>Fc*4?(DWT2BGpoStDIy;tjtr8$YR;Z^ss zEfu9IqiZY3##>R_R{)Wk%r8?|0{1O48RnRY!MmxTMBdnyBuUFsz+-6S8L%cCK_7c+ zxA{8IbD3wSLLh^6;68DAe;JrD0ZzkQkKxOZHzqz)wc$cJ9G}Sm&Y#V*YE}?g$v+Ax z7hEL=knI`39EV?(yLpm` zFZMk)f&Y=Q>*Md)bA}t`Z`O3y>rG7p^&{v&Hb^f`!)EP388wk&l5oBB)$8j`fyOXI z)>6_LAe$6eS-=!I`G;{KbDx??bg<9ga0Xe(D4AMXA&l>a(4VO3xZltf zKT8oF5z$Z`){$3g#lpk$$`=3c*+l0qX^ap55*xR`WS*d37>4;PH;jm>B#NHi)~XeQ z5ZWWzT@b6qx}xmIo?+r@fh0+NNt9jZYIum12^mDk zImpY48qNSXYl0}B$;igz3Cw;ZH;E&?oW!jalb+%=*}?S5vy9V5?$-n%|Fu!7h90XY zISA*)Z$lNki6pJLW>yHd9B6tvM% z&Yg|C0+^~5G%WGGEf^%!WyWt_BeQCLsrn_9qq+pfKTm>X*bc4bHYwcrr6GLWe|I_W z_JEXs6zY+Q4(58%AoHxF~3{%6wHD zJia3?0i;VwI>l6)FicHW78*7zr6c0}$6)mppQ_DFnT-p(Bk;FvpjkCO-a3y3VR1EO zjvJQrp(tFX;`|8ZP@hhU;t9!-)B$iw#mg&pZgNiGK>$VY7jkTaMKSoS>!ZLhX^JAq zb(Mkjem$?pVRo5DADyvlEX-%q{VAt%P@vvb7r(J?!MK%Gd2tA?-9<^*29XHhNj!VNC5M0MC)x#3nP;YPg*?tr& zJ%jp2;EiFGSV+9^i(1}xV3;|_0`kF{*|Tya{p?|me`2}0L$w}$b$%GFS?<+hpxN*f za0DK~1VMNaw9q_ySq1yFd4>h7;+(&p2mbrP!TLhb6I}A09QTBAk;>}UVS7n+y-_QX zDuamS;oPCq@&_&LJg2R*?6?MbjK=eXY~sw|8f)`Wi$i2mDUKm*7BgDy05_ZD4E}l zW5n@QVfn?saufEcXR~Y+43KqHk~Tb@yZYldV?ahDX(%l?8aD^BFz9x+d@xkd|S zK9)^F5jmu1SP7?Yx%7_m=>_j709asc6z8obI47!uaqCX7QJ?U3WeO<^KG6u`HAHLB zm-qFOckosNZB;b4%lNs^=($v7;07k~h!7;OYLyXZqVg(trO9?D7@ruQh(%~@pLLZa z_tP!8R-w+7JC^_^h^^`QhEG;}V91&01|p*QfPKTa4D-p@Wm$-k0)!17Y zG=a&;GQ5|9<~sHBUN_+kAJA=3)_s$Nnc7aGQzeHkq{&YbNp9m+;<3`Ep48@+5suPH zjdm=Ni$MWdxn>UblL}B=5Br6Pne_aYN#juPlkML)5{WrCt5wO3Xjtk6{GX`}Uay1G z0MM+ykdBbP5YEevH1ByL^t@q1U&Je(C+E+X#)SDj_e9S#Re=L1kqij6VCqw4#F2X{ z9{u}H@Oz8!e^dA9?d>ulOVoNBv6-q z587S$p!g>0GBIicc&lZVF_{M)HuL;=aRRaQwnN`I=}&~J>QoqTPhkCc{stn73lwTv z3k^_ga_pr)5zWR}=yi)QJ0NSNH z&TRkJ6FE7#Ys!FIN=omH87{e)@jMzNcfm>0^&g#;R7{8GS)$IX1Dcd4=*2_Og7;re zpD)LR&Ue_|*J1C|SMSq%JH2!;#Lq{ZJssu8atEy&_M$LOQkqT3{?{Q9_)jXLI2z@g z!}Bu%9Or!BC}pd$9(_0`OP%`8IU-TcFMMG^DAfZ7YbW77eN-oY|Jd$BAIP$aP#K6K zyzFsN@Da$9*IG#L{Kencf?Z&JLKbWFks!-W#jHVCvOH-G99bB_(g9tE{q!MzR^Iov z&;&JBY!cscd_!->6)NG1_x3YfV4szXqf!>_Jq0S=eyJAnj%HR&owdHpDv^}fzexAC zxo<)AcCI@(4tFZ!@%AYZN4X|=KfFjKhPy7G+`i&W)>2p;GM9wecmWL$ca_lG3B_`a zc!>;~Q#Oj&iD^IJ=u=-VJWYegN*{`mj8vAP@*H0XpKKoN34_02B zSHK;Oj`ai0C*HvzP-q6@J+(gc6epbs*kG(8yhR;k(s{zcEbCQ{>~h<68(sJW~;PE7J9zm0|x) zV83yDoN+Y$HKY6$9x>Xqqj4R?=8W?sv(g^F_9@3zcw zKs1Q7!V*Aunx3IBUcAwOz>Q76_o*NLdiuyvQ7afZA;EbiTb|Wa_3x=9VT!lG5+SWU z$kcY$04UwRMj3b81b#Y##9vVqYWD5~IrMqC?-x=iO&*O#-qKTzBM+t6i zPKZ8z!m9YOnesK|$uyR@G9mca1LXQ8=jxz&L8NhePTn?!>w;mrG@81mT*9rBE(WO# zJ)7ZFIc{~bq(g*O3qx;4Xdj-Puo6>Pn#~tCMG7Eo(FN&KYBg^zMPjR49W$55yZubcEo_J zfit^qtF7_bvb^ouD-Lg~!_m&y!ySn4)$rHe3!^8hFv@LR-WOg1-!rSgSBIi1)!&!d zh)=YEKwXCqR0r>~4X-Umy&3wp&3?tJH(0`#>j;=4j;bh0WnU0iH@Bo2#u~PJJqC|= z{h4@XyoG@qZ_) zT4{Wiar5fGZwR(uaRkC@m1w3`YOpmPbQ8g)v>wmI$HVdmK-ZI^8{(D=d)dS{cKgI& z3AP)fZb}ivOCy-?#{we(MihCw-X#Of!uJUTFp@_ zVmUO7_Esa83+B!tCWZ)S8_nRZG=fYk)(@-R7bfAC=(+>(Jn3DDGEUKl<~hC;)yX%Z zV;4thX%#}S3N9#rCN7b%F`rWv=dVkA6h55mU|oPNbhqW_%Y93ZkIE6Ly+jgcH>d+smfZ7(jmjO z(<^i%1Pv={OSa))(d?I#Qz5_+>$WAVx~=+&NG=N}-L@jXJYFhprB(7b-BJwkzvB=u z5pagG17(Suo>pM!{71sj{cOy`%L`CiG4W8bic@3QcpMw*@gurF{a;^wzTx4RS~?~I zuRVR>>3Pllad61^`=^8N#e|;ULk!nR@q?c0T-f`?&O7_pRo*8k_3rPTH^SV2Av51y zzpq~l3cPWM-#HvV+*WSJ6n%X!;qgnKpW6c7IG5{wC`w8~J9sbrDpy0I_&!r+c(K!y zr`dg*=9xPpO_?+JU%D{xs+kc%fhYEn;bG4Un;)_iDSOQe3I`iIpO1wCzw$oLE%ZG1 z!c1AdG4#AU=X&l(WsV$qu-pH>;P~%zHLlSCqet4>_TU^|kJ~Ut-ymeaf1-TAu)(T; z3gW-qdo1>N6G&nRueNk0_zcM?R6xo2jZDV3wBwO}23qY`M01X0bn1E&sRz5mWC&@# zx!r#E9}`x#>b!WtK`|!wJH8DCF1IBdkc4xsxX3b;ha8l6Q56OB0??J_QCy@r!;Gkk z5$2GO(4`zXbq~_4OjswT=*kPS>I>6KW(jFpzPgCmoPh*z8sU~95fxf_9Gc`}zbBy8 zCh#6os6AJ((%68j%kVlM=5J&9_VZse&zjacSTC=lA89z8kT=!cDoh8qNWw}23fRo( z?8W0A4nb6OMHuFIA6Z(x+^XIjXGxSzyBr72YU!Yh9F#LSMz-rAkDA-7^Va<_&oy2Y zA;ARLU@0SOs2Pu>^uTx`mmd)VL)H>xhs%xx2(E;V*q_3$9?P?ENFqKwb_I+fGP~%i zSgQkQ)Pt5==HvGCcQm77Sdyp(1>f97lpBmuI)Ai!E02&d8K?<4m^%+<0=Z;X{%zAM zanjY4Kl{5IXu+I$zW8~+_e~HUda|AbU*rWkU#>j2wFgW$hdi=N_d1f_t7CI?7JEe& zE=-xX{1X}C%EOP{lN$1J3PMKU{!i!7@Tksp8iU(EI2(ObGm;AFdndBtU2ZI`4+ri6 z8o9#iR?Yh6hI9Bt3)bdkHZZqI2mgGS;0z+Q=b&5{c#(CUKY0H2M4?bgxmu+yK=Ju5 zIy^k=_4VfOVXj)jrc#`hP&-Wm0uKJc_xLP9;CDXf?&Hucq3YNzbkpE=rqTT}6X$nQ=6w+mlDaHa3)(epmhGuiF;)_&2t@w~p$J^cSCAReZMBLwb=x39xFudfG? z@1ixkf`QtzMotdTtMWDPeJtqaq4d?TJQPVccHjsfxsabK*!0Eem^?02L(eJF_ zC1D)s#Uk9&=6|l=^JrIFwO=v|77+}G($7y`;(9M!~PX# z66v((qcdCz1RQbfwC#GR4Obbl6{^6(3F*Gw}ZceaaV_J75(pw-`K`lz7 zwl=cyxVD^lOB3_m?%tw@YRXF{yfRWA+Fl+0ZvQqZEtyI3m`GX#qj_u<_9@}}m z%gJlgq&d!;gXE4+bvt_9aSk`V+vxIy_mI&dGXPyy2X2H`s3ui+vG4t1ct})>3T($) z`{U71%>B)>%R=rTf{zstY2a=b( zTcHcS?;*dOCtxw$X1EkDKFw07oG1*HbKo)Z z7qyNQ2d2Tq@mtSiZakdB*P6DPHF+(*H|Td+-FB}X{P+D%%}LjgWu*86E!4xTiRlJV zh10c|_%j%z5`2_2Vt)K}!}ffUNXnaisI+0Gjea;smU)_eE%z93T~Z{VrsK1@^!OQF zt3GaRyYP{b(df0a`&GEIjof<_zcR`9SfkIW998-EUy(I`w9sw5>W`hjLRsYpQazQD z>^#{D?||gZbW{hrBC3?lf&$d*cSvlSSv9j9Ih{!*T@~C1MC_EDZRya*mciAe*nA5l zx294pwe!V2oMe#DOL60oXc=`|7>eZyaSDqC_Hq(C>*78Sq6sDPRh1Ef!Ke#`K!n)M zt9ss{1IHKt+Xy_u!(^eVG%3G(awL~>#_;A{A~7OMd>EmOM3pK=!rWjdn#Ofe2Gwo- z#!}IZnzgWkH^&@s32?6`7bVZ@sda#xb*q-b+h&1@@1evJ{tihxDs8sQ+4V zA4mH1y;CND`3+ZN1xX1(i=Rk32rc;BmpL|hZ}%vsXfp*o5)Ka!zvfH$uZ`w=Ts5I| z9F&E@HMkBwc3DxhKj`+k`uq8IdGz0HCE$XeH6`^V7P(0NCMeu?`M_uA755h>|1gkl z3+mi~clGs0aCd*AHs7GGEQQ4gPvx$`|KpV#H=(buuN5CLkTTa3Y=Ny~HyGahlJ{Xz zbz}a0niueq3b1I>zI}NQezS{Mo5`E5vwC{3t!3E$Z;{WZcc*Ihye|F6CpP^0{E&R- zQRI}fLW6@g4v2RgWs&3i9fFdiaDUt>66(XMEByyfJ+?{Z0{u zr8nn+n!DH7!`xq_3SD7aTf$}LmW6uzZ&{!jh<61fi&9`>OyMvRD07~#Uxql})KSBw zHT~K9rL5HBjoRdFTb5G?;NbWHpRQro%ZQd8L{5m6O;h)$(2k!V&bS zmUi%J-k4|oaYyhW3sfsPOuxy1WLrsyg*gfykBvF8<$$;>vMObl(MQ!kB7LR~yC?Hh zS1NW<*t{J-bZW#Zb{}zg_(CTNS>cWPv91(xl5cg3mUOeAdIX>l${`D*;e?^>-z8K)b_JO;ZK^a&VjJ!R-_xZ~xs z*l*$scxF6#Bs`o<8R>XF_fxdmgsVpst~LhLu=WeZ8Q;OmGVB3RF5BLlXW67>PPJyY zf)t=wEHs2Gw56yh@yrcq_cfsaOHX|FylLhr0@%_fcfy^n3*UhvwC(+4=ZpWpGVuRH zp_lZ4F;Df(&1jPFZd;xE8D(~|o&-reO z)8(Wjo#5t-U;p}lRGni~XMeQDvyFc?Cfl}c8?SNG`-Ev){Gu~fFmNyN~Xo4?r@+| zv8mP_+J_~>N##Og`t%jz%i~#Z+xynWOZbc8-<0F#uPgWI3pq`1L{Z1}Y;e9FzsS+n zr`y|!79;FZ3;2c6QU#R`xWFt?&R%%^dw)~a$u^m@RWNrJlf)y@d{{GzLdE&*9XEp5u>P#T;YzAg=ZMDg zSSAKUXR*>KP`Ahc&8tAdiDKG~2v?tZ@zOR0QFuMt-ZqA1xc?9V;eG0HdbZ(qdY;8t zyPp;B-;-&Sz0Klxej%^f2N3-Kq;|#6KZ?&`hR={d*9pJpd6-e9Zsi3CMXsA8WTAa7 zf1KLe0o6zR^-G&`26ZZCAn8V8xcUpvE_tG^=XLo0-u2Fdb91)kIWwE43|(yPY`oe3 z!#fCh&H49adt&Ko*goYKqi*WfYqKI^j?p`hU@+eh-gjq=t@W=cmw zrm-K*#*Z4v^%WcgZGx~OM$=blC#e!GN>799A28htKjqi11U$;$m~m183j)`ogRbiY zZjW1+uAg_Dr>=0Pr7Gg1RG7aoli-|6CEYvT_6R%PnB&OjR_87BS5Ugw7H^v{(obA@ zPcsdc?7?SHN97V3Li<>oR_6tHGKff&8>OG-U^VMxPt(cvD`L}(zp9l646$GN&=2WS z4%@}QseqvAD(*u|>vrdwO9fLIov#wUpPUSzG(>0JRtRy6C5_}On#agmUB)Gy@rRd0z3yg1D_}R^bRg%4{(LAQI-IjRKMwCFoN7Zy zln}{$zSrW|%E||Txlg5EYr=zniB0R2>hh6R!{q~N1@)P<_XqAV`I_qILA4?BeQ%|K z%;|_9A7F2_Kdx^8z1-BG8uv!7LMZQvWSlt0Zs3!nVev+!bVF7+#Q*Wh_V;~kxx32YAGz3Qy#wme?0+d40TJ>&{~P zv8A;r)dVmJx83QT+L;rwjtUd!kN+J_ z8d`GN*qWHRK7^)?`%_p#veK!KZdD|?K~?zG7dw1P<7zlp{|&0j#)CE82eenMEiQnj zpR;9Wx}f08rh2BdH)i_>k9XJ+q9xaN zOj2|ril*;bb`F@27<VKNW?Z^3(G=jEyM;bjeTA#z z$hWW(^s)jT=&V$(Q-=!4O%AIw7BV3sO|Yj}SO!m{J`yVZyH+1E_&4b>q^-t|WJx>I z&M5UV422Cng$q5;-1|&E5$JWk$j{MN>C>`JUUy8ahw`h3%CPl&>QP-Q&l}A4!YNUs?8Y2e$J*8hUv5OKY@tMq2a{FaXh3tr!wEJ8FdpqY* z{vVcLfUywS5JiUGK=0>yZ=>-b6rlURO!U6X{_7AC`ut@^!k5xyK8_%Ie0pkfIi7}m zdRYnhSot?tXx;u*o?{OfgiN+ObiAq5Xuu90q?B$D!pjRF#Q$9+pOtaEn-Vm;cvU^- zb6&TqaN6;Ex+%6X7zZ>SZ~%yc+J2S2DpaYgw_c*D?Yfou+(rJ1bS|3?!_uGpcY6A~ z>;23D)@(!%lOE^$Fc`kAuVCwS=Q|(H*0KnrBm%5U67=qyfJ|l9+dda1!eCbK*A3BE z(#~tm&OXq*BJuO{dw(hT;!Y5F{XYIu&|Dx(_Tk#_P~bmQ>BtP=b}J| z-j4`irkvaPEH|Z-uTM%6ZigBDlcJ(vU*FzdmJC1Cx8ILART(n8fP!b>-x}~3!*>&z zGPHj$py!0{_WW%}Q%%G%8GfG3<@R zwr*QW0L?HTlbc`(S+q?w;~{JF%(Y08!8Pm3iA37ADx7x$J(RzOZ4IijtSa>PWAL3*?pT6(yhFx$Z7OzUdfq zStT_X4SOfxE*YR+8(nL3A;3cT^~K*#9-2Z%=h|{9as9j+!Z!`ba|=^|4Jw;M86+}a z3t^zDPsQ`qht=a~9oyZ9dz6iGN*|7F?8Rn)VA%zJzi{Zl957rK6UO)U2b*0d_MK=xD#FQ5Zf$Q8{68(0ywAi z_LHCc)%Miu!@2HeQatqj?6)Y?onhWy6zuW&pj2A~AzE7vq$#(xD@( zAQB5?({&}#v7uRlddbajH!RQC|8vtomKVqG^H^`c#be)bN?F_UdUo*XJ&FtbS{mHT z`@p94&eK|hDKzlu+?1o*D9{L+5vrh#8YrB^3Ki#ZtCkL4g4+6$XV`!Acx372esE&c zvR+{;DOHZ<3O;yguwNd|?dzhZ48C9Sb2|HgZ`VJn>-9b!cD>~zE5+b-eN{g>s(+b- z3^g1H+IOTzIj7q&ta}e>6zh}?OZwOQuG-4hu%$_eBnLM4MSt$1e@%z2vF&|6_8=?U z&({e&3}HR@_iWrCU}jyF_vP^K5EQB!E+wKOjjEfOFFzb76UUpwujw7z4|F{%W@i;K4ctw> z=ciDKAVvFEe9o&c<~rK{UaYS$IOD(2h&G-x_^x8}y51WJB}#23 z#DYQLaPbI0-C82Xk#o4|GIRLPsveL;p?CX&z+K=Hlai9s zYk%8v#j{3`vLa42>L_GNCliMX$#6I6_-__sqJ{0x@@T4J!{qT~eXq&JLXZy@A#RXI zcL{2+PI~QYUCOiGYIz1xngWF-$+rD_)H1rq+WxStTd7f%3t-KE0hM3}I2T!dygqbY zhcWVf?({qLv0Yfda#=%DtLo@?nqGf5(*Cd9oMkQ(1fibpho+F|h?A3Tj@EEn60*dC ztgVKFKtbnnO}F>ebWa3%Xg#_%+M~F5qO!8yEKX9A@(bL4Y;Ba0{i7@ipVtrkh|o;fI?hsaJbwVWkHzN8AC4lW zRsIOTx%9Dw}Ky?+K;(+mifsrID@yBcb5;A^gW|f zW;lPWxSRjzT%L3`dg|)w@?7VCoZfC@4Kgvst{2Z#v`Q@fDZu}WJvOt{n%Id!cgD>>xr!WRb zE3{v*qR5&2rUX7!i)RyojdV$iDQ1X>WCmC?1`qxgt?;>YZc)mM!{<*ncQ2nE>D>fO z@+llOaZ4M6ciNoyq6{E&2#AABNUuBhM!jFUL7Y2uXDCH_3{9@5DmuElIGpzQ^z`%} zD&4i`jYj=o+c)tZ_(RH<1aL4kjcuKxSh(dDq5LB>#7b!TCt9z&{SnpQ?^n7;soZHR zctMJo{a#&@$IPZi?OL~5-b@$!?)ZA{%NYOtn4#-h1Q!o4OEBQGo{=xZ(Ep{-wB!AD z;>lXhK|*e7=z%tjN+ztT-yaJ%xHPR#93Jt(J?YQVef{xwP0@ktOk8pLn2LyDj-b3U z1p}!Zqziv!cuvOscV)|DW>s6d%iL9Xl1vtF^h(d9%i^hh^S2dN@z-b-?eH3g5V>NG zI@hcPM)(674cP|S!RR^cB;Tf6nBp-b7+-c%7bS`OW*Ozg*Y^9Y%P9ae zaZ#?s1~`e{z1*17xPVPt0%}#G*w*Wu+yDl3v%qN zhF7b}p29#ekcAb77Q6%f=hy|BuN1}DQ}w8dKAji+WMeErdw8!sqTs|gbmOSC*P-dR zMXQ>t-Of>c$(9E+f$n>Mj?@w7=TJ8@RUge{9E%k=vq=bTQPI}uK;K;IdfU3PxIdY*U26;jG#0!+cU}UI4GF*| zw{hCKKO=Y!X7i=ea@lNAcn)1jo_q#PP+v-tD6dYx3wf?^(B!{kXG<6Qvaun^@6?o* zGeB|I7OK=T<>n+-|1_M+;dGcSuPL~AEvImfZX9nD5NmR2*b^f+6d6<>ff!)83sp~$K;>P zA3px6$n{%GTqCyIf{*&|o-Yn$ga@TLUbZlJfdf!Il-bt;dp1i>YxZub-7- zZs5|y{Vmo7y>a|8R`&)%=+T;oQR;_P=6Q9R=8ArYDJrHo`dt`hEukzu^Wv}s+_8N| ziZ^8m3~aW8{fNO`ybLVyFpoQgf;EKJKVw086 zf1=1-_9NNdqrQ=+TZAWfk>&=Tz{rX2dZ*kbzLIg8j#O>;nF6<^z1p2QCprk8vn)9ewmRUr zot$_2<72|t+m%&PZokf0pe|~3aW<;d|G2?zz3~;11pC&r%w7Nl2m*iF3l+HVR2|kBB9KVpVeZ1VJf**SrX<>!j`$9ui&JwS&H#>gJ4zvtA#KW z{JuLU$IObAT-oXNTvWy5Jf{8(*f|c7gN3UJgpK#|!Ti)9t>#Vb82U;5NRo@;aq7t1 z%go`|*t|MD+fp~ju2MFo(n*^Hczh=+HG-P2ZEt>Jb&8qas0N4Y-$M2+xwSNmiCu5F zI#P(Db0h6p)lD#G@KZ4|5u(>e`ggwa4dH=lmai<>KqI{kjr>cvVUX>NslphBjAgN}&%>B`nhF;Q0IRpv2~p$>Y~@jDwG->DHL?yNief4^K@ zJGabCwf8N$9)n1?mAohZV=vl+G%$n0aT1D@sSh8!Xx*6(N5pf~&v-araRJOZnC;eo zow<`h{I5?3r+uj!O#_fvEG9FZP$at;VFvcG8Z1-b+4(#Yg`0?EP|r#b4yd}>k(E0> z6D3z%lQoi^iHJ}p$up_teDPVstJF@GyJWLuXlji&z!gPE24J;`jaB(vtBB4S%+h>V zWY*a{C#}VIj9V>jO-e&P(AZ-qMcBDP6Jcjj>Sk zvYI^(-eH&u7vVc6=1u=3Hq+R^9-*!&MP2y;FhVw69*dTRb|kx5bJCr%L>nX!?py2T*mCd4A4w63I+ zw%D&II57fJn6HkA?&wK0u6+dWTG7|3_|x)I7an*0k>HX8GKHz@+?5!(L)j$DVgs=U zvam}_GkI>KVEsltmfq%R3=VO|`h2dzUnkFB##vrGLBT64AJO)$ISaZ9rBhbr6X!?B zHiXqZ{v*$BTrILb8H2L4kMydC?a{u%NIX{4>6%O(Z76}xMoq?M*ccDbkp4aUtsrt^ za(&Atu~xlE3)fj}G^wYUGgvKf z5gd^u!$P(;gs@O1>0lPY513u$^xDIQR4IOge;%;V-zRuRlXF4FDh^CGgev>NX-BsO zRTb2s2iD1%s0{iWO$(=^ix3Fq@p}kLS{|A#s^%11WK`38Rc_;(Dq0~` zI_5l)=RQsvAu0})!IXhmU_aFZn1Ma{u>*!)qXl|^;Tx~3{P7?<1H|qn`%_9?TZwM@ zex$VVe}5QbB$2)CuaI!4qHFQ_o;8xKHvH8;j#bx(J>9vqyMavZ+U6xOq}#Ul!{#~B z4LKfvIF(tqev%0Vy%8Zhgyk{7OJnw zkQ(<)9Md@zHPxdIP8LFnhpq%AUQYX?9fs_HUm}IJ<`w5u6oUD3PB+zsj>nGTw?s>F zd?E%Wln&n3JVdP#vk`8!p=f%`#c<;jh4i|1#rPC(g~!`NmxL$nE42kBV0p5wJE3)i zHR1|+FulRCKJy!u_sg-e@F$0Ril%;WK>+D;-aXsiLoqL&l+;}jBTx)MY|PQkJ|oB7 zK`}CQ&(v}j^@xtm?%LC+bq!fP$%w!ng!Iv9Co&|y2q#u5;fL~eNj+O!CJdD4B=nqkb6;n+;ld&P zsw4FTr^Q9L)$-BDX$V=(rAL!hf?CEKaHzB*g0(x&vtV@)TPMjxA~#YH8y}9_(Pm`u z>#;E+kyj3Y?}S>__Jh=33umdE1ls+8vVoA8r?JBpV` zsxYVS+3lpR1XhHeiG!vQZA*vufQ?@aLoyKVDxL}%wR$DS+7@YC0vl8thM44C2Fry& zBlbhuP~6IoK&hH*XJ+*th!RSQnbn+0~> zps0+|wa6ZQ`t*^;xxzzK&_?BqtdJ^06-+fMDr>(=m@5ue9X7AzSBOtx#@Sg6Q67si z^u;NQlB7=;bxIRXnVqB9(v6i|pUM#?ByeGs%)uzu>_eyb>e9a?sHqn070au`5Z|t> z-Z1kW>P_@7h&8Ci6_wS&Y0N26vx79&qp9pbwEJf1=H0{HURJz-3H86<4WrMz2m%#W zhSeB4TFEd-ut~A$pDCh+VGnuuy4hUa1npm~3AZpT1Qn)QlI6*^V3ul!?7g{Po8GpOX^LJI@IjI#BLU=kP=4ZO{cB|Ift8z%6;{)Gv*9*j$rRsjl}B#SQr0Kg z+~!fvnMDb%Y(P$qz7)gNs|alyemDgt`y1HxV#_dJt0^pqz5!=|&J)u^79nNq=J;e3 z-p`7bLESVsMQ3Ajoy+oS=GU&3h>ND^+b=nKpbLE4Fpv^V67Wr*`p>;2H7 zy;FL0^7G72A>Gu2^GQ0mN+&XNxiBG!)Z=^&r;sSY-|*^0ikZi?$3lnD(ra6OXU1w9JcJtC>SUl=1Z{HUrnIm*$*U5+bLT8hrq1`d^xA$3LZ08`h}I&V`ZHL5H>UW(I+0FaMR;DjvorN~ z?HjZA{dbl%o^r*4X#f^$-WhoXfQS6LfRFRH3s2OK2G^L-w8B3buMQ|+yxYO%T%P`l zS_&p3RoW=}$g&z{N}b4JD?coRHOi;|Bpu^t~2 z5um#D&C>k&`Z)%BZgI>4y?~46YyOTd-PkY8v9w&^^?K|iP@)- z(Mh5s#Nl>zkO~IP)X~G>UvZ~cu69qf!C9)br!E9|GDK{cLuZ{0*rf_Adw71`+ea;q z;RLANt|MNp=7x9?E0k6b0=|Mg&@>b(GSqaXB9hIT?*_arwIPv3_t;x$Mq7QNCpTMA zL?A)QnOuAyw^YQF{(No5puhuZ*TBQj*h)ILh9X$Io>EqHGZ&uZI`>-?Z#&BBS&pz7 z(jGV-1ybT{H1B=hk2D1#cY6e<4nk9oR2VYaFR%nnPi1HBCJH`M z<#?tvYd>&7kOkjiumVm70Wutt@AfwtozAaFz_}W9Wh+K{n0Rq%soTm=cbks9#%xN* zWXe&BVswv&eli@VQs%=aut=DOVb)qMoQ)nqBv=N7G%Sh${TDm1-NB-wCmv~Y;bNiT ztaI|W!v1qO8LV1g9OI^pW*N!HNu>?beITOl0-b)=@RQmU=3SqrD;7AMco?UYml9^( zq|;#m=(XpI=t-8N_;Y?Ua(!i6bH~QFZvl~J^j{&-bj^#Z;P|yqnDQr!yz&q%#6{-y z^5EZE0(MLTP!htriEC+3si~`FnqC|y`fUfxnYV?Oov1v048kec;mf|E%pX6GkTuYN z_7z_+s!`;vP%1#}Rv&dTIeNLd*@-uA+v?Ay@rGCx1zC`!#wZaET#2+@kehLCZP7A+ z)T=SslfU9%FArpZZbV;TOfbZxbIhqWN)OA*VK?V@u52RrRpjU}L)bdS_bsG+7dglt z{K_iGyC>)vHJDi8{KSpwFICQw9$Koe`t;u9qn;wp!&gNVAf7~7FYlWthoIo2(>t9@ zwH@GitSgWo3My&EB2N?!AW4dh^dp87BDE$)$qqsRtF%@ea*t4>aaCIxR6yKlv9hwd zeENOpjNuLE`<_y8)a5dBwC&?RgJYRH-R5+__4$0zb}HCAj2v+72XdLinUJF33#}RO zDMKlrJ@jWR}(W6|@y83u+-)LSoff}5QVB(`6sJplLF zgORv{mEKQw)6w|DbY1&Xk4d|Y7N@;1EVP8tEH*1NU@YdUeq?@odm7MoMNCb};t!at z=E?nE7Ya05>wwNn3}a7bM+XmD6vQaL3xcA+i<#RS(buzNJRp{uG+-Z$CLG%szTx)t zx;Qh2?tT+|k#@6HEtfOi?()KyGm$`0WxWCRhd(e^AeoaZt7v3fAM9eG!pPZN%cfa< z2XFijUD9^{J>Aeb`itetDrd@xxu3i}8&?16uHCAjkbC*}(Y%Je_h|%#3|fNMWG=Ra z@aKK&pjPV=`3|}gO+?&acW=<8N#J>qc{smP$ef;My6SR3mV^y@&IH*Bp$8fW9$ZfQ z!9(8hC^L|sD0y>w=?E1qJpxAUN%(~d@9z_LPV>=zfRvH@?;2ZEc1WSMLXH$+1*kO< z*CO9!O6Xe{HN9MZS7@0{w-T{RHu4ZYsQpgaqn*IEKjfOT7FTpER|xi>y#a!dwrnv9 z`MteDZEwIV3mwP;2suo{1Xn78U+O*f$$#Oe#B8h>7J1J)^L+bmY%F)=YpNxTQ4(;*5DKy#9+>vMGv1?T(gd zi-f*R;0~llyjF48T-ID^_4lIVDTx7@#9ztEj8a4XWN<>;U>Fn5vk{%LANNXc>09ID z5@n-Bja{{ zq7KOhp;@cJ1oGeL)IS*c-v$34-LBy0fgse@R|(Mv6+oI8eZIeJx~=HHpGXRt0O<() z5zyd!Mu5!YZ{WEH3E-f74DEl=-2bjNY~1)B(i-j^W*8pL1bni}W-uHAxGE?jqA|LS zhX<$2(WLQUIO3+yRX5+)`yF7J&Avo=2~Fr3h#c@d_pp?k+UAabao&|oHX6%}Ug1!1-W_Ir1(#{_bskXI`+V4gY%{x1#H}$z zo5y&;TdL5UV?^&c{8;BhSk-Xg_px&>Gskbf_#&$bdw2_&`$QdNp@KBG_ucbp!~BAl zZEEu!m-O^9$BQu_oaheV?%Ht*r6GGT`Q>>5F1HVRB3vmv^nW&?XIlPLW)?OrzZov`tSdB{ZmBN&+iGabrP z->CF@3ZdPTpPCm_`mzUhE>vQAY)_hT9H?Ee9t+QbgTZ0mm%~=!MtlL`L5}8MI@q?8 zm~-m(=5NlDa*Z#SUpBQ|jL>?{e)-e+pKse=c^%_5ZMVIho06pnHvSL#YGK_*NFD@f_AS{49pKLgolw$O;wB3FV@*2 zPPKiYMJMd5Dd_XFVLa4#6FeBoFSyISqvjY&D66TDBy0T)ylgptnKaIDzDp*$*-(FC zre;rHlb5{9=VrVhK4KyRRH?Uj_JV1w#29rQ}tS^*EE$CKRf=uSGVU&tuN2w_{8%e!b zvexkPm6G@hG0x5kh_tcxtiEGXkakn9!>pz?b101{ah5t~T&9#Vpe@nz%eStG&db$P z`(xOJiOWfMi^X(@msRO_j!ve95H|gh9w#Ix@cZ3xpHBN<2+J4=*qnW9gh+er^#R|T zb>;_`^Eglbc0(lM@DzC*M1ewDAp+k1D5}x*hbFMh?9y#>o3xFpjJfwB2cMVT=xAtZ z$hP6_wyLjeVR*O(VO?@}aQ34PAFcD*|0&5`HeR%T$GN+9N8;F75gF3?C?vIlAp8}jt`(n=R zLBK9t%jxP*57H#!G#Nzi&7Su=!7tX<9e-ZnfVTf{>-OG2*pgig7UR)xvV>|VqR!h% z))~i-hm{mL%Blolcqs+&ziZfeYB*m_9{W>2;$AoxX5fNJZ%+YpFJo%21eY@x7GCs% z-O*Py7l~xFL^Y_B?MH-c>m!(*h~NGp*<~@ae|CXXu-2BB#p^$^d4$dtu&52<`*c`P z-(pF2DwcJp=!L2euhr0#)GHupyjnoLXZPoM>MN>p;OHf;EU9bJkvbbGK35i1s9NN znS6t-FMax6i_@P+Bz1P#FnIH_m)9D}tymk>S3e0gNhbYW$-q+7@y^z^vj*6F<1>Gy z@6`4n2f|C_{w{SsF>GXTB4u>z8vl9OJj52qdXTJOgCJf4T81G~|8`5;E40Q~sEhaq zjSRK(`HiYfiG}#6lnM{lw`d{Pc4W4geTI{@TN{Pb@#!ZUFKIF3+|n+6UqKJA^Q>Lx za^=oL4Qj|`r%n4}U2k@(=WO{%J`x~HY z^yq8RvOShL-HyKyDozD-&?5X)=<4FN@Hi_TPnAK}jefbne6c$o<{B=8hDW(}op8(_ zXVJH*bGppc(dtLvu8NHyO9yE7k^Qo@san&kj8JUa z0-F>(!vq;~r;9U2l`<}k*H`65{mV0Z^Uyi`;B~_u=4@h2z4)HYS>&M@TY3i+4Li{T z1F~J2SzRKSSv{~pVlpCnx2z60HS%VPNPBHcq2E6rAuGwvwae$MgeyUGWe+l63+FrE zMD%qkw2<`wZjF<_87XMtlPRoE&)Ywsr23_@L7UA(iNk>LhtzTetGo{mtA^D)0)5p=@byXd%yziVb*1Nj^jzt$C_$o%&(aBXzu2Jk_3Fx81Bg^|p z*}2};`f_isMaJipTJ?Z~=SL>D6F8#>|SbQ&I!%rODNFdaZI1B092iuxmJ}snSvkE1CEq4k!x?-V&?Yq($Jx>6f& ztr^t&yR$ivr#IfkbW%eCsOCT|$JN4dV!9GORrJ{G(GJVgf_;5b#yLCtDiH1{QWvF? z>vojI#`bSo#lE&7q_m`jAXIxH)DDP1LkCXY-j4yQn~RmIH+}^GA6fgl32@AS71^l2 zUjd+}{^R8QAF2$UfXxTjKs^To!-@sO9Kv6Q2SBvi2Pj5!AlZQvuIF<_5I}^Yn3-e+ z`4flolRB{~XlEK}HVRt&05L=1DP76_{g`h2;%7oDull`X#N{EQfx?|@bY0*p6;{() zunF=Eeul+k0#Q%!5bW#%{~SK&`Eo)~m}bn_l+)$?zCQG*sG_{l-^Swi44diQ*ZvO$ z5DiSqo7Qrs=T)8c=~jbxqSEBp*j8uvjodSv4sTlnL!!rbpm*rkdtmi56h(Lm)+eA4 zK4ke>N^WXk(H0?z7?o&K($oP)mWc#s#cC4g*CO7Z`8_-Y3(6OXLK_}{vM#Sh-EF8~ zZktb`GA1>nig}L@Un_)|fQ!-I>P8A3Is2mrGH>xs((-FSRd(dBg&d}Obz?O(^HxUb zsS@0{Ep79`(~Sv?nNWhR7*sH#u4?s0vM73TNqO~QYt<)2pBMc%M=|QjT80U|zN2~f z{7qbgl~2R^9<S zm=Mph%x~Wr<#jt#o8~$|VCekIlJ9-?ukpnF?|b~wH3!60!;dq~mqDV>KHxbTNv4o( zyXtx4`dja4{vJZ~P7DA&dXD{&@4$xc17O(p7}(SSO!4IZ=y}BIeTMwkf0Rw9Gd`U! z1MpXZ_qSePJ{V^sXoMMGZmJq5lzbAR2d-~AOaLJpQUXntHpTUqaPOCnxfVzdOMAB~ zeNJ4Zui3kJX)FX|+x4eBWlL+8M{7XFm0WfV3BqU3gZAffn&GZ=fyboYSgEpZqRK%+ z0DrEXenU38X1f;wQ1gJ)VU;(2AHtG4LIAo_IgI`V3U%;7M*7BN$ae3t4{nTI%i$`) z%2OAMmanO(8s7C_^i4aPGk&KjY^quvad;R`zc8E@NLvb;h{BT3uvoRriSuBZxDatd z^khbnG5Uq6rexNvve6KwPl zVH6%sb8uH*_tlhDd!mspw**qllB}DX zN$?t_riAjZZ)|>_w95<_+qTQ+3*Gw!nB2l2QKA=Y)ry%vAw-{4c`pn-H*pRiOqSF5 z1_2*#{~}5}?o_Ma!e5!Xq0 zTn%!q$zm%)6(cgA6ZX^lgO>gFJ2=nz^x+v!hAB*lpsSCskqvI?gye*W%fXK^7zkur zt-g$ckN+<0p^qp1v&!}IP1g2X!Xj>Vdh;d{uDqaoy>_WI_`5?07_0ZI2jYevz!;zK z2lwYR_euxQvWVzA;|^cazQbTdXSEN$nhUYX8)pef%AGNik_5BJU{m>hrE+@Cm;Awk zQ4>nY_-1Y%WyPKQLD#M8P7zKbMPW^(wjj3DTE-PwycRUXj4x3tfzAryUmr0NFS46M zCi2ahIBQ)h0f*+6e)Sz9CuReX&brd!!oI~%eS}rF$5j~McIFJi$*Jx_74;2VKFVhz zdDY=@I#NGV@I-GxEK@X0IY9FImgLXyw@FxLKKs>sOT>g6AOk}R%sHk{o-{kY%~>rT%OE)>bNl;M~6Gi z8L#AD^z7LmE@z1{5|<~aK5hV!A!NE}}44rQMx zTB>mRQzs~{k`+EIO__RgyrH(p(qB+^eHEG87rs;1S42j3omP8-5{bB`LC)yy0RO6y<-prL)Vwq;Gx8hME#K)@dLSm$(g`YAizO6^GfNqD}k+zCpTrofQ5|Y#&<{LlDtoIwUw91Z6v8O!{ydMf^S`?xSa$2G3JSY7 z$^_ai`C&<^jQ`UNP3{zNeAw~tt17Di@m%@6@UobS4DPsJUY7y@KaXw&`;t{XLlHAx z(d8XQn$c-0&!9uL!jp?XKd5Cy{Qa`;BYk_#v@&%2mgQSKFzcnSSFk9XJlCj3e%T)X zFugixQuM<_>K%^G2(1^ZHiNJxJI3Qnn^lA+f}xN7%X!x`qGgID z3*mKjiB&r8yCp6>0>d0sTU%TB{?B{BDJjXOwmlp;$pdkv0)Nq|TU|;=8X|bw`8d!H zmK9Zik&UUTi1a@mZ0STVv&3p@Lu(w|+LZutd%X>Jl^ZnuFzktCHfFm`%IV*W%-!@O z<~cI&s=m+^^l>CHzJ2R`%4B=Nao3F-{Tcb~NsO`lVX}&ToKqX=Ox(`|%*_j3jdXVZ zysY|#1@ON|gZ4wu*4^N*p8DHg7C_wx@5I%N&auV) zN-OEN8hIG<&)B9)WZEfMZUxgwokxEG+Ed5$=!maE19y1Ml~o!}M1{tT$Qbz8 zrHB#=^`nLQ=jFlD3XL>Px{;}*poKmJ|J74Y*GlwR*i*s$-ktCKkOA~bxR z&&U+;4G#^0gb+{q9XSi$0iL`Yi#$~?{&Z~+HIqX9wec>3Su z5Zea#_30ni4{_Qdt|Ao-c1F6m(vt9Ra`U+9mC97K-qDQ(!ex~?u~P9uD;SUtyI!2+ z+2M-|LeCvmYtnM^5doTtFYitlq9A|blvA6@TQrV7$O49Lo8xS+Hb2btRv^n^DX=wNUEYE%b45u)Pu7Shhnh$&zt#?&C*&|zD9d;8H{=fS^u zbKu&pS^?7w_;~oo6SKF9Q*R^!RPPC9gKJfRw00e?M#4%+Wlj-o$1UpksN=k+{zgCU zkN9#tW0d_DxT+a5>ygknzMFk64*QAvGJuDz%@K-eXubp^oXVfbyp*K2`#|?N_G#-u z$|rOp`&w^Hcd8=#a}-DW>_q6F91%+?rG>Mv5&vh|QX04J*7?}EB}24*X)X%Y*L6S~ zKop+ei_fz*eDROtxte#d3$%H%k24bf{HC_yemFV&XtA0fZgqYuyB}YqLzpNWvntuP z5?OJTsU^3t2A8QTRinaG2rg4=>k(NIBXa9p4+={)Zr?ESBMKo2B~DqC=1RQ6F+glj zh1;0_P0r3nGHYW7lbabHBB4VqV;(0W9nSw>{?F{vqkZk{WO>`mbs3fx%c^@7#gZzw zLJScY2J8ohPt&mgP{*Bh$+qv4UR)x^V@g?9#Vub4({33zi^6O>M z*Jag@zS4%MRN`yM6Vr66#F$jB|1rXs z^!kp_Hm-bwZIX1lBY#K~8K)_pU$6?rpg0wo_D3A%2Wh)jdL}BoV8CqHfY@-hkm9~K zMY2WuoEu_97nV!k?aiiM=_6<8?{M16oS*TeIG+m|{l;L7Pm$Wlq z%eKfj6bNQb@M-R#pS3lJo!Ps62q+&6i3m~lZJRciJL5W%4zX=*FCA@Xk`#?I6=&@jnpI%3Ua$c1Ah93 zjaEK^2;?`JW09_S=e(R(H>J`z(zCW=N+LK&l4kLgmx{$kbQLHV?EoXR&3mM`JgR79 zwg*c$bqG!t@H;{Ci?#{bP@F>@e|eQ2{T)P1+@0PKArZ5HLUf1P>iu^7KRAjQwJx#Z zJ+GrW81>uF8s<0#pC+OOFZVZDz0PL~%Heab9yeZss1nce8`iF?`{NVpv&`_J6J3AI zRNA$KYtBc2^Qv+d6UXf9y>GsT|+4MFTTQ9o&L$G$bNh~e}toGwGu0jwrKI@jti z-Qbz7WWZ4A1D!4)cWek(elpt+MBXJuef1$5yg&wA=}o9A`o*!XD;y=?V6jv_@O`%4 z*z&ZTVxZxjAbFoW0$)BSx8C*aF+dCaWjK0=nV&Oj?DPgiZbqK)+N;3J9HZ9ZUoT7T zj)Bq*(@VV)acj0RbwE>~V|Fg|fA~7fsH~%I+tb~kbhmVabi+ePNl2$4-Ho(>bV)ZT zodVJ+-5?;+Al+SZ_w(L!?iu&Py^O(-!3TkV?7j9{bN;5P5EHHfwq||AlDoCF!nP)* zZ2|i)-M7>(qG9$CWtUY4Vcqhhc(cXs8(iwy%>#!{VWKD!+8_GOQeS2O9qS#H+CnPT z`eCM8SP3)mAx-Y-^lT%etzw7J_TtRGzcfXp{9c0*^OtPPmo6-^NN7<;-;5Q}@gN70 zDkE%m#yUV4?NbrHQ^lQn4$E^++ZEYOg?FH5j7Z4*^ofN9H3rhk(zWKX!AD{+hZ;*C z=xoXK+y|H#^JwdN8T)S3;M&J7)5c4M&P%P-=|wwx<&?qu_=SFBS(KnER8~!#dS0^^Ng68X53Csn81G0iG7c`Oc?f%{ zU(74MCJEC>GfXHGh#=T)k>f9(O6G|exIStDo42a6^s9)am$cJ`FhLwo>y$Fqx7wsA ztv)O5zCG$>ivf&Wi&CviL*|(;r|n}*H0@r(r2akshbwM2G_2i%=F2a1a6~)(A*+Vv zm%wDs8moGW;z7ioF z2O%u&6M610(ivK+ zACZUB>V-G^suvHAq)vL3N`F)3@n9X`A%3tI5<}(`R?B3p^}19;gjr8nB0@(u=}n`A7}(- z+{kEy^3&5YBGrc;iD(|5>x_Fahj|6ZERI?NV8eEpl?`#~dxreEt0aqe%pGy14!`7< zm4rP}1tA!Q*g*z(dyELEkxs-HNtN4OM2Z!Nur&5Bo4vVf*Oh!;@r1dNhn}nVSUg79 z3;rdLyEgb~TYB)r_DW>jS~z{4`=p?_fhZ7tDd1=J0mtUv7kSrxu8~gxA*Scb^l8~b zHlm)D?WAEFec{AejJ<~gb)&uu?^e3WSxykwSSo3UcB^aHJ$OAu#0cl-f836K9V%{} z^!&9IrYFk+FC{+&)6|e%;zjFIQE7%jqDoqn=$6uI9U)+rv{IeJjq4}|lt z!4IYqFQ;5&`$$8}sxmMYwF0ghrBNi6$`JJ_n_vHVgISIZd4r#J#Z(%C(UX`UcFERT zCacqJwb>Z-MB7f5n%(!2;=-~j{cIvjctb08@JI_6lDU4cU%?70d+2%c$JMPP2C<); z$AH(r?`lB@MS3hqs(&nXH;uKNTiP93+C(%I6Rk2T4CRw%q%_-Nl2f|5Hs;m}zXZ>R zaENAXRBoAF!806HRVxUZx^^6dVg7x<^E-58)tof=I+MmzCQ6^dFX9*{+RcmLzE^|H zuuf!gh=djpB>KHqLyF3x)J1uyXi9%5^^HWYg}F02dXtFCC($7LYpp;vT-&}lFH>24 zzKa?TyM+v^r(diY45gH{@j$-5?cq4;k^If!oMRS?MA0NGfH>R*~~SAwzM)icBf)ZRh8Fh7AyF z2p3c0#WF-oj|CNAV5i)c$Z`iw>QAiVG`tOQ8xFy}SX!sSAirCM9VDXKFqFeO8N zN2q0Jf1g=W=C%JLcf8C?sYt~1?6K{iHS5MY!gG>8n{8>aequ0r?F!vXZl3)~c5)v# z@^+Sw7k(wI#eEba3+(;ruz^i_B9$*Fy!4aVj4vmmw)r?$_s>7>k4tqZD%OvA`JwCt zV07!UI+L&e0K}g0aAv6}9PJRvwF0xNIf>pm4PH8VGoq(X(qe)|-PkO{PX`|?lFX|6 zQD|0PLr)6BhQJt9bfmDyWoC^vCam5kX(j&fk?B=;KaK!X@vHMTr^hh}4pY>2&7P=Dv9;UpT@U08 zQ>-WumGW2>hBh&R80$kHxfMd@x8CztIr1lp#?r7`2qE?duUa z83hlMtqsL`?qVBlOqF6uoH1qU`ju67F?tJP4=nvzn}c#MwFAR_j3l${AIM~)wd{b@ z{Iy{O)kbAd)gCV$NxTNu;5&JlLkQ6NlR2?J4UFJ~hj1PSfEXZO9d|HS(jR>gbK)8s z8|yRUVtA7?3RQxovgvCtLk9q6*N2PI6rvf*4850oGd}=62kWQ&?-OWa#&tr}Q}?0c zZAeN(_Rl1E$9Ewqrs?4lFnH|+p~at6_WTN7bb5B%{{t4FMdx?~ZL2&w1azn7Glk?dxTBoM6lJ8yF|a zr3ve3d$XgzWSt)mQHGCC8IMUDOYW9wfVIQ&3!9OGn1uDGo~#*V;waY zX<+1D?H|8GogWs{^0!JO?vL$zA98%ySn0Dwe9*Z@q~{m*WH^?iMr&Z}6x4nC#wMHysIF)IgsxMvgl9lVP-8ts1BI#> zG&Ry*XU3$azO;KdVlyTZ*j(Ua2u^iaCmM(0W1Yb%N(9DnH7f>#_O}5GGD^DPmU?iV z;i)}aQ~E@6Z6Q>X>CdA@@Ym_T9EVOvSqe`>g1-EgP;7aE!-C6aOyHZX_UQj2cISc& zCkZGJV`q)jA*pp=BbMMsP;4(f-?sV)n-LZKzA(vv8yMtd7RKaQ2!WB|LA{ho<41|mt&?51*pCh*`uq$S46XxP8mSo||E)GkY*C9!=VtFFNEj|7^4Sc&lB z=nNzTb`%z^4h>k1JCh=XV-2~Pr5jUXQ?*3J{i03vYg#i#DU|)J*LKTQ=~J;0yYxWU ziA5F_)fCj#X#eiryL(YUNDPw-ihG^`3&J1QA3#tkv>DAq1gz}?lpjR|mfilt`wZe# z5ZWtBYQEnuhsrLK7~lL2MrU6GkzXrDm@1GVD3*3GfwtB@Q?K62`T6Nar^(oDO4jc$ zPj2bI2VjeqLFrDUH${y(c_`9gh9bsHJ6HMU4WtbX$)OWB&t>YAkmO`^5`m_ zKZ#eDzo$&vCIlG|!i;7lAlvyVI;9X4&&eso+-dO|`FZE$l7@1Odu{C@*eEfN7=~-e zQE9|TR*SmiB~}|)0w}mhL5soDW^>%EfiJ%%2*rHWdVX3c2@`33lHKUm#&|0SYaaad zhvl_p-w|G>XVH&~^}=vFW#jLBW6N=rK|7?;4vXEsZw#aDkshtKDPe9+&`NY)Pw*S4 z=JhvkZ|6EK9eDEi44kA*dQ%ph>n}8jVxp0_8aD86siRdGU9srNrK3(Nhq9_^k#Lpg zq;>EJ>z?}5xM%u&ttGK2-guY%6hRbNtPj?~g7C`->PWbF0Uk)0`^m$TI*cCLbLX#X zQb2A=E1UyyF}7VrT)>EGu}$By(&hn7gt zq715^5X-!n5YOEnk&YY%o(%4f{~q`M0f}W^etr-l`b!w-`w9?3fU;>;*^9llBmOKD zDHF_?>z4>3ke8q>FerGN@8;>``Jdx)`;F0Y+l4ArZUi0bzlD#H{Ver86Kar#iiPe^ zn$Uz8<$n!fc?HyPvl4g(!Hr4om8!j-RSw^&(jc&Un~t`%<9i#G74 zr>`TZL&7W%KfWy$pp^=B=?lO?qCtz;!wPqpGWsp{CnT=|V|r9;q=xD-vz22xwA6#& z{^N5>?nQ<_ovf%1Gckek<#Ue;V?b)CrkU^iL}5y?s1(wD-P)?4VwOzr0B_Pa9OV6* zpBYaFc7Ea_yxx?z+YT1uFd<3Qd94FAmRNV`9GKW#KW$akiZuD7#yPwj%w~Cx`2CL& zWLbW`KWBl7wq5GBB>WfSs;V26n1aVEtwpfapmqmAWJ1V!$@pSK3m%ih>8$9Dc^m3d zO#=6&U1S7NbVD|S`TN~hp5%x5GGqm9W931sTL_5Ft~ZvX57{>kNQE9_-X9yHPCh~P z{IuzN)!(1{ISgX#Ke2q&{7S*Ul^}MJK5_b`^D&GzRxnt-P>##@+HPFz!44>76Wd=I zw(ON;-fj?f4)zloV{}2&RG@S%hacN7JD#6Tct9m1cJpJR)_#fK&G7wDBE10!b^}fB z+&3TZXQ2NU#))NExOlBTkEZkdxc+Sm3&f6iO)EYuaU$m^P&RO&|9pjBZ;@gWz|1G% zNO1yl^nN1{f>2?Mf(7mR)|GOKI*Z&rhT5WG}zFXNFSNu6uSkNicYwvK|} zYa^W3Ee9DA5TXRKvBsX4kbuZEuILV`w_Mt9C2v=y%w^1xxwt}{4WEC8M!q?7+u5{Z zw%;LSIWc!RXccUG`VuISpSCa76~p+C<+7uY2H@CcYK<* zpJYwOY4#CKwOZR1ZYNV-F6kfFPU(R-e4}}po+FPD&cM6Bd3D(=+8iWYA)6G@M5vBL zw*f=_DyDm#*<=5Y5Np8S(ttP?G5@=9pY7#}Q3gEJ|F@hlPA+v~XR*e#H}J3@h$#lA zihYw}2Lvp)X2o5L7&;uj+ZqYk0M<0aXI%A6XmN!c_y!q?M!b(OMw8_tx@Q4}UwyK9?${~dz zNfOuB#p(2({^o{f_n%M760z+!8Y%d-@k2+xjy9Ld%A3r0VSoQ32ty$gocd@C3}3DZ zZ6YTdUtRlHOBK?K1tWd+Ug$ zMF&JnE!p?V0&G{=(GDx!p$Ymzc879Sss;mpdVjebAJXq;Y5lv$1NLypk6rXM=VTw`dyE(!I zO5SPY`S`85wssg@el(;>Faav6*5kpgAyfEMAp7e9>Sa&i22^~8)2XY)9qZrm?2%|<9+cofLSw&#Fm%FW z?RQNaC5s==nL;Iof8(zd#=ee9VbM7UJ4HGOV@tc~e16Ju{z?3J?Af_gkA2GkI#v>D zr)YGQ*~AP3ZVHRcuOZ|Xm&#XnX>3eiVDY6&cbv?MD_9HKFsa?lN>p{!gwf4*g`crr z=zsFxNO?QP>cuWH|DLh~Zwc+7^G{dr$qYx}rP}VGp~%aq09X#EAzh)m+IvwWA&g+o zhlJ=)i*Xuyrs?XH|Eg{^@DR{uLUYU(u(@c2GLHJkk{{u?%mwC!U}#Z0!cd0ao}HV2 zt^AwvmJQfu`yzSb%vCQ?Sr;BX9sI9$l*R5zRIm8sF9oIw1rkvjT`blG47@AGGPb%9 zG3g~6cP4qgzHh$hXuP#*fy>>rYxdO2dNKAKT>cfPxpG#k|M9?xTQen1ua&kaF-H<$ zKR$6by3+|ArRe|*oBy2Y$|QgnxKSb1k&1KT_RtyKEx%}k%a|-roP;n((aSQFt}jg8 z5!Cv+)RGx)v-`B=1k7JVL@>dhTggS#5bVbUVDL$oSGizp{w<<=pY8n;6BE<#VQIDM zhY}Fm<#A97d$68)W##1LNZypnzRoVGtc>aWcUAqAW8CaS{fWG>o}i)$+X85^Mze(l zcuR!uET96;sQ!(b2l4B0@Pt5t+yQ`O>k351PC!Wo2HIFu7*@e~a+G1 zrOT(ZWaE~9bAZUjE9Drz;?D=~Bq_+mf*yd|t48!r*M)~D)06JUQ+J_WV~KP1z%eq( zNB;m3DnYa9*H$W6zRE?3pchEYW0*Z^Qzv0Ok!@s*P0&CWzIss0LXVB-k@f_0>Zc&6 z{yb218?cMxNKDdBf(RCJS`BmOr}feU#W9A-r2IK`S-O0#rQYU7dnS4>r$`Hx2_Luo z+A?2q&#LT+nV9Eb4m+RGm)b?+aBHXJ;_uCN+AaRPohv!(sQ7cwG%xmG5AI=-`RPcc z{Q2V`=^}1sv{vFt=eaA~i_;tggS61MLo*9_x&1s!^7WOpilZLsBCkiAA;hWKHm_go z8Ir~aDk`FG$YrHj;Sa*-w9E>*&$-GEPiit`&lX-Vo9U*tC~6j<61b(lE>u>KNnwJ= zt9@3(;m;w3C;2e4&7H|_zkidJk4}>D`xa=FdLCA8#Ky&+{ltLjgd6C$8|{~VW_zv- zW$@WHKV2{VIBq#$B0$Rm=7HJy`OOD0=!ToKGj~|HKn?|AH-n8hozoN!s_gzM{=^Iw zb%Q9g^5dB$WHTZpP|dkq{V1<$iGseoZueb+?H~hVwfOt@6mT5Kw;|~Sfoi}vR?5E> zM=qQyPvISk|3(CNsc~rA1=)fOIjJZGNQ0sR5}JRw(*Ncn=dQ&NjuI}@!|BDL+k{)K z{tqJg~0SH>PY=x)TjB-qX)Y%gZfUuYKX&Hcw8B4tBd&rrR(=}g+P<^NTD z;9^AH>Ad2_oNoIXp<;&fbURBRgjy@IiwrXZ5G^#X(Tgfr-D|^5AA$}cYoE%OhHh1_ zIHco7k!^A7d0TwwQeRjt`_!8kYM3)W$hLL$|1ktPnM|S~IOKT-THA-OfdyLI!P?~N z_nDpDABY+=V;dkaD37R0@qSEacSWG$Oa_D4JLRLc%+hSnP4v%LwjxK@G9GF8dUczM z9nIIM5H!`#2Y&WH8Ff>A*-m+1dN6`>-!*MYi89w|kIOSW_VjBP<<1?josP078LvYjyXb`MTbZkm43zhi zp9Xg>qDlCopfNpAz7-58#XdpPMGSoQitSd~(hb-LfIVd>1Y2w{nOXDNs|cF7GqiJI z;6C>j3dORSDRDk&zu~r-R(%se%wshb8 ze66eS%_4eK6;1Yno{hmV|Ys!4t%DKnf zGVPfVutoV&B=)0i7ROD^d;2Mi2~Z~a*e*w=Mj>=&nlBkr9oC4P{q_n2D>QXPDL-%5 zT)v_)bBxGzmMfC4`Tm~esMsS>oBM9=5$Az6yODICW-~PCU{dxm(Ogeq-UVbI7kB+2m!W1ltRsG`@aW(V-7@|9B z798Se9jr=SNs!%nDA{ueuLF4hVnnaxRtAUv>5dWmA2k}hPd*ldWZpvanEZTxq0$C2 zCGtMUqtZEuGQxSZejWE1Z81x-W;4K0z6Be=$WhraDvQHpoI zz=$17QU86_%gA7ASo#e`cs{bJ6J+qwzHfW1b?@T$ZY~tW%}s)weF+?ZujZd`XkxA>v;j;+wkbV14e%BYLVlevz z7ncjAr6j3N^U_O{>ApIt=#b#fg<{^b7K3G0Z7>e3HaSG`R2atx!_u-gbCGfO2MF^*PMqt_BkeAGpVx;WB8KRN zU)8dZSF+=(rk79lOtQ>OQ|2W@eHq_eNp2L@%U(j5hdXG#%$9Y3N{%uko;ITE)JHeO z&R!qM>1)iJ#cZcG8y=rbBpMnXx9kN;SH3FF!}Fes`x6 zHC_XF6bq+z*lPtxSRHg{+iFe`*4^uE zVi>o`Xynl+uJ;>HZ%_VWiqxAb)a zw~ypNzj{_8Y%CH(Bl|0X@Pp{+I=BL&jX1uy8OuD5DgjFz3z_6vP>gP!UMn@1s>YVY81F9TD%Y785W zMIa2g(zisQmv^_O_omPWZv-P=Vv$F;)%*Rv@eEz%l{a)5RJGf=)4?(Tetm*+`4jvs zPhZirG8yR)3?6nTbB*^jmd#Sxsvma!1GGD^OL-G?dL4G{XXhIxxjJqhAZd!fHwyKp z?)DwvafDUJ&)|2R6g?1~CUrgwJX0q6 z5rf*A437j$lp>McB})UN7f|+f13mHvr%S zUbF9eZG<3T=4YKLTdk?NHpxh_hP6MVQV&8o#oJVrw_OpIQzI1990mH)zM_|@)t5dr zvDUk5S@=c_*{q3*sS2;R1BhcKkO&@W!mZRCw-qkW5(j;kby40`AcUuw5+TO+7Hqu& zlg6)aj6Wxv=B+Nx;HZ;MU}u)AkdH!WeO9l({hGBNu9Kl=GQ;NE!-WHofSfS3?SOD@ z+Du_DcNHEEj?8YIRreS4i<&8B*F_V*rae?CpB&bfS+ARTxWwbsm*dO_@v2^yl^|yH zUmw4CoZ)Y7EqF~aZ|-MxFTSZ|uvCmNFA$;keWF6`2_lc*o=y=oO*V{YM=PfsH>G!6 zM8Ehhd##@}#*K!XEL!kZwPDrMn`aae1q2U?QjY$hR=}OSy=q5YMWOH1 zSs4TvmMoDkMCUXl>So9;a+nhZH}eeAtE8Fm<%NdiMZcK9Wm1zos#r8B!m})iS?wDv zQPnuh?*62O7eri%hf>KPg;xy!pVuc7yAS zUtI4wA6wCAwv}C{fivOr2~a3_9!WD5GZA04Y2Dyb*gts8t&^=?kBy`?%55G~OyWSN z`~kPIj?Oa6SO|jjdzFcH%x63$|mnqqZb2 z!Xq(U4pAoHW5JM0j$`)0kt2E0K+9`heV>r5aXVZ+eAw8ZiOieCQoMWK5=o4u;_*`6 zV=aA*$$yog+J`yy#ZV}J*G_MwjYZNsE&h7aP@Dw@w--Hg{{Ws(Z~)H=jhgqh68ToR z+KPHcnB#Xdrm$nrJd}Er5^A9j!|(pxKO($r7YPRgYB>~?WD8Aa7Enr_)fu}E4Esis zVsVMeDL1913rAzeq4TtECKjHhZ0+9n-re?Lb211Otor(P{9H96dNai5+#b~AZX7e%LHzEn9CX) zzmHk$33qCJMr&zU<~-(#OM9@YE$O=971_ljM{xA0TU70U7*6d&X8Mz>l88c)SC7o^ zSrQ1-fIRKgQldv;(m;9$@=Ec`YK*xcuP|mGiiEC0xqBzVx}}a;da#?p38A=m2aSXL z_)c$sofMA5+Rn{u$q>J1`7kU zL!oHLy}Pc}PcG$#YIWRuQD!R z@?YIu-2PG9g0PkidC}AMaKymM2QWO6#HFuXiqSSgMadgY@dU_td6mb$RT15QDdciM zLUMW@mv$Vp8*j=$T#O7!Z-P5{hLO!|c=XDfZ3skm=q-Y@4!Z1RH#b5m^JHjGBVt%V z-yizISpr8(^P6|CAxE<}>JcP?8hLQZoReC_iVN@r^?p_=Mgy80aohQfU#HU!Xfjy= z!Pu~H+{9tTt})d^4GoeE_eDdEMu$0U-_ozFF~i7nYGbc>y)ntEvTO1Ic`b)BH9c%> z=S40ai#!!;S1;FQT83=f8}Z}==8eXe#JX}aGGv?uBT6#%GGGB(z30=SPm9#H1Un=( zLQJF_zngvD+KV#wy>P3^G;6we*aP2|soi3qMyztZ`2y!G7>CMIgnzA|x(YAsf z&l9?=EO_HxJG4jx+=%Wr**OJ3r0hnBBy} z{1n=&Q|qHi9z*~?JCY=KETyxfotbJ~Z#dFmIEdanw)yVK8CuiOB5_njcdHZ`Z3 z)YmOS=TX6cwROd&Ra-dJGhMA7LR{bjh)6A@4LA9??DuLhE@a`s`M+cxA=m$KAL5d; z3;5=uC~pbcq^`V`nyexG2`y+#TUwJSu1WZC#blq1jB!k~S|Pp+P(2H}M9XJKpSK7mERZ z10Q-CV-YyoDIoq6Li^ug4}`g4q~Uujcyn3QG9oohQ`sH*BvCZ{>)0TYJ-B@ZRQxnF z8!&ia=SC(PDyDp<>xrOla59^H5CnnfWxk?-!P0i(e^U74N4hTSPe1~?+hP%LXPMNS7>72h0$DkR{i78k9YehXqy-T)hhGlB#W z0Vcj7&)`C#O+*tezVO^C>>1}bN}G486WIQN-6o|K3Vn#+-TrlxoQNKlC^g^3k7&fn3B$#glu*h= zl);sUUCIHeSARzoigJGwO-F`3^5@RLcV+RbbMa+B21exZv=<6f0+=n?{|mE4?!(8uQK`g`YU<}8lCH~;%z356R6N*+A3e;6&y?$; z=3A`C99EjyP&_dG%Z0abF1%qsaI&a!1fAS7GdsNIQ(@xJWSHtt$V{qr{>u0|Breva z!|e5fME#6l7l#!3If4(8&D_bwdv>tTrOCDZ+;?NIOp29P>GhR%i1etv_D{w+H8u?2o2a(B7F04ZPs z447B{g6LcFJY%k!{cd{ZGeY z1zt1%_;-ImEaXDhXwPH&i}kqk`QQHaXZDte37~|S`)KUFodP5blEwc=1+m;Q58{G_ zvBV#p$OiH|I&yf%1w%lKeg7IvQ=ZN5FZUK2Rcvipp3ga+HI{!ZE)H3KF_hEP#NTtv zfVSs$azA#ov^O;zLLUJD$)ZmhaspzRPWy3TO##Iv8_-GBfc#cEB6y;B=gLfiui`aL zd*U&DLu|lT$KE|Y z{+p=8zCIxSkL!m))qR^rl)l4{FpiIRBW*YBCzilZ`}nvc{#A|X^uYM}z6*Qwg!r-c z0PR%m;l6+QM3~G+n9+BvDts*nnZg8E(4ovGz9ta<2?NH-x^)()fU`4w`m=`g|D%2Q z0?!Es+kYo=jh8=m2O|QOK@GrmQ(?#`{YUw*5r0w-m}XE|&w1nUKfB#fM)`_Qs^9A>0hY;p%(p3(#|LSh%F^2Ra+!5JvxDNn&bV zZjac8l;gY=3);-q%)Qqd+e{g;9Nx}WiMsQnfSI^BZTn~AJ8_`~p)Qsg{+EP# zG~TT

    ^=%o6ybMXSU-HQV8E|H{WiO&F;l%|I5d@ArE(Ix>}MCFfqBXe-61^u~z9J zb+kTo2MJ#Z%GZ=TK*1DZ|EatO=%FZ1f84wDztA}a5P#P`TzSq9vrJYKIb(oGFa+3i z8lperd&~aB`>t++Ffk||XZ`8qqc~3LoG8e*^#jwA?O*ziApA*n-8J`tOux}ia^5|a zRj&tx+P#G;DE>RA3<|E>IJ=GCH0lfx?KpAmMkM6)abrpm^1r{_*M%C{PeJp%!?p_iSnPA3v0Z25h;EUkp9;uCi{y+*VwpRBh!7AQ3pBA`9@6 z%-aSaw^x^jRXnzfOi0hK`fZCii^k%64%*5#6wq1fHwe+5YOte${vB9KG|xw@J3i-U z7FF^_M$0z+QcztAr$^98nR>#4V?&gp{pM%fjq~vUmMM&Z-pCFP){4ot{R=@{Ec)3kYz1$#Pq*oqRBHj+pdiTe`~d_-49~R}^<*tJ_krgx-Vt$c~an&mSDyqaEcS za7MEK7KY{&XPO=dD}$BV*+VFHqs^0bT>zV0T3#p1_~}l!BzAFhwl>pxH2kw@`&o>} zWP04$?1;IywW}-aW}@x+!!H1u-MYtihL<*@rkJEk z`j8YsY}x->r4VV?1Vo+8Ea+Rl&)e{(0FyOtkPPM83DxO|gA`cU-TnRFN1-=RC?bna z)fQOh(BFtZ@#+}+^MROdrLhy+F6&{-U@EHIiKPE%F5tn?t_;Z^21*YDOBvpsUk)g< zG<9?ao^Dp-Oo>L*xI#4Fh^9RMJ9%cvowxuROQ*-Pfg4|cHehQX023R*jR;!7qlOv5 zt65F&3EvfI{!B{%6SG^W3Bp$u%>V2BlHEW7!0%#Wo^1O*_tSuqgg$oywsGO0|_1V^zd32oT3l!Z5%|)JuiTE9=HYsD57H6jPYIHBBl~WzQ$(Nl* ziIj;=oZ<6NRU8an{|Vf@Hd1VTZL&j7)Aj~6?=#%Q+ka2mJCzssSy?)ZCoxs}z#UHr5n~U~Dh**DUU>AOEcK%5f%huoVP*%XyDpDV#4ShQ5`! z_$|ro_K`G$bq)9Z-aa`Qe1T_14-H8so+Q+- z31aj%`cyYfd=z=Mm=sE*d+4IoNZHf!U!^0vR~6E)gua>m z_}fSutjengw^z^*)L9x%_Go_aQrn?o2V_D-J1&K%+G4L34*Y$OO{TZ(sXXGLnpT_G zNTL^KWRWK!!HwiI8SC~l&&)nhZsn+NmhIv z%WPtDhdJOSN1711zyNFUI#^4q#0U{!LH@ZQw3q~my037oqyQbQ`~gfnEhV&zINFm2 z4EM58Zs<|qLUF7!!W$0|27kl9-(Ejvp-&qUzF`@Oie^_1C9>{d^3aM%jzf_x zSYn-7*6=6QItE!M+&_x<^}tzhUu&S@4RKME`VjwlJ}GA2boc4`<&WgpD$4tvsho2w!4s^v1t$(p1t*rP zKnH8;1js@c8=pC@eUCROp9M9)s&0eOOB%q1{R$2X&_|Ot4nwEhVBQkcb$$o>tFMWq z142r-w8Bxehqqn6YgH2Va#~wkL(#FQAW!!}5MV#=0LO8pFA{&T(Vi5#(*hgE`t_0{ zlv`A&#^eNUy_&Ic+{wcqpM%Q(f))+X{_7#^=z`uMz)(x$vwbQ4wD(4@&5H{h^7P%I zxO3>* zY?#f54;vtoueiMYGgOHIRb{V3&o;o;0A(FP|17iNWM=4s?tSss8I%-Gqg(@rXFCDH zrs=_7lhqu znP2qR(PU35^nG}PcEID9J-087IDvq-1zv~w?HG*qyjxxE>&BM?>ZiU6wu`W@ ztijp32Pt@x+|cJ6NzkwfaLA=_q2~UH80$TEP6?7isR@-qLw-T2IRufO;xM!2k2zzg z5HnYUtRo+auP#P_4^uER=mjW3F7uz!0Tc9isQU*8iZrXN4Sq+-w!GSvy8Ub6DT9EDW z+h)${S;+P8DJa}>l{ngyL0DJP$hIK3^xmi4$m!gc!xY$e^|?>1V2g!{Vc7H=IqiS* zLPgDheXO9JLuIKF-$kM@lUBJ=l@|_+5-; z0jfQW-=R5Wq1LOj<&%If<<%V-;o(UC)+ztNqVT)`V1dmMeN)YGfc@AmeZxUx?{WBF$!#0TT>R;ByjX*Os2;MW7@D8 zhjOMgl^8*yc%@&7e^t~Xf%|uC%}4JkDxQUNQWpNA_9QL5s}Z5Nj?T&kq`q9xH@^Cm^E^x+KOMu^~pF_>R0)5{t{Xfu6WWvFs?xWF_J zP=eb8WEZ78CF{QTGQOA}yg_jD7@>ZMhzbZwA+Me`T9NF5n0|m4FZ}Bcb}LdNZ1`4 zFOJn{?vFht)Goe9te^dA*=P&8yov~P`hErFqJd9grcEL1Z+UoLGTjn=`Cyb@SB_Fd z!$0`S!#Fh1!k};$>9(VX69Mvu=1ALwzC)CRcXEW3dKW=Y3jH-oG;0nI@ufcx>7@uF z3U_Hx03}QqHyulQLIiw>B^m}TYkM6VW++Jm26`9Q1~2{ZU6)oSZ&~HmpP?!*afhY% zog4DdOE-M8$;%@(5R4MiMhgdit9h97-7+E5!|iR(#-n4wg)#I|vzg)G;-3AYYuT4M z6qXX-Wq#b7`3lIOwqp0!?uU-QD)e}E9~hDp!56MwE5c?spt(SS?vES(*%D2|S#oG; z52f-l>OS*0FPcEoj?TzVB*2c1(82Mb$Ny4_Of16dHmJxcx$UY`nb%oJjqr&CPwt9S0fs`~N})w_RFk;Q`E?>#K`}pI zxKTaO|IbVqi@mX!+M_)m2OLC3&Uh8-ee|hf1_A7YmTxilZSFi28qk} z&Nf}k>%Vb;l?US%sr>a)1YM!%O9dQZ9!|tgl0C02KMHW+f8v8a z?L#1%qsOPNF@?TzU33Att_5i*bo^SCQj;Q$Uuab) z*&xgkZGYx9h{KB5V9CJYos&(E6F{3s_qE^f5LBEX^q}lw7~@@*%ZU-SJ$oxr=2+h} zss0X5#iJlJk}j5)?UD*Zir_CrsX4Vj?_0Tj#iE>oL$r+{gqD?6dw+QwWb^6GZ=NI{ z;)F`VEUmzJ4%d-$DuvOEL&&X;5*JrG-zM0?An(XD?@%|`OSy3O*bt^5nFa;4g--o} zL)t(`!-HOwK8#QT7}e9z{l$>b#n9*@tIC;fz2LdrYNFMgN4XKWG}W%d#jxE}81c(# z9T;%Y{^b2}Y@H@2@cHHjLxlm?9@|xhOg$CcGj13(26++o%~Pf5xCt(re4W~qsmXF%_%ZoO2T8KjMPh*q)!#!$Iu;;<9P*1phO72 zyA}AO5*W{!INMKB>y}w(eAv`EO%CTP<7IY5gP=i&GRjbNoHqn#_NA+sgNBJVS>9wj z{vDbm@qE%kW6;!2jfP@dm$}vlj8c-n^%~(Tlr-GWV7C-hkfGPb^$o&+j}wsa5TG&p zn2#Pt$rLT>#d-e_gvWA$h5R_|%9FoAC-a z?}o$l1xX^pbi-7LA5rKxr&fl~d3y*}SoCCSXeuw5J`;okCa*_q>EV~tqJfC5ZvnA8 z{%3xJB{EvSp!1%|2)OtNQHi(7)iSdWxMwBif;m{VLf&DJO<8nKVBaTx0RmTuiXkL&bT$X5!%@hTMi>FX4ZW|i7HU;W_yLgA&$(n zCZR=!(i}yjNgQk!PcuxgNaZ_IXR`+;KiN_Zp;iNYz1 z7WduBZf&cb@$Adv<;=W1Dgy(9i0EjG!FXyiF~0?ED`>a(!)!!N4QE?>d#QFMN$)3Y zj`;WQvg}tovh$@s{Vl7YV_B?sXC3b?3MJ-FL}z3K+J~MNCR645_|$Pjfpt8@UORQV zV%?pPDeJDW_}1}V7>aQtFOs&YylxA{-U0_hMD=&?lasLD)hSAFF9hsP<$tFOmir`o z64U>`sC(~lF5mxsoQ9$$Bt%jPNlKJmQC1>*BqV$9l~q(qA+tfUA~Sm@Ns=jH9G`+Zy>bf_JBqX3IG_G{uTP*!}7A z=k_i%+HC${Rk|*LV+&3*Jo)y5&(C|?9v+AixFMIZ)I1XPB1bNWi^PufH@gZQ%yDCA z`v?pRD?dMd`@)3_B$k$z{<{ZW^_tch3S{Wo=*r~n{ysJlU9CiYTEW>~bJzWjG*`Na z)OE22yQiN_`810ouk=k0-nlp|mdR0XS#o*!PSx@qErTr0P@l^Kj~X8ks(@yHoAmTSllMXdENzi@H}8U!1l0>bv(yqI$+* z98Qk&e7(8fFCA8^tTm>chcre_OMCypgKcQHXEe-u{*aoDijh%PSN9P0G1+$=Cq+eH z;ptM*(fNjl?@zs+XSg`o58Fwk`#iH+ExQ!EHT7Wp zX)hjwZgmdcFny8}f>tN)lZ4b;NBpMgt?s(!5^#0 zm(3}~_#^DaxXVHmkG>4@Tg$g}&D*rPE!VW^_(`4j-_YEfr8PA$u=#?u^{FhQTEm|A z?mqYK4UMT+`ZL|Cc(gA?s~`vksQP3zZn+5li~9OUiGwvDi|%CL^*w9RUia>%c!;9? zWGB6jjt*h^&dWR3m>{2U_2pTtBs%;M<&#>d6VG@IDByV{_EB~FvpgKasdlo(CRGOq zxdu`;r|Z;0ymT4Qs7zEzrWL=xvr2gZd*k&r%AYrw>?}}DR(+D6&wpJk+qzH8v^k}! zE?PXRQ&nAHBqf$)#IGtLszPsFjIKAfyi3J{`nY98Bp=;xh6Y&*?<}(YMqHW}lY+6E zodv=V*DsS%ybD}zcqp-1J?NC?1rBPNI~r4dmt!yAs_!NLblpBM%%{zqr76TeJ>d*l zNf?dYaZ<}WONA>20&Tq$Cuq$Yjz-qrqpY}idU^ke*&}Tsk1JO-9>*wtp^{|lpB#T> zSJtrxMZnp)wNem;f}LcWNzn83eqe!6Xb<4vSHtfweD2?GNK`n|o@XVG!M0fa@~}d$ zZ*{7)vavB3LSaLa3g>Pn!B4Y8)%B)1%1O!(al%sIvuAV+XU)H?%#XDdIdSjj*3M?S zg*xR4?c!%RMf@J-EDw6L$aXP&!jSFyurxEEQRHaxD(!B_ag|4Km{LW`NrF+0bQYX} z#9Phtkl%fUx2&uz+oFTEL|a~6oo*KcFUg0Nmi>`(4-yjC@T&sRKkJ|M@AC$WC9|mM z9NOX6mSSz&aP8}r2daMd{M>Ks&#mt6%3r=7&@Julmqm8##nu+Bi1RgqMwo*)GwDwM z(ki$qbAe+A!xJ*U%s_Jm-TJ`xzv5R5}He$C(8*>`BxQC z@W}nk8rF?PeIw(c$;>_t4g1L4XDsfr`{b8?k!OjK$~J9!bfd_ztqaGu+|$at?C9iV z1eFdG4Q^S9-oC!F>ArH4y4R#tRRu*9GzSm*Ck&_7JimDHqH?O{z6p!0@~vC9+RXG{ zCc&967xnZGWA!@YVOg@tMf76rk}wK82SN^RV;U|Euv1Lc9_aO zjRY`&0|wJ&13ypvw3M6Fbu4QskNo0gy{XH4`@;6J>fXq)Nz zQhmERCDH%uQ^XG1k2Z5(ySgGN_8r&PJV;MZ{sG16m&x3dL)GC4I;9@YE-o`aUs_So z(^nO{%+c{%>-u+${ylRqLn5}y_IZUKQ|f2E3`#00Fn7xJ;tU+O-}RDEmRK4+E;aKq?3%RHq*Ai$dHm)Od;F>R>z)srO;WF>b;gxS zK73toY~3two8+*YzWn?1`m4u6liNNyXflbOeE;d#vFMB9g%v&;@zni$AHB>HdcpWY zKAw&%E?73uiL%}8k2#&P4BMHg9W0M_NnemT^+Y0g_|3J7tIEnWfByWDjo^QZ=U|}e zxxO-QUON8Z!GnRHKP40u6{A0?Cde`M_xD@d+8!1b7Ov(|Nm9OvGk|`NwbbUC!7b(auBy{WSOS|qW_nHa~?+1SO+~yu@Q^cirQTzW`dbmt_8chhNmo>#N?RtO6C*M9$RkjSWmnRYY|>X>SMQ|q;;$H z-Ob-qJyEXnqxIP)N{CPuf7Vy$evpfBL(#g^X8tq!!NHH;zdu0*wtsX~1`CeVOmP9* zNYo|BGb6;|8t+j_N+;B-8_~Cn^5)hQY^^d^&DE*Caf5fsRb%+ZbS}GzrHYt&Daim}*Cf z?qbT(k;zLY=@%lhUH*ngzIbEp*zh_es6O3?vf}>Q7Pd#9P%I`VC(kJ2vuLOBn(Qjd z!Uo^JT}9-DXSN^!|3qDi4XJ%*pmK9v%;g;r;%mG}Hya~TL<%__J9*N-DOpYFtzx{` zLyg$_cW%qJFV0!jyuRoSOc*C0B^n{@5(JP)LKJMfJytCcA}#|m2{??>07qy=f7;yq zMyJPZZr9ZpywUh2aW*{60R6+m+ddRcy|1ncX5-L#FHA~GdXKiUsGu7&41mY#(;o&!iZJuUz{^(kFeD$2` zQET{!}7k6{1(#;cE!idZxp%@ z3P$`s7?SDJ5ft#awDa=Z1;5KT6?!?2=#aBKVp%5F=%hyOH9V(0Igy9nMu8J)<9f5x z)4DjQZnxhRbrW6&;Tx&qN!=DYfrBq~gd^uQAJlLkrU;NrVENKQ&c?Rt8Og9KzsPuc zuDLI!B`753)Ef;cd9~*?$&deBOgpLRRuXA_+Ss~5u&;mcZdsLARtgLz66 z#a%i141-!UVl?M%w_fU`CQwwB{#V-@5}vyxTXW3Ra>tf5YB?rEow;)6)&bS)-Z|a{;YGCaPE3Vj zYvgs`RURa~T>H%K!~P1)VbSNY!s|ybQ+|r>t?-kGEh|^KVw=ROb7X7$8x5nJh53fQ zl<+Ns+C~^dt7H35YJ5wMZq#Huxy9@+rC)_+vpHE-#a+3ClD139(|WR3m7E7lY6~gF zXy~Oc_)sp2sCnO~JkMr%)JTL>-w{|WOT)V~V7Hq0TD#l%I#a&SumQ${ws zHg^16VP7lYZ}?7O*DZI8#fRN?mRV`LO;4jSFI_~AF>l~2zdq$N`9-EPbM<|b$C=|7 zsnxuZP_hb^b{&3hs_dL^svmQOj?TDE0>r=A95UgsjSdXs4W?{T4FY3xI9L*Gk@`Rd72QL^~tKk>_= zHDcRkNyarJZFnv4w2oOJ{hE8^v~|gx@Sgr|BkN{8>*k77UmKB}=@Ax3JG z?H(zaD_WWYg~F85;(eu=EasnWl%pa=j?IK!fK>g9I= zfAse1ZrZ#VUDS8G91&o5G6{x!_;8`PxY)R>kgv#TDwlJvY#TErMi;Oe6#N)p)BBpK zqsNZj2U_o)ob(R}*n_muhm&w}=dmSEw04PWetv%M)RcVfD-nw^i~${-hX!9m$^h$# z$|bl!#|qkSdj|%}5wsE&<0-VYwSSK``L(vTYE`oNd|^T)IB&%ydd}#gn!wHg185S@ zVvu`noSOP4ZeG<^oD2ML^uWH!G|lTetXOOuanvg!9|qh5%v&6iS|1w7pU4u~9YG_N z$stgk$@Mk&kl}^L6E;gmeOhww&DA8HaI_vHOIA(o2Z(sgD8N%aFDfcZ0*-#>_JaAs zM2Dohy83&6hw;|aswwJaNX-I{<8&pi^H8CwFG)yb-Yh2rbNqz-YTWo{*RBI+FL7Lk z6f-kFZ?HT&qRdE^GoTaZ^xz(0=J$>lIoy`I+vqyoN z;_XKoh;#F>2HrVMX&+Zj*?s})Lh!MxdiW#~qWW44*C*`DLOKrYK3`rr=%1*Idsblo z{Vv(P;F@+H?pSZvLXD?ENp)jeFR}94(;+L+tm+O0GaOE(oD*YqO)ph7pbVId;>>bWdh z8J}P_+{#cV&h)`vVv1>_SGGSrk3d-Vp5gJa9UKy;UeJW`?s#R{>{I?)%{jmA+)IQ~ zM0D$BGvCtZKKv$@>%G`CRgcs!^K1zZzuAm^3$0(D=RL~9=|@QmwjK4C`{o!aXV!Ci zrr+1EEv(6O{Q6)dqvLE^f8h;GMi^|8x_F>BykGwLQp;j$a_?`ypR4;|vj>9=N5s59 zEpx0>=Gh@zo93VwrWXF8uhOLWZccEia)lY6j{EUr)m-u5cWDk`u3na}OybX++x z(8T5Q{$HMd*TWI6hw`KFBpTCo&Lappqw5}VOdn@<>}2FWRcSHrTGDk3ENY0yuVO{M zXM^kMwWJ>wmuP%fw2z7DJGjF)Ov&fxtPWbeUp@xL7mcG&^9u_Niy|xZE+#Y*+k4mx zt{$CR;Jm6KQX0|zW(Ny}Kj4GLp1@W8i?JCs;=18=)hgop zyBDWg#VN+iM4b101-9K7E4gR1DY+8cBmL?rJrAZ8iwzVAA$EOraX5*31={1%%2@hH zbLs(*g`ZfWgplE}zCsEs0UhF>IF>l7r+Y?5MpD!>?mj&t3ED0V(P*S4otfEl?KBK- zKk=;B{;W<3FZFucWALtxUfRy$L)mXxwU1KaDBAp`rKEhjQt{0s_EX)FkmaIV#$0gp z6~T51+Y@ruW9IV*y=b{Kt=E=p$ad0QK$Q3ep~%L@hB$@`vgx(*sZSC-pBlLpy?1UCe zxUWdyq8LONH$)=-k)-0+oO(SA?v{>)`ucis^Z4e>v0o-6LL7Ts$rq;1@CU zW^z!t`bCvK5jHVS97?4OHb#n0%WMwep8x!nCFHI{U2vqQ*JtB z@SsLFc=6D?{7k>9@^WtkYQYmHG0bAyC7;Uu>VHL0M%iOZVPiZiX8a$)yEAX7VHb{= z9UBiL=2_qt;Ck$NHTH`#Go+~#n>XUki)T#ks(k$Nj5Ov{)iPvnG2f5J$fd}io~DA# zo#}mK?_%cTxhoQ)d-3W^H=iC;FW?2qdLtM46?~G^EMXX#T)E~QMxBJlKH!83zx||Rj8u!*eh34T4M(h!k^x<}aG_EcN4%7r+|T|B zzon(6*Nr2LH1Wj!PdWs74K{4vBm4pGNnNwXznI*0CAXa%Cp)EcOq-tZ+Z>K^n3d^o#3uHGBc1!mYW4vvQii#GkA$ia4f zA3e$pJx#YW+qnKN7K6b{FS;iZk0oL!Y{bMi>8{5-Q@U$Y>Y*(;@&F`+ zgz*n?7Z8k~l1}p)ycjPN3R<|oC0)k|bt*!;LF#X9{+oBBL~+!Aokk+y;CCE?XLvgz zFz|x0F}s3-f~}ZQIfy!ng6%nGY**jSN{ycU8#g&C|L=dK_*!=99+B-iK{(!Pa z{kZX;e=WpmPrf>O$mt@-J?L7858nk~hWSGrft*wdunhGnHyniQ(#|Yp=+1U5_~GE7 zJ}}AP=0gGh{rZTjHKOlnjN32%M|xAx71)OU{%XxQ5*;0lb{=nd>8Plw%aOe5jd{_1 z#aWDw3*{8`r;qk=&Z6(9@8{3Y*q`X>*e$$zvln)+`RK~9F%@G-h@V(lSxG)nI81!< z{*zk0@ZBChdzKbIHT{uDpjeZZG$xWGlKw|oS?^(9b)Vhahxk6nyG;tm2EstL6AeB* zm6y-*tW<&UNUT&1KK<{5K@5#7M+M@?IN3oemm{&d52;vLSV-|D^e%^)|2H=*N3%6G zcJn_GNv!ic5ah-cZ?No35A{yb(Va1r4J+U8Clp**eg19H+Q0uLq(Bq5$M>H%$9(y+ z4F^vF!@_|M7_%zxLS(eG20hpFTml%`8UAvrF}4@;r(@cDjQV;+WTO zT$hRdf+C&-`KUMGZuvz;15;DAzz(vSnlHQ$pA?mQC0x~8=Kavu_d`=tD3TN+#WPul zBg5Lw?^i}S;jpo`v5AJJiTyw8>sj^*fn13K4-i!l@F&;bzsgY582<{0b*OQ<300#3_jl5ZDJoKd zLS%As4!NoOHa;T~aSof0Lym`}qcX}(7*Uj9;)0=SL1d%z{ z?d+YH$iADA->ayoC{+t6-`C$iSHuzjUCOUeMBGKuHgzIHE+MNc>i;JKCmi|6brvhv zzs)>Xq&v@w8H+8}X{tNd07D`c>%)E%tWsH5_qFR{m(xVpX4CqZ%l_m^bez|7Q&xUA z%4gjuMM8^jGHt?|GOq?7irq=({U{)S`|kEDVZbd(;LSw_wvz_UuP<(%$GJ!CT*+Dm znJdJk*mhZ&N2}Obfz%XBJJ$eUN3E;K$w}*4MJvjH%BTTmX&GgxD_dK?TR{Vbc{Nf| zXkK0(>b9DDFRR<`JaASvlv_tz;{qVwn3Uyu88q%*6?LFN0PV~eCB2V62Y86d;9iX zk@RPbMj(fRN@(DalXri>s31OO3GLZMwwX&aJ8*9LJO+6QY>ST9n3Cbi=UlBCAqDj~ z@-TKAY>h2M)c=f)6T4<@20qunxq3kB#tjV|Aqe4R7^|fiBxd)cY-hT&=5!9DKcbc2 zDw=oXK0%Sx4tebT`oeV*B(v=l6qy}w@H^BisQ2$5_6_t)g(8Frsxyt$*ufQUSKAHP zcKYRaD3MUG1rjDNa8w{SNMPLFYL^sRxL`&S@YkR^jL?LOaTa{GW!DREpw7iCmGjuc zcMY9SVC}YjAGhNCczLX(wo=d139af;VPS{S5KOgPf@NY3Pk6Kj&&kmom(;ntcQGA? zUG`r8JkZz<3y?>8Vmg6}1`YgSyZRyyz>I>^?ZH?1E`ue&ZkpGqX{3ZGnqrWT<3A;V z676)%JEg?ha)ntXPh?J|eaDrrK|rao`MWq<5PpF8krz;MaMvv0M>1fl0DDsZ)benY z8g53#s3xM|RslArgm3?msTD#APHpH>BN!YNOma@2L5m8vyzGub)Qr}CM?`JX=88Ci@KrxSTk4U`Z@E~ zK)}qCFcpvNe;0J}yhAw4Et+8L=L7Ly5;gVfd6qexb`$M37#)E|_V!!kwXCMfGQCU=OjgwouqEa`I?& zB`^xu#`(r@3UqdL5e8)eP+YJNk`y%;aTF>I28FYo0C1brZd8A~w_{3O4%03WQGPcf zbUn>_rrpCjGDsR&_jQ|lj=bGSl4Gs*)8 z%&zCU&YPmvUi_(u;ygE6EC{Df6dkRkQ#aGKr5bE&DR`H^}(oX@P8*yFt; zEL|h(J}NRor!xB`IVxbV{uFcB&-dX&7UY0Ri!`l*k0>mSzgOPD8C(CQ%zK+ja|%5? zcL?%?hsm@hZI}A0AmL$09lWmWDJ?S?0w7=mzF#Pem~ZUFd^?2dK=vSFk?BF+qZED8C}sFr+|P4NBj@KfFCGW zHvt{~K=}B9>b?q&5LJfdTv<%)u6L|cF=!C+76&l19D{1wruZxShek$B(4huP%Fx6_ zDtbo}7bd%s4|=ZI?4zPO?BEpKX0D3-0??x1SUprseeWt2rGlO?rcn|?jYit_4841h z4Z~30xCV<)5@@vP>|oVbeV%fd5|swuG;`rxMXQn_O~xQSelMzX1pX#WiHg%AhZ%D2IAMx_V5#udi=o4*_FdhK_-hwD$x)&NgprSl|aeg64qVUxaoARl(*B z9UABVKbrG1#;6X2D;Xk>((TkpJCCpfDXp@if|yO2pvSTXHIYJfXeRW`%*-fI(?RzHD9F3rO-KMpRfFh`Devita-3)KSvxIO*oSfuGC9h`A(lcO`wOgZ_tpJ$I?rm2|1m-y)YgPTtyT*Knyx$V9QEy74-Y%Sj-W= z4k&mamdMcOiC#8&(PhG~Mbev^*WHinCS)YS1_-hZ{A8D6hoR!;z`VO0g&gKZqhT>l3rO}eniQf zepT-3)f~Q-ub3wi1al_zHRr*nl1m_>kThaYr{cBj8rARYZkeG^igz-k*QH@8d%-AQDV=38b&_W~1LG zBcSF9a*=v4jG)#KhLR7#%1)Uy#L2GG;4&lsxy&_`HlVf40kFn4X%-ECk2>Fz_Bbo+ zjA52QrTfVIitNy)O`FVh;?9h>=jNmf0nKLZHLilkL+Bon;|IkqAkOy3z zt+^I2xz1*_eM2;RtCHNzbSp(EVKlD^$Zv$;oB@jWLri6)Ohda5|%-DI-!XmoEDgm#las$ zxD1IG-(IvlYuWh)MYEe~Z%}&zCT)b~NBj)omtd=)bOWdYkre-KxKjN0&*~ZkY(_zQ zUz7-JFfV1*F8>+3w_m##^Oryz1ZP3dWfs6AWMfz>KZD*Q)=p!em02i?)~FFeQLKVo ziD|@4;ta3TG9sOT>u>he#VJDJj0LcF5>BHO>qHp{v->a&H8mj~O<2O+d=_iJA3&~; zklq1g2z4E_yvMQw5q=I6e-_g8UP{Ujpf*{;pP?4w6=vIa?aG-~Fz$ITLe!oSxZ`m1 zgo1>>+AJ0kOzWX363#F}+;7k3z>~@0q-J8eTI#V*C+fx@dR!$2z}~#8Fcd1%iCe@a zPqnU5qPHr9FQ6@&LNrwgHqOB?P0wcFMT!5Oh&-oz6C z`@4syn`J+u2tZ9T*7TOx1|U{q7c5NvSkeg0{~A8t_=Z3_8Eum zTmkkHjP%#cF(tL0A63ByLE`YF16889O;eV2d^t0@Hi%tVID&LD8Nc9TJqtwSAIWNa zoSd8>ilf|Hqx=S}*Kw+8+!9gz`;0ST<_4^H+Ghu|qX}Yg+E>jJw1_#M6xoatsoZo_S3YfmCJco|d~_PfveJcQ}?&)S^4 z=-RY6VYYzx)VL!zHFX?z<*PvN&vMO6r}6cCI-+0#9Cv(;4CE51R!J z+My|Wydy6FZNTvtUX@3}#NU7dooc%FRZx3kcLs0^twQ^UxZZ{$Co514NfeEDh=kp> zMUVor053mGYz#70JhvO`l<)+iNT`%&c_U4y6t?%gSn=;!FmIf8Te3buy92b+2vv6b ziS|%1OR!ZV$p=nqkfB8or&!PXJiLuG9dijHj35R$OT+`&oahoD;teVvgK*{(wY6q$ z{=e%%S;(zGzAjL9&Tw(VO6b12!1YdDX`{Bn^=^HiWLr~0{vwgvuw}$7B0U)HOY>@# zRL!Qz890D<=zC1jo=Y!TV8ATw2he;C`tLYKSR{}>A?YEIeuHAvR_t;H z95^r43`-qo-3We|U-PcpB%bpHSNWjWTg9=O&JKvqYu-vp!0ATR#Zig=fRf;pASry( zWfc{yjr;6bE|sBj74vDwjvWICbU*P@z}T+bwbHBaFmro6R=GGhIC8Hn(qAniBnt=t z7S*@(^hnI8VK#yvCk%XgSQXD-&7rn9(w@T!JqMnf zYwz8bWlO1;1#EqAuGL-0(D-V?Hw;2skkt6&hcXZ>w$9uFz>AD^pExKB5N%jJN&~`D zRW65|vvYnbaM4XTU2<1;@7x)OQH~I~-E8Rzu0td!qRR$U38e@L_*YP~-DCb;pXXI2 z5Dc&eEuuSQNuoW#V|~6wt4UlHV?>lpp?M%llf$r#@JmpNYceyK|83f(xC1*hxyY^( z{XCE?%CJ;Xb_EFihzvIVl~Kes||GZvlDe|19;grnkP`EKo9*n_8Wz~ za1arGD55YmDzFYR31mVhFE5Yx7~_Pl8+KuU!0kcHK)?pBU9-o}rQ1mazd#>OTO>Dq zH>!_>jS3KRW_C6PS;7s%GJE_iqdaQ)#50BpSR3M|pNOU$6zuZ{JZzIBzZ9CVcbXcy z&JId<@B~+V!i*>1z56qq#+bXAfF)WY2_V&35OFZ>7U6E4X$Wok1qDNbf1oJG)*CNj zhb*26Gt5oUT8KV+*TY`czJ5IC1m%#hd!Th66{<|Po=$1R5AyBXdkL470gMtvxxXCU z4)_lW(|4GuCvvM37cu3}AU6YVTHD!`8}n{zPPWEmfm38Nz?NxKQs~I?@Xz&#nZl`_ z(kQ?QMg%}$Mnd9+UYu)-h#ePq)MKe{TZceYz0Wj|CSjH*+7Ivn5Ry&c3PU5vH)UqX zNAYUu+Rm=7{R0Ey$dqmG-EW6QH5R;OW1)zkirE4lsOr^D{BVq#nmSZ2K?#pHgX;j) zn8J0Mo?@3Q)cb>N9UN3%p0iRV{-9!S3MnfIOgagPJ9h}z^ws=qG6*I+GQ~XnJc-cd z5`mmlLphWr5FS)m+1NT3ZseM45V{LES;G6je{Sb^th?smEU$eB4kW{lq=NL(1i0G- zfZddDGZ0dydyRma7M>8JwSRA@gEV=ov< zD2}O}_jeuGkOu*?V$PbkzD6pHBVLR|(1eg~#+iqw)KSowXQh(^yBi;Np4dlA`vy+7 zM9|l%B{w}iy%6nmHK11&Lf`~SP=&fJ6I-7M?eutjh@joi$C~-p(VKoim5oESBn6FG zQH*0UZ&P}T3S1%=r+U&6M`B>8nW%ZW6HojaLC!U^44)8x7|vNn5VH>n(Z6fvdbV*i zlnI+kI!x?T5N0Ap*|{8Wz)Jk|4H56M__$t&W@uJc7MjPN0~o*3EU=AdIHh~x zO$%3SH}N_5cQYlytr+dGJhVUb)vL5_*D4xC zIHC<82m16pvI@I**=uNS#+-TJl!P`41xsIOm>9kg#nB$mzbfbwh-ZeghuQZ@E$LE1#P-F9ztv#PNfArGD;4POzwhOQx zlHnj`5Y!R9+YwFYSJ0=y34KDgBiFcI4E*-HWg9{|&1;l9bn^(Yk>Z+;`+TT{2G%bT zKM0wWbM@PqT6P2@JRpvuA&jk}*97yG&--7%=utPhV*pK+G_MgrZ(UafTU5cH(4e3o ziyI&&+9JSG$3;cEEtd)D7frK2@bt2}95L_|*YISsuZv>KjID`~uiA4@6s>%#g1DiK zOs9;y`hj#EqA0^8?0k)M6ca6vvj~o#t%*24&@8>3r4;X08(xKCy%7`4Vc_$wqFXBI z+Bb;1%^eQ5@%KQllT&Ap=lWvF%kUN~o*F{m7C2aLewH)1Dz4jo@dlxoEiw!qBV9)H zqj?SE)$`=x5S2|q9j@OjHU%lj=an|ga1b$I>!5R*~VDc#~^ZP+mV&Rgsry*P>8Ui6}F-&Ir`>G=r0}0V&RkGL}3q$~2eqeCW2YMBhnJS(Ia2JClzm9;&Pym5k z%PyI8?UHda%DNGILd^ykJlpa;-GKL${Nx$WRys)iPsV9_!uW<_}U`WU(T(mPv zkvq(z2sIj70WQL*;13GfjsYl2W_DHr2xU$DTJCX&hq6uNEZt6$+?sTHclk-)yLEUs zF`x)3z4-H`$>wiS33}fE`W>tJ7;j+OUP#xkIk zJby3sH!tmjrcRy{jW(!3fanT4N<=>)ps?}t)4}UW80RnuQB%V+JqisxHBZOG65hPo z)I3L;a%4$=80iADYp&fa{WO9wbQv@ja%I=%6M3ssnQK3=wl5P#M|Ch}D6TC7>%;e9&;=ucObBZ~ zOihjfS)=NsXh^{Fh9Dpow)$lWN2}9Imw5^q^rS(7%GEiUwK{(i0#wJu`aeC0c;JrG zzKV~)%SKz$qY|E3owNUS4Q!A-DEOG60qnZ8+Vmw^BMY-pn?M;Uz+kM$*-19Mv8?g|H zb5U9yDUc!Lwp!@8-|-v?n^Wl~KW1IjmDkqhYEhoK57C)$#eqspEQGhzzApCX-$zLq zIFV>dpMjdk3xEbgji06BQhyhh@;sZn|A6Q~6k?ek3?RsgF+wF&zbp#OutXI1^Zn*d09 z0!H46NeO0L{9_nlau}7gtkq4yW#CYVz!`SKazL9;C-y~*1Nz>FhC2(rWd?DgJ&YU8 zJ#leyLc7ac*$AUI7$#97bDYc3CpuSj*V%604$4Bj+kH@&P=ucj-!kQ80JWZYul1>- zqN|Br-6_k?d~u>IN5B>`&_#RDwNG+rvS8oYlmit6;&s`hftxR`sg1x+m2QS z;u1b=-lK1->YO(_EBJTuk?Q@&ESgqUY0rX!KB5vdw@(Sq31a(GV&6VOw6#5&0_yiP zBqU@=O5Npc<>UHt=sC9**Dx}sd9{z3iMCauCDWoB?h31OceNb>yK9J(>@Y0y1lVUJ zH$$ly68(wV;frV=Mneq?{9kyOfHC7Q7CR@5>biies6Ynvq5M3jTIziC=n*;tPNQ0e zW{nVo=U7~G{c^+Wp699Y_2rnS6G3r+<)=_GLn69qHo2qu)4JnU1$nW-a6;W_%d?6~ zeKHCb+m>&01VfCajn{{~ZL9101!p%L4l%e#Se_n3AAj94CUAS<1X5W7DsjSi98R5; zL=1;!4HAADM1Ti5>M%-2(CRW_(E?EpOD1o#Jcp1~=r|z*dENyY684}Nz$Ajb^br;s z=`=bQh}K?w%xAk=5lP5+DBJb^s*gQ!qwq&_?Ga9Zt5`@%#OZ)2ei7OMCNZ3aI|12< z4M@K#73)qsIE|Jp;BBJfbz{{EdLZ8R79&Q823VyRlA9VbZb=f(KNRCG!`yU(C*(T4 z_z@tSIifuYM*tI&9@^>AmLc_O(J2qDR7=>Uk?_ZZ3KMh~y0q;`1FPdy_jkx<=B1X7 zBMtY^>~sx65aGjwJz)tlhrR{*dwcvinbsjdLnd3MG~?oRE!!0?u3 z^j_)reY__dDHsYlB&Nyqty=m)_*;GwRRf$^toy5u=;*(PnQZVpaJU&e^L~WxM1M+` zgiy)=iH@nJYf?Gxwkn%G8M4fG|J1oO&v%svhDptzmR3T33N4 zj}HohPdm0{%%mfi3s{`kuL141LrZQvqSUcS7|{C(UXVJ~0K+_Cf+B?27HD8fYxJv= zu=o=OYofDjyzNY*{(Yx8dS%Lgc?eBVy8s<~ji5z96kNkB0M0aWJz9xC$N%7T-P0Iq zqR1dVd=NEF+(E}Nhi?Rs&4ZUvCXem;HC{C~t6+G8@Fp@-+VOqb2a$Q$-K=i0?<-SoE zM{J<7Z|~k{xIt#;=T!(E3t#wsi=**EPfl$~gizhe)j`N0K*X~P3#w$^7hxO}Z8R1@ zE5J3RPem+p1=kYoty{Jvf(It!!5YyIPheDFj)_$!SP}R!24S>d_*K>u^-z|)SY3l+ zT8%DC=AkbTPJljva8@QHGz~kdeZypmypcSIgqr#Gxp$VF$3OuB? zHZ}?X_{tEVYUT@)LLAsf;WK&*07*RGf0=w-XRFwnbUfEX)0aXONAb?w#c712%oD*7 z?8a+)gsMhGo`piy>$tzId2IeTKfij8WtS#c$#>Ob343V)_as$HJ={Bn2}R&c$z*}c zc_X)YqT(`KNRnLI#r)N^ zB`7f@BeosKr6JqDB|1}b5JA8#z&G^3@vx${&DxY!Kmes|Tx! zZ*kBu^$iF1Vj#jX716y1ZnlK+UIsjH!ELfGQ&!w1O56B^MM_AqqU*nv5ELK6{(j=b zV+g3k1{{KdyeuSv|N1OcHIJN$-tkX$>(S$Xy_xvwzZc4W>!A_Q8ej?NZ-?6~_r}X@ z7DE(?(k0+l$JKFmTY0KLy+I%$>@p)r*o9C|d+LqA`{mu|<)h?Mr(r%ISC==28E%`T zlJIlcV?+f6>Cm;LyS^`k{XaTl{#RoRQUXLki=K{4-7v>LfxzYsci zNahYfwTB^4<;@V9<>G)b3j_@%vN-Wg(ibvs@;oOL)#~aiqI7fr+uj5D7uCaPJ!q4X zk%>VvC**z{D15Y~gGtc-%So5*+qbhnp8m(c#s2gtX_W+FT!p#mRo;%BJ3m!cCiHHm z+8FcxgNMkaNR!ds2m%S=H541IpQ$#~pnoiJL?X6+fggVRciMk=pUd7mXeJ$^z^!=R z<^Syh`qw@GS5F7*WcHL5k=Pw2W6u{j(qV=@pLjj*B+8%A?|85eEJCRo>uY(PZhV@9U?m?)Sn75B9;wAdL3hLRi+QJelP2u~kdTEc;o zh_(`FA4@Q5kUm3?4x%2hF%z1J2wYAaRB?Cf4#s(!e?25eJfzPMzbww(ZGz*N>;kmj z=cjLx!7>>k>fW9!%Ek2rY1{3s%MCF9T3LZ!99#W#@6%B3)I$O4;66Ur#|?i0|P;n``@=Wgp)^_JKXs#8@cTQPibU`zPfk4;RM8D4GN zuJumo3zzzq7H^I9)M@wbed<7;*Klni{+1j&fk688|UeyEe3+amM^!tdfnDI zrF~y1D~sF7VOt@WJe8&9Zj%;@qgoq}Lm?Xuj;)nJyZ?Hamguue_;_iWqmk*DKi$nwel?(d@~-tT$(nq2&rbdEOHatYT7jy<<~LgmIcrUt7Q zabxUTx1G=I4shFRf6}F+yKURoUD@5G?o!>iddj0p%7VzE19UA5!sgSWo^~6aQFf;N ztsQ7jwcvk;bx60;EYLNBraBg zE6rui$5e;5i3hv9KI0|fJ)62?*PD;!8FjxBULG-_@2g8_zNEi+ph5nhEh0?-SGk8h@KtC`~=LGklNC zYcxJ|l%n0r+tBYrk>Inm@>l2j@}%URI6`nP8Pev+Z6 z_p9qBymf|5_Clol?hksN*JScJPs)@l{#G;4m9#nM&L?Uo=GcuP{c=wF!l$l>*Ugw* zTMB4=7EU~K9~CJRNzq*x(xT8zC7VhLwB6mDbAK>vYnIi zx21v&xmUAUS?pbhFWn9nhgfUs6*gvmXE>(ca=7c>nsrP+%J1nE!DhZWCgHa=@@-lL z@7x?Ukd!3aFtP0j*8X76L*_EQO{HYllJ3XGRz1H>m#w`mEuO{Wd`dv3fA7W%S%_SH z*fXTCX)P&VXFWgC$i<9GZ@ZV7P+yDn*meyzBXQS9v9Z(}@nRU3)Y;(%o#vYsk)6@z z%#xD9=ek3qzq@WXCucX4T)FCgQ(?RLZQ7GoIsbwMF&~Jxunmk#w%%%1NS0xUGOcqI zu@@q1>d9T$b-JRwe&k&tONs@lv=JlIM%U&i5lL*F=wvcu?fQP+L)z3MbYFn&wE?DI zj-BnioNLl`1s~&|yo;fYxc>9k_Ki3<$$`-;7UJ9Xjib4MZ|wjm@!jZpF>5npVQRsN ztv!W-j{DBq--$eu8ac7?hEF#TKQJ32Yxx)|KP%D+SBn>w9-3tx8}MfCG7n-sV))Ns zbFoQoJ0$ZgS*UMxcb%a4k`h`Drho0cHf6Wnl>9nb+0ggqV;VW4By93h^4Z<8=Tbbm zMks$!h_!pywAI&dBu<*^#I*@5M9xob-sA08dg~SkMYKq?vc=Ne>HI>bT#;b+Hu0#t zWqZVKi#zLVH#WCu|L3uo<3SgMJ2J`r(J#@7_Hh!e-4U?ec#&=Vz&0DR6!ASmF6ve* zFFhNB`^FDTm5@j#Xjn}eM2}Nno6#6M>bnsrF!`Ted2`8kM4u_CIaYW}j-&mh%U6bX z@>ObBwY^>3s75u4il-Q($-%Nq597o});S4ds8eU8n2 z7`}*@I_moqA0gh8TTUu7A!m%6t~Yy`sxsaWp$`=^rl1rjoa zK!cd!*^kV7$}8y1hR2$dqm{WNB~{i03dGtZqvtiJQ;bU(s2a=KA73RxN5AN?tM4-F z!Q%xT$DfVOLIgho)CwlMnJ|eFCPc!&b0k1mQA&Z9$B+Dv8x3++%`VN8+e%mb{gYbT zZr|j-b?$L|wxmhYHq``IU5BKts^ygx+q5=CHyu~+qDz~)x2r29AX1Bo30u|Nr1|r<*q^M^e%|$pc75#VL)_Dm9xns`3(+}atuK4d z;D?|1*znof^##VtbSAcMoR76tZrk)WkS^%7*FN_-6LFQly3HpmMYu31maBW{F9Y`n zlUqi-MxGU!4(vY*8z0#puIyKJVtx4E+d^yNEQuc3tx|JQ+`%$$PlOv0MlqM+NGBdH z9azsn3%4@sp1k+G`I?XgEp7JNgm6S_ByDR!=gk>?;v{kZ-FKcPpZ+E)a)3+o)gISZ zU*CqBOtvu!vs6WVdj8|gn!`GGn6~EEjsx94qc)4s?OUSQ6YuV`aEVv4w!8QBT=3WTZ z(mQ$5L5=D^+l@ox3eQ~smLif7_N%LYOa9jB%l{8qXBAdu8+B_^LPF{8PLb{oDM?v$ zNl15hNGM&>ASII0-Q6K2-QC^$;rp-uVDEh_!dh=Uv&Otf2y6I89X|6X39v1!A_7`? zU7$)jOe_IV1JK4Yxqk)55O^qGH+`vXT#oZ;P*M?8RySQ{^R+|408l#rPOtM{fcz`=s<6$m$md#B~}KMR$W~Zpo47T z=>>EZK*SLY`b$7H`W-Zt!OZa#lpZiAFQQh^D>{1_Q~>G?cx{GWMp93;I2&*P1YhmyoPtN@_>kX|&VV3XebeGXm z@5EB^cH@0o*$La7V0AXUX@lr)<5dpo%R^d6pB0)XE`PmMTQ5zKp~l06c$m{KA3j80 z($35$COOb|$8lzSRyq`wjP(i)AYXQ?I0aLdNkB23U;m!3@}eCB{urRs?*MQb^LL=V z5BO#yKp64DG<#7Vy-Xwfi2}F}!!OIo_w$XfE1i31*iOsBpuFY}wZ)pn9hu zUFB{+WE2b3gkKe2LiShvS10t#ePIN6^2Y9-LJ)k|I5)(%NDQdE$=B$?~ z`?n|Eu8zRhy!MYl*1DR<6;4HeBaRXpCY!7rFBp6$qfBGK;8XHS)> z&4tYp6>mH{#8b0;v&iV$+ufh1l$k{57VGyp2Xwb<6gM&=Y1Y-ARNv-4Rv-OQR%fl`shmZT+m^jA}X}liUo}S zW1Ambk(}u(70|gg+`3lR{P!m?FHDl)!jn$SQ~ra*_L3zgZ@Mx@hq2!}W^HMkpQaCYKlA^*>r(nOO}% ze1uQ=Y59(5*3R^&Su^G{f@vJXoqXOXqv+gq-p$ks>C8jZ`UFKszFF%1V~<4MMNE}P zecJaRE%S~>snyB5r`jv&lTV&~3l{93@$xd^T-wzw_246Q>G9@$jv=q%X-92MpU=EA zDy7+VQ~#)PHb2nMs8lh|MA8^4*iG{W@?uB&pf+lVABL^yPKk~}u&@C0uKD|xhL#|Y zJ0Dk~5rq(EM$)GyxVC4`M`4RsGfn&6iI?`SPuFCdP0q<9*eQ=XV;`ll*j_jS z-SSchPG-Wl*iZS~KE8poT@Z%5PaD3&PZ|dI#Nc^{8gKmh=VmH|;8;uJ;gN!hh`xM1 z)Mz9gQN#9%__YetUr&;!-dGfJqV6>xSaev6P z!QmuiU)<8SMo%Mq8es+Fvu>*~-h&p-RmWaY6S(4eYr)2ZvKn9bwknoMWT)H+k_69{^|j93o5=^CHP?Ti@ZtYh zt{9nUGc9PFFSTMJbtYiKkh zw{=0$rZnb?+F_~r4Bv@|Px_|NYY@XHd~H7^U0IQ^j9YIuF6J($VJ;VkK z!aMQH693oJt9U}V!QY~5Y?c@*SAQtHdVXdB&W_>7EvP?i$qFcs)^x~{ttpS@#N!Pj z*T=tIH&6GXV5f`7%$>(}q{r^t60FN@#r#P=VyWT}m%*eiYi((g>?!8kXgoZ3-KQ9bJ-Tzc%aj_tw>BsPN8lNRV0F<%*Lhc#@zT6Y_L-z) z_`VQ_KMcWGo~;tVIJf%QNN2A(X0eMvY%OmmL2oD*yz#SfjAUGKweqH;!GeHh{l0K9 zSB$qO>)*5~11<`X)pnfW%6#~kEjfpS@{2QTEHZE091mhiW><;->Fb?p z+aa`!05X3F?!VLEK;6gryQsf!p!5>nm$_c~50pWU_2<=t{6PiOyeXZ?Za*mj^%E9b z{ee-uNL`ZOH9^X;2!9&?%UAVSP}v>ieZVZvM1L4Mqa3uK=4CG#%yT_5#=<|opNMTW1>~1T*}W9u5GjO!Y1wEJjXNVadl#nd=hlcdkq!?+HGIQG+|^n&~1Y zOzfM2!>(m_v8UYO-Jv<|3jc~$JchVcJQxkm6V8$T7Gn^NwXs@k8z#aBri49B8@acI zx#EWed1DKLJW|#*OeVox(j?#Fof+#ecp)Wsb~b(SYtAI0XyEu%D?15JO7~WN)md{e zf!nC^avK*z(#JmP3QG>+GxLHZZ&NnGxYG|c=spPd3yPu^?cLN4Lfds?ORc`Cc2kkbGDIyfGVnM`sQYdz8TL{~>e)(fR5pz=~-S!H$sFH`P?50k%u9w?d{c}1i z&I%15b*k`6gh#?KK#6bvjTd#o_9@mblcSx_{t%AYv}&d65;LAvJ>$m{TabGQFIA#{ zbqVo9BB`e0K?LMJAwfTQBE7^~k6Q?Z-X1Mf3G0`fro70H^zS}oNC0wxs0^N36T+5*fLN6R|a|{sw$gfW@J(`Os+bSTv4vSnh%5aInXw^)wc%dRp*n zM>_@;mg~(P@m{$b!@Wkny}2>dK*x|E`=N$K)tDQOn>uLMl%Ku@0IHv#RT%D(5G#!u zVJN_C?HGeil6I?9-}64w=c8G6kNnItiHix z)x5vCnI5cf0wZ~`(4R402cAoOjmYdL5OeDcbN1nJa+Be0(fx-HI5{Zl`Y?<0%kL$Z z@QxpOMdVE}*SWsu9L+fMrrISkJgJA`zYz~L3(XOS&C;0C-)&wEX7`p&G?D(vXC{I|1NT^blV;673rR@YG$qRQqO0$aZccN1#1N8?=DW}TzNWj znYqXs55NxkKGCs!(!ZGd_Ebvx`p_;EODA^wB+Q7 z4YnE&1+3pp)?%{dKI1l_=%sz&>C7y6 z&UK$-@}ZtF&uX8EK4H~)B;;}m`K6F`&2;A{xkQy7urWE^5C2HG2~2=x>S_l0FcQ}r z88sM9|QR~hZsmq3BLe(HK&yEx#MxSF1L{6?9fqdf-Mo>V2gEb-Dbg}`ZB zQDh{Y>-!YLLr+}A(U4GDV&a%S>X&O>1GjNh=6BFqmnpp^ECzmWBsQM|%__=0%hCE~ z0xSFFaiQ156DFV9j@?WzG>_NjJIAXL!_jU*qDGJJ#xs#IKN8I~XvPGi%lN#zDb-2o zqm6NBaA|Q#3eONh@|Ij}_Guak(JzjXLm!24U-UufW*=#PJ#8!gO=QCO!$2(yPyMz} zBZd&h^hQaXbw2{6?CVQ3Kj$8qPju(=e4lrYB^^ZD<$d_zPv2xe;6d#zc3w;GT>XQ) zxj`4?6fh3tJ$!1-Bi-X~!*sv^a}7ruv$(Ml1|tbix?nCnl)Gn=qnQ3RsdnFpnalg? zbG3)X2VS>ZGGa65+{t1^qWaj@u&L4lJ+r&z$uAeWlnmaQVSfmFDo$3!T=ZuZjI<~S zID$NaC*C(vcM_s*x1A%%N}R=z=ipC2z@D?^FB{hB*1qSCLxW9wMs>=wm*dp5{3p zH`CY{cYFb<$Kv?g%?MXc^E>tn9_D^&Bnl01pL!aPgEHb1C6eZJc|b%7Z^71lm^IQ# zD<(x8o%T!=n!11Y6m{y=a_RVqNVi>h{JH#oZV}EMZnMrd4~sFXWFsez^z_=y*SLun z9oRkOdEZ`1Bt-oTu!U#1`9!uryWp}A`^&^lPE0^7RN=cx_c->&uLa8cjwf`{PV?Cd zIHCu{rr#pB{*pLFeL3IXmcuyAK???&^{0JTqVN98uKGdYW1e+=%|+21dW4kt57!^o z6Qjs2*f-{r(g%_A5p0X0?ew^mfk@=YUE$8Kx4c5w#P1Gc;LYX!y?Y=)4Z3u2!lHe&`Qwz|ZylM2wl;l) zt>5B%<|z+otO#vt#N#lCB(iD_tK?v`u(~V8=wdx3hOyZ|C)qEWch3{MM*T z^oVdM-Nc(Vm?a*ZZoM7cU*3LZ2_FlpJ3d@K$0tqaMQX!66z=Yv>-+;9b{|ef)-ho8 zwaRk(-rXv|`Rwk4p1$#8!g*&6=|rQ}v5xJ%*dy+a&L4KE%9vhU0mX3oZkxw2OIoX( zFPDW&A<7ZboAfoY@;T$Pd^y{{@p1g(2sxgyb;QYhgdZ;JE~~L6k9*i4%OqUFCJKnn zMPSB|^@L@2HL@&ZO+0?i?Iy0Q<>H3#cs(pxFn%hw^P1<&@xtaiO6WNsy;46!^Mp_AL@Y9=5c!eoaw+~$4;AH+7HXz21?ElI&zIU{VCOme z+Mmd$uxXLB;Av$W_>E4PCodQ}v|t25T|@cooWersKR#m1p)+^?WV+B^h-${Y#yEI8 zv?lb;ezI}XeVJNUq7V`Eccij^G}_u6abFanSC(LG=69 z?2;DaI|^+eR+15PtL|VYvF1bd^0|A7$V|T_YkX>fX^Z9)2W>>k<&Y=_(r!yseOQB) zGFbO7w{lERu57Q;{UxKA*PzP~&YF*7Sw@G;-%ALXJYEW}>en^oyrIC<b|D)BXs7)22By1dqal0SYg_)(bXvkrWWDMSn_ zBMJA4YU$^%A^$6w9=;QZO>xi`V3%$ zmNAm?-I6oXWpjS>OXdW+L}*9#=Vt*Q-bO;=6NUZp9a)({m`csl=?l50r&~#!;?~t2 zI|*pOl!eS;L@zjte0)c9(sOJJ^)9~~57f{{d~ktr{=88`?Nj~OelvuvBdVO44f~IY zPER&ZRjkV-ewv1qr;T zs!x4S&0`_d0nd+E@h{34eeydU3^_=jSjUJ( zqaix11u9)R_?X_L2ZI%qgFh;5(T;08xUapf#eTNEfhxou*MVr)i7p*a#2Gxp?LY3> zwhv1*w7E-Z#ibF39Ji=?3eo35d>sU#iZXT5w;74&`ej7W^m&Ia|L%iOhSld2{N`jU zWrjBuM!+Ari7VZIsJl)H77^lPAJ$ah+O+Hty`$>O*s0DY+9vv)|V<3-ZR zO(yT5G9|nNDo5%?#0&NFg#!0cqzb06cYNe3N)sB^iXFFRtBr{o9O$kIEiRR6qArgL z1@r{px;yT?mT5*L+01&#>fnz|TEF)PKNMQm#e>2JJ3PR}SpIm|c#FA;3EdWXK4JSI zG@xSh0H?=oiii-86zLqHvG?gtyB;Ku=67xR&9>TTa@E z9CJt>lh~~cm zx^}QL*9JDifz-DGh!Cv?d;VjXzF&NLj%dI|C|py#oO%;XmTo zpsK>@g5V^+u3`UdJNUlX-$=LwzoP1UQg$z79)7JMY@8BYo3Fdpq0WvD$H(RpD(peK zAC(^Kx4<8Mt+^ut7BbfpH1t*@xR(sTy21-O21uL1jAWPJ#&u_m+{oD2x)y9<;V5^x z(&H+WZyl!gwtTxkalSN>A7qon`q8J?`oUeUxuc)eF8~gh3a6HQzNyH2D>L%QGLj^H|oZ)590=S~8tH zzP4}W0mUwhV*^Mdb~j#mcM^*1jzpsEM~>)noNiSO5(y-KO=?WM&OmP)e4LKrOBm$K znG#vRW=|>`?2DvM2AZuK;8l+YI72TI{+IoEz@Y$o#245OzYQ*cPJk_#!~99?XP3mb z62+al?*S&tI7`px-cVn;2_nmiY?UQxY~qehAtY}h52;zA*@A*)Zzvi+QfCHtsuo{c z%9ra|GgxWSo-o-qAN!d?@E?U!g1G2Upy{AMp{I6MJ2J%dC=%3{38Jl2@?tQkZB(Z; zI}Z%T{xbX={pD2`W3^hOU&>~u!^HojAbAXTjB>i|FLM9n1ROCa1|UhqJTY6LN|Mkq za8$4Ve>&)H{56$vhQii?Q z(|-syHW)~~0R;&OutBv+u&^Y+dPCwom~@|jRj3zQ1&~1kJ!meF)^>Gu0eJQ~Q!N0a z;ziUhi2w^Ns2}n)^7#}*Ml6SX9ws#;+WYX&yfrG}NQ5QlgaX>vnhVZHl7!3F?<4nr zt@CSjPN1GTU2TX>z}KYDNi9Y<)GtkAEfB+Yj&&b*JAFa8`AgR&bIh!n;kw(;lYa9S zHCoRag+Xw83kt_%b)A_MbC>YLwd~?Kany7(3}2hqP|5>XAkc%3uY;%J24&TGkEymLJGIEBACBu-&l2Ns-Up)8~@cJ^~qDX+`uJ_EQZGhBNSq$0Lt_&d)M9X*7L*%sDw=0y$;lvGjan zrttC6^y4R2ITn`H`}5@-(a!H8%&0mmS*6?|+$6A(n_u*U)m^{rY8jykwY8s5(=3;c z&=9DH=4mA}>hM7ieq3UASaxyda~q(!9Zt%pf3kP+B+5A~yNB5T4ri+iB?<3Gn^=Pju z@Jn8ieAygXKNPfcMFKWC@hT4u`xG-aBDWUSzdn_&-2dF9%IOa869y7#u)iV?HkiP| z4l25^m!(?jivqaW^C(r}05~)Oe>STbLX=l1uf+2=J(^q0h2Kq>_=Tt8Z8?B@-J7@2` zYzu!wna3(-%_!Glk}jEcez80+n%>mfzI{wex-Ql$dr|zjbRQaBcQ3}DGbU|Aj;XKD zw-*;1^!IEA=a?_2?`ECh)Tg@;I1P-^u>X{p`k8lg#PhPhZvKQnb z;H+(deJA*04OVb8n=uN5-S8JaF>ueA1yn?!RCzIXZUSpZksiqPNr{g{WcZZ&g6iw^ z9ZinUuY>6X$TP^noE`S1OK?_IBAL^R@o(^M<@1%swglSRbO1fHj$Gigc>TYP90gM7 zcXd|=J+&mG+`6rzMdN3OBew1bNxkp#x3k6bED?F?1K*1qp&eo)%YaUwu;L>$mKegt zx^RaVD^KNE%`d%BXDO#-kn!_tds}f@`&!9W&?lp9g4xo!-oAlG!dHLacJzdF4cyZF z^M4!PyjuUJcvb!0?x}r#-S2t^{hqY1Sp*~6O5keNSUy7_83;j=z^WqAu+v>`bIOleS5|awxC`#TXJa3qJdwP6{L8{-o>PQ zq4&Q2Ri4W3oT+&b9d>YpWQGHI{(3bum8NehoLLDo+2y|KS}CnB9t(tZ2d4u6M1MKk~}78WO7?&?HAI zg{BQJ@u!Yd^2dFarTFcIB`htq7Vkx{FbJM!=W^?NRW}bYCeJ7Wd<-^WKc$1GA3 z8`ta0^D8)s!k@>m6#w}PoPhNUM}U$6;f>$rpnP9m2q?yZHs31hWiJ~nD1e>u7hXSL zr?GuJJSS#I)f^MP*@uPlP(L&w1O#ey5UTf#i`bISxd=keEX^M;7o3Poj~Rn@j_h$T z({!zxN$+Gzxst2gF`$}@u4sO$1zF#M2CU&6=Ahk7W98M2*1xCO#J?AR7rJBEux!P~ zsmSmq&tzT)vS z_&n*eSVyc37?v!SG2~`V)@g3>Gd8@3+y4V@! znP&PP_nGcy<;WS=i0qI652pCscVh*lfm;XZuxxyV@p$inIVKv~@2ZhayYMJAK){@lm+cmxX_%+}C zr(VV)J?NFqSFGo%QRZo`0%i((o%dq9k!TV2i=Z&Sy?VcEYOdKE(O(9y{I7MTftY`v zQw^osMJUM>LLCP*wu3Yf%;%I)NzENdHf6QA1@3HitP0b^xh+GbM$h?3ZIb4d21{xh zBEMEdVkCCSvq2*9h$lM}jIG{qBUpRMm`l+YM5(XCc;`O&d1yd>KXm#pbNXcyGwJ}x zO82YjC!@;ikr7=YJ;@}$A44=;8UGL$68(rC34E>s(sPRAlDDQJa?1BjCrAE~icX~p zJEc7!4Sm^h_Rv;k1y3+y5hyCe6Vd)$j;4)yz{KSUNj0vU)V0j~i_IP>0AF%*OJXV2 z9{wBrPZEdi2!9`*U1T4+!@W)R6vO`SJJd1Y8>-S?fVu1sAP<9jw!CU>{8v3!40+O^ zAboNR_CL-jm=CS|e)B-F%o1kSDcmog;g~Qx=<0fVF>&c+#SB;Tc>Cw=RCTH=_ zy%@n-ta970)LoB?^xdl8GS(W?m$RqLZ}a!LAIeVcI8rmqpUC`r{#^`Ew;8fM-Swi< zj5LL-jO7&~P-dPZ-$Xo{Ql?&Lo0Fr7%wRj640qG>WjIIFnfvfz@{hd+vS%cyqgK^Mbm|h?fDh*{ zjj04F^oBDfPTVHJqeXX?p99j_lRG?M5J6j-UcRp#P1$;v#VN7}UuVBDUADUx$&tjZ z+3Llg6p)oB9guQ$%>k~%U&P;{YPY}m6H5;ClR=$y1Ez95OV8}1Q@%$d{MR*T-Ey+U zmx5{CbT07JIk)QHPH@aQwPxA3w&)DVr`JjEu#}XxF)a~p(}?bfSRRoSNybk2Ev0=T za47CN{jb3)$D6CrYRWs8-B1>|whQ9Pyfklj_wN5X zV>)R%H#~dmjsL6{5}Xokz?{8V%k%w{rmxR!7K&p}(&}NsqkCQyD^yVpjs20z2ytOl z#)tL14@tKk-l#p&`eyw-5+gb?(mDRf*&ed)79V8Qt!`+O(S7PVD04>G4%S~kT$!y2 z&V^0&cK0TdZQU}2j%-e!{Fy+fn&H6L5FT(Ev_FdYd!Z&YZ;{@0e%VvDy+?YAIaQ(| zYI-~<$$Z?ax_-BmHnuLV`;H^eGeIT^8{#@AznM>(v@B0qhX@ylwkVd`T5;&K z=;rlA144V{H(O=R30@arXABn`ux&Hi(xI)GvhD4d4%oT5F>o6`1@VW-ebSyjhI`AZ z<5`BEMm1{;-<|IlV4vouX1h?sj$SiJt`peYcq}$hD06m*1pa1$Fr7?>^N%v5q?oRz z+p;>|eCJfACp_rtWERA`{x1AY*u$?(I^^X1-sH!b#~W{cH|5grB;Nv>d%t_Vzh@|_ zrCFSEq%S@CjsK|)%>N}u;^7bLyQlB#&3!H>GcxOhLaT8jkkb8ky-%YgRzQ5XL_PtT$wDDacHb7(3|_>j%Sn^ zbl}#V67(a&ZXFSNOV>Qo*Gxf(#r75LN4K5%;#5l$9e7@n2+?i%Ta`^{9=BbCY(Z)A z@XGOhsml8f8!-G#9(SPn$EiSm`s;Gfuu-_ZEThwiT^lQNs3p7`hIy}Uyw!1>n$*ry z_|0yp-o$^GP|sBSJxZN{_l-rT2L80&tnTquugNt2N7CP0MudeFjOrbz0&2q^*q=?g zG(^$T-c_tz6GEYQ{w4gFv@q=X_F%iqF)E&dqc6;oo9UsPN$B_^Ri+JGQR#VTsru0@Isr53vmI8}2QHU{Q}Bs%O2 zkT;<&p%k)jM4CJ^=CFH|N_8@*ciz>$!HfnP7Un@N=}N~SXT!Xt_R1#jc4YCacJAr> z5aEzu=y#*=j{_DQip1Y0Be#nwb)f$~Vl8x52pK?Z_sg5OBir&?e_<%W`voRZ14rV_ z1Zj=4U7Y=2pT^T$DL#Apg5^8CN2}WY)yM0^hnT)>)i2<5cl+a7NFnTVnTpiskNG^h zAix)qBm}01YPg&x;?RMh4&DWTe=T^q_Jk~u3rwE77 zb)DsF75*w21|z5G;(sqRD#X<2x<&Fed6D-zZIstz2qz|AGwBVQ4D2>!f~1GmUo_wY zTb!Hijpx*oSqC-j{?$N4_Yv{B>go+W_kePAb>lg&Z+(@c;XB!;b8kMJ4=md=%?h{N zKF^XlEoa#`Gd(&OEOWLAU7r(YeSZ1P>E}C4I^sf3*KYvDl|HXlAHhkoqM?JsWg-{xPyINWN=$)&W1A~i|Iuy-0gB|{j4Xq1R91nL z-V{SCA+eJ_gx9McrniFtx?jksw)Ben4xO8GgD7dxxz_#kE-+P?Oqxq6KG#K-f!hIV z6+#dZgfsbhQD*XfAVX;#`fWG8rCAF(P1Y>*+qZ8-VJWGFgFT;G5d5SY1qXnp2TKp` znhvi4e?g4cLf;}WtSkwzCEDCbADS&&cjV%fP)qsXgFV73lNe^=HC7-&uoHeC1{93` z#`gAAh}fcY`}{Zw)LG3>@w&F(0jY0@^Zb-FdEx9qQtyr_Vi*CLEhX!VG3s^X z6%7SM!89^>rbTvrb97Q>xOlF#1U3Z)%3ysiB4L?FW=F(|f)U4c_kHXDwwQE0e^sAa z*T5trbX}gpret}Mq;V5iN>Qp{e8X-`havOygHHIOEW|5PBz_@0v zj~cv9`hq$8)zwoFruW!0)grRDIvw|53WnkQXrBJyjlwNGy{s z#zTf0FCb2m;|tbqn+B`K+G4rV?WXEJdA1ge5YBpKy$OanqMvr1?GWtdi@EefmSKtv zNE0a7o~d@wn*KijaNMDrp~ajN87*U?(okPC;rd*Egc{%dBK`A|PNv+a40wH3 zYHsw?jX_+3)2VOd3!DR~ta^y6N6LD?)XN{0$gf*6x?&aTAr^Ex0%R&KB3F9<?d1K+IZrdAfE zd~8BEin|UZ&QRRVv1GMkQT5m=cA6*_C^wp%lAz`X&YqI|mK-uMRfX8{U;EjKz@dJN zy7n4sEqIbFm^eMp&9oPMz<^vhET@&*M{-43hak^lXospGRUVy)7ZwXH_WHgRyJ!fr z6Ct3J4UTS?w z&hj*86IykPl^LS1V2BfAhj`z3&?pd^TLozl%*mfFFCH6AWi=x_CE}quf8z@5r3U0`8)yJ_xj|*|Pfw(yZXI1OY$xbrX;E;q@!Q!r@g>!mXr>LGn=GjIGnuO6I3 zkR6c$TJ=Z<69(;oo}z_pPu4?fdR8R#l8^=V90Ev@;iJm|_xCM_5%tV9S;(A=ok;8k z+J?20NP(-R*YoBY4l;Q~C+0dsK}a|Ulc=}Z>1lUyq<+Mwyv=oG(j1;g-p`~7tvU0f z_Eqj_e71Ee31?iwI?j=;5f^sqXHS^z3*0>j39zc|a0#8KW|3`wurz*);wqIa5`AYh zS`MT5%TU)yz({eegU!1;GoApQUXd4+jEBCjP%U^!Au@0rC36YGgAA3T+E-b&P5h3QxGG_J8#s1QC` zZbWtKC@UcXcbV)ZF2t@e47V~TG&-@ch>O-r(K`3!%xiQgGK3T6E^J~DV_;y$?NL?O zVxu-@XD^Ge0e01}BX5Bhn+4eJ_7hTg(i}$Ya~<4FJyUKLG~dv_Bsw)U)UqKwlAJf? z%cvV3WkHP~Y3|33Ah;r7UE7}G2%%?MPK;84j#^$D1Sjhh#*&~z9P3dj zvLX!uq@plZvD5cgA{teB<^%iw8@%^LCeqDadwz6`rM0aa8yHYM)x|9`Y9(q(PD-rY zsDsoHJ&|apXvgAz=UQyqLqvlua3b?N{1#TN2^61svdE;!%j&{G5D{W`9n=}wPNSXR zkKMi#LI}}|5svfzC(ce7E_S@X9Sg7T_l`u4YYFJZgH zfmd%v%AuP)H`a+#lr6sl!`?N&;sLQQd5E3p18;zAHUoW*wr=qkh;Qai~kuGWiw~fQkLU)330Y$%6x~U0%Tq(ZSe@G8* zryI{pc&*=zC6;-`nS{fYUxvV@urUB3eb#H<>1^xs_Z##7OPBnIEIC?-KslH0ncz>p z{^hrWkjx_e2>E3&wNJU_qFnx=kD*)7GJWxDD5WUK`Ql~S=qdRKaYa9M+r)=oD-_?zHx6jj9PxMT1Xnj^))%`8s;=N4@60gujQDx)Qw#EytX^o1^zjE^oOlecEvuEr-UWcb?ZW>h~D z`@sPcb7v6?*-#rcM=E<_DC#aS&@$cYAZ#bD9PU@k!(Xe;Q|P@$}oKs5J!cH zZpp)Q%ESkxlNq3cxfFW_a0uICvo7Pd%}2pw zfN;haGyo_+y1dz4%)~|_z($lkq+ej)C<9_s;M@c@ABzu?~7ujb5%t+gK8e?Kez z5>c%lP%jG4A%*2@TvZ9SP#O^f)_7j$DwIb}qDK&tm7KN95Lma{C#c3R%B7|Q5le8l zg);r`&L3OVk5P@7dmDEb@&~MUNRVvak|mQ_nDh0YyPO9nf$8BA}SU#yzKeZ?`g#kg)AZ_e5ZNg_wz` zD_lD9(?G%DeSgw0LbwvcYOv?SzSGyhHeUOISV^D|h~&yPG{DZ%_ybqQ`Dg(_zqYvS ze4_(Oh9#>o=Fju(ViT3a2`tXDT?I%nOEE9`EZ9Ppv(d5c*z?OhhN~n|yX-A2#^~PF zxVffto&8!#*vG!{b`M`RY3z)WTHORPX$WQYVL{CQ4;1&X^H0a6!dv9B>t`LEi#bhSrgHs#aS;y!R2!-Q-VeYX-{RwI9*HX{lq$CWrox{yy&_?RF@Rh* zWcq9}alD?K$S=gHgio|B({dEEY)}O0t3XaWwG4}5^q*E)#~H?OMuXMm<^@AJ#lBq) zKqGaEsZ$Z@g@^_bL`P(~C=^}*{#o9k6v$`2ZXqhkLhJ(%`Oa0qMw z%ddQZD+HzwFP7I1z~53jRZVzYLlE9_amkAb1LWcuB*le>odjIQ_x;#^o)%NgRFkfr zRZI{hvZ0no&d!Si6EbS`$UkUEiVV1jFvSMv**iR=d*qO2Fz|*s%4$f z)Khm3D59B&Vm9L03+zR7V3a+$a`HG)rzaKzZ2-OA3`iHpfsy1k1n5nF{11o0JTvp$l)6!)mm6Xr=SaC(Yk5_AJ{AX`N?k0 zHuuE~>mB4vJD+kNbq1P)LZ$=Tl>-kgRD${5MCE5WBv3-S*KTFwPGF&=zdN|tq_%OX z&qoQK9E-}IYK2tpiU83ZQZiC;n0}|3r||j=Wh>u5Dt}Cs&kSo@%eFMqnc}w3GD~)X z=nUL=bwoPiARgTY;|MX>gwE&fnsfxFzn9Zj`e^sBau7hW043uk1_9R)!0=YLzt=?QB=c~W2MVX44xM-2`yPrw? zttG=IyNLoG8WjW@)lOv8k5mM13A~mUodr3?!GG||_=i$_oW&~%#|jTqX$5n4-(b=4 zINiSKckkyoGgtHQQ-NQyCO3{s`?`tkeW>^zy5Q1L@H;&j5Dt)g27L6go-%Csb<+kXT0 zrqS)ZXa=4GNLZiS8WVC9U{~f%G;_^Tkx-S!nfEGkhTr~mOnVP=reCGSOeyt!MqAd~6N8tv5%{WteS zOkqKskE?&p&WyS=dGG8O8d)(gz|X_gBh0OTEF{oC8YfNA% zJOg|Qkw5(Kv=C}utsGk0^8c0ccRW2`&AfFwE}&C7F*erd_-h(k2cNREZ$1eXD#vkh zO~Y&Sbi=&#OFiM^Gd3cFc)FcP@y6z6OkA8efOxtCX#x+BB)kwlbB2F6s*%GFS|vgn zrE~S?QbC&C&{IeDq1?)HvwKI~MWjh9K;?D50557`woxFIU^7{IU=m>F6Q(RH5q?rH zhNZU`DW#MU=EHSR^ph*su|^KmcxLN64NeL@b2qAK)Y_(udIoeiSm^+M?w zs@?^%T?LOVs}$I_PF)hy&UjR+5t-bTZkR|xkMHVn8rjMgvraacjVuQap%F0KYZCvE z@>x=m+g>YM<7LYy61KWLFRX65K);k!-`y8`rKb4Gol7Kn&yXZFk=Or+sI!jBYKyx5Lq0T!0!j!fC8=}>Jb=O>oU_l~Yp*ru{GFk#4P83G|6+-M&Z15( zx?0?F_;xvNxOL^FK|xs0AnPq1d{KDjAcA)9?@z0^n6(WwacpJ#DZ=pll3&5E4lawr-?il^d) zU)_N(Z!%BGD;ank)~ffh?EdbuPjX?zZ+ljFBhfmP-Lab5cIJ0QB4nF%w56IZQ`(VK zeX^K*gTk8Sf@>14=vhRg;|DzM6ny4=XPA8c|OjcdO#W{9x2pWr?q^Y>aWH<)h$>Vc#5a?pL38t zrrg9f#a^zaTN_4haZaG69nj*;bdUaqi%8I4P1IL`NRVv#Xi>OGqarGFz9)$QcMO2^ z>Wo?jiSe(v?dd>54G4n%U@}3?poI^gXEOf4x?LsH{H)CD2Qjl6b{~7&+xxzUTzNE$ z{ddCrF&25wgi|-Z7t!;_CL|()S)U(AB{lQtd?dH@pdE8=&1@ricIV;0NK#l&rbXLr zP=Co4My%&TTl1thHls|Ww-to~^p9Q|-LoKG{uSwa*2+l|@s$e)iZaSKdxi@3!KWe< zwgv4Yp5`iL1;;Yko0EsjE7MT{FJ{n>eXLQjS0+V0e*0M#;^me;7=l&3kCu8D`Gr67 zv&3`y%#f-8cz*MhUsyc=A=R74@AD4?V@Hw)J-u`gt8X=LUh~m-j9lo)%RhkZOKfi7 z(`FX)ucc)CLqgh@T7Ue%Z!e12UQTwCWaDC`PW`m%mB}*?5W+;#R=CUWlT?lB8i&0j zV?!CK2rdtl3`5d}=^b#AX$x{{?maTzeppWp@EPuJad1UnXzN>a2;&U^P1Dw1v18S` zIXKZggYGM_sDj~*q9RMU<6Tds(frDdFpuBE%n(y|v0bqt70MVX+w*cUm z4)|4tATB3X)46xlfQ`EOA9u)%oHMvdY1UG;)^+4v#KA~e-RAm@Uq^>}D_hEAlauBy zU`AXZvmIf)w54G+Y$7Ytg}a&RC=wB=JT~PIG(4C(szDoNPgx9H%4)IqWW}UC!`XNG z%s`DZLZtdh{cm%4_G<*P3Fa4CN>l?#4(L=}f)-QupPVd%f8Q~M>Q;-msxO><8zYlW@QXf@ zK}Tc_1vg~~FE6hvfZYrvvWLHy`&|n1$q!o|-JeqTYb+Lt%{6^=+m~G3wPMj*D;#d0 zzj~WNTGc!AU}JdB+Hm@wuDprGqEz^UhCn@}l*_&9;CVfwr)lopr@g>~`AO)Hx^iU1 zK08?9P54}xyJr&NWKZTZzu#?pdoG1odTm!$JEV2-y5Wrdl2jF|6FW)}G^CIGByb!l z?)g){2dM{Enn;e|KIA-#=Q3J)&Je73g>L*RaQ|IHjC8FxOtrpEl*YX5IU7?O8fwU% zAxrHzC+r=V_-2(-I8mW(=$)Us$j84szxDb;!Dhe!F3Uv-QQ#5NMp04-9^-r=6KL^Zwqlv+eGMHru2K3Cz-3dqA?dGa5A*ODLcMen2P+QAgN zOS;TH&Nu6bQWPRney-tvj4T+|_lQ#eJq_k&o_{6#N4*?7)r0IEJ7I}i=1V2x!Z66N z5CRIVRCg8TNo9ihCqtOL_hP(*MvP`xILfH0LJ5#po8!qoW!IZ;ClMNPUZ+W zS)5iY5I`mR22xf5mq^pWRX_k9psO>$M(~72enQ^ujOUzzJILIml#5Q8NaM8z7r|Ev z&_r8|9nK~ zk2XCYvUkAUebv{w5JJb*n7es^$3X(x&<80ajj~Ec9|!;7M{f>e+MIubQL%g9B?;m% zf)8gSJ~lB?9H^+_jHU`-At7atOFc!WcZHK$DiML~|L*&%A_5V`x_`V2g>_c^D*oR^dYkV0a&pA#6(nV3Gb0&N3o~t_OnT!iGr>PN|T97 z8}rVf%I9}gM~uMYrsNDu^waJ^{-T`MlKE*2eN42Oj(`@0ytM0q%|*Q;@*lrD@@-hL zj>I_OE~>&WtP?H4J0*%8(^&Zj*Qj4e_{`FwcQKVC{MvA1g;J?#2`%Wn?CpQH$nH_h z;;^92p3NTKQuwEQIQNhebNA3X+ASug?|P!+ZNWx8sScB!vfYQDcTw?=G%#8Pn5l`1{JD;r)2LZPwFJRBTx z>+5^5%#u=4&4-RZdq1nH625seji!3x?3O1YEESd;^%e&O5#9?%mb(nDyzn0k23~>; zv^5!`hxt8$s4SaXEp^Mg3(cBS5CqO-IFw|f`u_j^0?q^pp@^=-28g?cWq;Lpejp+$ zT1VNZlMQ0Sr%6f_3jn#b<&X`8{eJ>$gd+TGYj}Eql9vmu!%ROpG$39tY}SsaHp{y_oDVnTVImYP_9<^}b~?GuMB zHh(W$wy7NqjtYloOwNs5u<6s9#iLj}`%rG*AjR#=>h^{T>*fwV6gk$p-+9R`>Ke6y z;ZS!8^DJ(`z1#<*sSS)hUtaZde5!m+?6yu_OgK$*ARI-m>OK)wm_awS*c4{}=fGq@ z$VH=~#&t3#H2(cS=wTniT8xrA6e(6)lJvudV9r(gPW0hs3-N>B4sFhJV1I3fUZpE2 zq>Fz)e5K5eGT=92f%RGX+Z^Bczq5a-5=XqrvB-_`e;EjGwlwT=55BP<)O@^ivLJBN zz@uw6#CGHm?zW{3kit9J1>$!Wv}Wgzh}bpd)2W?KN+0X$>Ok*eVANp3*cag|G5|!Z z7B?Jb04&xM>;h0by+NGcYxjRTurN(vjEDr(!`Gexr0#J~;pw2`@x&Fe-=F#Ogqi^_ zRDGuo0UrMN^fZ68CFd<0DfLRv_1gs=9>+s39B=QWGr?{nmeqp;No{RypF3>~4Bu*c zJTS4~upadpbu%yc%RA@5Vqv<_!)EZ4oMM!<)U=bx=_0@f610-})8+Mq5*?)sr6<8i zB~>jn#(5t6zgBnJygCq8urj&BC`b5?Z*KFy2tj{P>e?cLHtl}jLg%2lMKSOt+x+bL zs-J!?GuEJBsXoELYLMAfJo|>EyVUw>x?_`=Y@{2BC0f05mI-s=^i3MU_f*-hJCaf4 z&7ZC*YTJMOVK!RGwVuSlz(726ojLoE0F{(YXjbOZ>ce2N|frNR@L9-Mhx zq~PUbiyw1&3pDvjKlC83#H4Hba^{`AiP%||)!bOZHFZ(?o~+sp20W0$U@iSMp@$V! z*RyE5S|-XVp3@=EP81sUI`kX6!2a-dZMG3m=MCN`OqY923+Kt$7&dUj{X01hS6CVz z`za1rhu|#9MS7X#@q@T*MqOKoORd*0CFHT~nvXx-+afiZhPml-Kou*8xJzSgNKoT- zeoEvZsqYBUA6?IbpLOZIuwQ5t0Su(8uGJ!SMc5)y9diA@As=SdgkzVExMwm<>mqdZ zwj$p`C>1k&8(`YfNn>zM0IH6Pfw4ZNW~o1#@kLKxpR*$jr0V+uICRGJ9-z~Zf_z3s zCrdy`0lN6IiGKhuUFz}Ze(uZzI=vL5xQ1H+c$`^!38sD#fpDBTd=LOB$iGg$G=uJbms z@Uj$~T|}e)=^ar)7N&Qa39ANEzGLrsDdxSM#W)e>D|Zu=gWGqLa9=W^{8!C*ae2$V zPSkVDwHN?gffqmIsnfcZ($GB%1^=Z!c&6y^z$sfhf4R7%w?c~{dGwKdZ(U2h66!vz zz>BMdu1th|X|^ZeSgNf3f&&VMq97vE9}xA%L8?9otA~NA<|UIJ3RnYg0I|}p(&-}D zR#eDci#GPrZ69Aty;90a45j$(TV=tYIG6_LW_)HY4n2Pd*KMZe8O^AKEx+{|rs_h; z_hj@33)R+>B0QX{Xl#2%8)>lunMc93Gnvq?P4DB$?dURX(>-W`bAlFKv5C^}?{T_N z^aG!eIX{axHu?QAS?$%_y~3IScNI2S1qTJ$%VL~u`TrEC@x%)E^ywfcs` zTl#Y&*gW??pzX4OOa((lUbNN$7~@+m-XrahVv2X&1Nq6Y~FFYuMb&GGSm$J6>9z-F?EY=KA z#FgSp8?LVkW2L-{x9=e}HBC)7v=3DhEtEE8p7dXONCs%%?oktaNV_jxc%;2AN>6C{ z#tV6_Dw&pNIiA4G;`-^cBpkVr$|{6&QrvPZwjsW??ppT>UTX6;u zAGjs%kz$dW8BVqSQuN9Fy!`E5#v~C1sF;`=0M=swIKNrh*(ZIpC03XFDo>RukAFqXm{Hnu$x({ zzAlS(vd{F$O2Tib!x8!SOk(3RBE?g)E(#U&Yf8uPFn^v!i4)gSx$vl*b#;BhgmovG z`#K{2v>Y%zs~cqH3r|z*Vdyis6yo$|Yp_Pq9L46C$ruCQ`z>F#?fDNlY$YVd#jT`h zdL+zPuD_n@p$!e(fNZ!52B1_F6n=mu#5I@2CF-8;H;iuxX9cuOzKDU|Ms`8JLs?m{ zZG|D*m1q`(`=VzbFl(@$ zJEhxU`U&v2ghflYo9r#&CyRC0?b{|v@Tr_2i?KTPbM9TRVHQxo`Y~JnZ{h4_vZxSC z6?E!Bc9V zbIQW;8TB_pUdgaY*ZRx{QA{c?Lz51|X-eTDo7xU=`9*wijSas41A=OV5yo;Yb5+In zlpPYSk^s5$LvFvWGN+zXbdy_0jOzX(;w6YxcU+0sz0JKi3&E6DXt z(|JRT22YjQ5mIE55LfyaU>x6m|4-LQT$4F8^G4Q$DOpjg94V-&^^8mMNN_&5A zy^k$rnA9~qSz>>a_8Bin$9Q82qhA^wnpLbFNhk5Rz=gH(wZknPUuC4m73MQbNI14?`v$B4ru8h{b6a&4uLvG9{nN^G;-?WIP zea}0(h6;-H=^uI4ZIqsUp|U1*#_L@bM7`|m^B$V~Ro8Fq-^~BSS}pdh;rh`~&atMA z`!n>@$%B3vMGs!dQXGC@PU86T5-K5wl$-w{@VJ7T7XY0L0#3{;4lC{6ZzE~^VQkW5 zRvhMuJI5FDQA*U-+rP|tkbt_xCv*J)6^yt?ue}nJ7zC#N<|phn{`$_}!Uq3V6n7q1 zADR{IGAoIej8ye?5DavneNydXiRZ3%Fe$nGg4MG}-B53{sTYsoVNFQfhcT%&NpR2D zH5?i|Rv-S3YzR6U@i;c#u2pHjw>gSDMy(u!{VE_puJE!$-7_(?;Ex8{%hh-VX~?ln zT3D$jDd)`FQe|==^xOEu{*yDFnwzwQ=LL0rGWsr})Pd&{$nX2XTr_~!L_|jN8yFb$ zzI*qseRLBQ5lc8*exxas7-`mS0-Qm((DlM1Ow_$RoW(eFB!cy=X=~Uj^IBb!$EzYS zaod_br5+nL%9_~m(g)rXcCDkwn}p&k58_*&N^h37#XAlE#NQk)g%TVpxUgy*m%a_D<}&6 zM|}x}JWS`K&*6vd@llH6nmTORJ`#!U^W_QW$R2kTH8x8tU2SeU?k1K?TltZ zfsfd}@)f+7+<09yx)@TDBvVwBPPuU+bt?7SrgxwqqIkP!b8+G*v`EnM|l@<}x*FEG9Pve03rbT2G>6Jr$s&@E_YI)_$Y{Iveh7q*2)C$0! zFdX^oU6rX%DK+z9|cHux}6aDn^j%}2lJ*Ox+J*@tS1~$Z(FDUkM*^(Az zPLSO@u|zKa(&G8=BH*En6b-2yl`d83%Z9FiNJv|^)U}y+-7^=h44j=kov~Ss`GkP4s8>HOH$9}0L$J2IxkBW)$(~9cfVW-% zv$yYiQ=uR{s8ISND* znnzt8TET0lW=AKh&)|N?=@F^6g^M{ep=UYP(196kzLD=q*RV5DLr<*_!llwVd zgP)`;?>RDnOAwoT!(^zom*)H|WA$xU^qvX*^cB)LA^6D(U(RSus`5nzWEB14QBIGr zjAJPA8Mt3jlE#Ph1$mnBF*@*B?kq>au3G0R`xv$-xG1YqI2^A2kZ-@MLa%Ca?S+Vpw3Ckobi*Wuz*<1CmQ5za>;5HuK?$j0yN^nS;0} zNod($`KMpj5l&gSWa~__zj0oA#hER!fow6oX=lm9xQuZbx~(=JgPQO8H9bq(cc0FJ z)8U?_5Y#&V4z?{JpO&w#RV#`lJ|(1~91fFl`ixcY$!L3!2fY$MY{mF-hOVvmh)rV9 z=l9}WDm_3s{5j$M%z~SM&41sTM-rh>pg3A@X9@_Wl7Ra81pfpGwG0rq0-%@nv07ef zZ*(WU_IXvWZ5r7Y|0%yCQ-N-5^K0ag-{(_Mi+Q}*m2|#TUqFztk)yS8ry28VY&tLp z51L4AL8M!V#B{XW#)v8YkHx86;_WHQeqR_*Nd+4>I_3wD)l@9;CZznI_+TvEW@?#a9cn`(K@>U zde-i;Z{5V&k+79UN0(e9y!Wwdi{HMzAP14C_WTEs8AtnX*FJcCw5w+~X$bFyJuMC% zN4Xnoa!a%VwsGf>l&WZV{B~TM9!*~>)3ECjpPjwLC(-m(VX{@5pWh}q{Hz~s=kDu= zNvY~{;7sSW$WeYK8nf{t9g_0uI<$SC!)~dy&7&O7@eW_h`##CJNtrB{1sw8#TZ>CX zK%%s~GFa8wWgE@E<;wQ_=fyb97+% z$VxRasij#$mHaPoqDK)guygG5a-@>`o`}al>$|^B?)7jUW{3O3=@aR2h#nU*6KUk0xa^1FmAG_?+R#&10G9JVq(X^Xv%is z!1Oj_WslIz(7Z5lLup~@!hQelHuGyfvAOE3Z|Jwu`ApXo1fn4nx6DkD8Q#!T+x2F; zVeH$~_I>5XkFmbuLasc~1NH6FpLLKfaC7WoPfS<9uXK9i+dMec>52mAA?QXKfVMqW zwG^2ZZ^pYy$2!{H-Wsd(A1PS$>NE?#J@h<4@5_3}TD_+Z7N?{<>vLbpr}hy~G7>EEC@H-)Tsa1-ZC;VEhX4Q|5&1EG=FrM<|svMVW(Tm^ED( zW(%*Pu576PBrd)*;bzoqGY=4RE(jd_lQY?;7RRj|#x$fJQwVjTz3YZLL z(#;`1Fy`5AN-(I`!tCwYK>uC6*2;@2#ZjOT1qE@MACz)MRr}xfISmrAI=VXp7~YhB zD|@3OctWi^dVFD+l-7r+6!Wg-hE<%0G)f;wm-%_nDgv&Y4dIt=+=6phDuGMu zVF^qP_D|npktfBC2Z{+^i4pQ`z?sgJ(^PkfRV6DX)QxMljPa~2>7wK8UdvwDztb>; zxlB1t8mh!4q?E)CZHrIIOdruuwKl#6-Goh(O76s zvS%=wWG4W{1a3L5(e8ZZ{+|o}Kuv!L4=Z2v&mAhbqyqVZH2x218%5M>%WHa4xCFKg zxa&0eJafr{jAzCs_?-AgBqIrB^xa$?KX|&)X5A`LqH$j*tgPV>A$res><~u)$aK~E z_5N%HiD4j2CSYf&%kO6p@+C2Sc`qC|U&omXsnnj=l=JGiAz_J>;qZKGQJ2hTV8H#A zr5zpSsa&8{g=H2Bi~;6q6haS*U0x(YsYO4-3!r1cMf4&meSuh+Jj`DD; zKB}N5kx_030+Vy;*}xM79#r(PiF!;RP+6NGi~t0&sFW1VAy~eY(;Q+n7a{U?%UXL#?8Lk)2*q)YYMn(p)P6DX3WZvU_54F~5 zZ-%!grOh(02=4E_#Mlc0mj&R(+on(`{@f4x8bis`b?Sos4%k6e(}P%I;as5f3G2{{khR+`60Ma+J=aEcFM%j$Zk zQas6zmJh-WTz;QeHg}{trG3r)=X$^q;x3qDaxaIq3JKkc;bwl#HxyNg|;>6RifCafr;z! zr}c+Ztmq)q^I4HWZz>;DR4cLf#V~CL@L7vWOEW3}IcaPx0mzNAPh@9i{@HL?k8Wvc z+1S)nw^!WI)7MAikmzz)2lW$>-5sqklx~=%#+ec51_O}?@5sVW^ItiUg|HB{+h;L1 zuq*As;&~RapLr^M#FkA+t(siq9(hkZ7AQgXkI^UOopqTL)o#jA-z&~z7U9!!Cr0sy zi%eP4zv)Fy`EuR3=L1O|@dN7U;LICHeI=0=ZpDj;Ns#mK+kB~!lUAu1yh(tgpQ(EG zm&9R#-^`2-{5QRgzUU|B*t7%78Qp#hm7bl# z)|2_Q5TFfKm~xg)$DZOF=dNaxS>*y{5}Z`FY|ZLjzQUnc*oqNyjSIw+9_fp+O`mAM z3wen?13FZ`5A;Y9xIaue!@z+tHFsWS{pHhz4w{o6E@)ZBU48z*o072{kfyUXad=gz zQsKB?)-56_sei0pCprf*N}niyDy7<98k?Wo?>L@*Y!C$sbo~gPfGr-S+2m{u0k>Xn81rb`2HRaupbI4Uq53uFS zG#LR|rWcf6rXquc7TD$CJ$y|i9AuOsLG(dtkn~3!4(!FZ$g9Qjk-(QlcPPw-^!npYDT(K1m&^u!V@8|1gpT z*Rd1Qh239>N#~78vIX*d#f=SY&{)|>8XlhAtJoS~?meG6v)T&iC(b$D@nyPwxmn4h z?Cn3DHOm^V63%tSg4Vjdgc}^*e#5*6S9e?2Y4%6Ane9L#$w5JwxFLU>*_F&xPO5@_ z0}*@oj6cr~yffs?(LhxinA1Os*OGo16`ya@EiF!>w=bJ0E$P=mkr+?!g9A>{GH<^wD`G~b`!F_R|-4m#sW6qcBON1dy@9d#^&vE6>jPa@d zVo&|}-oLG7kG>ZM?5w*+(5xioKZg~`CS&V_-TgK({86tE4hxk%ATP=wckY`G5bskT znhEouv*O*rZ%R&;oHp6jMMwtr_YI!k6<+N`c<+tP{ev$5&OUK@ohxHqGrU-+Sy!*P zS*^UXMN$M&nq!e#+dn}_;?bm)n|`^PK%eOC4KJK1vn4CCVNYcH$>Z(>+H!wM6ciNn z5+nOdWDTf!|iw0X9zwxF%M*HL>dY5Qnw9RK8W@!eQR_lV)PM|F!sn-)f#**98M#SI?Fma9M1 zq^iE{8>oY}iAG};P6}r1b%-je^7zm$ z8UUWdO7>ZXsj`xM-zn{Q;Qy@;*9AAD9o&wxj2HGP8iNOJ9VZodMdI)MIH94F+rq?>+r`bh+6QjC8_=g`+=s_W*ydfyix~I9;dxju0ZqX3Vu^pQC+$KB_@1XG6J?IVt(;(EQpz8C{*w_IKkhkFZG}Y#5^m2dJvE{ zryjc%U0z*(x5fv(I1oAUV}C=_^b8Hr4i&shpxBK0Orox#(K{He^y097kHPtJzgL*l zO)u8T<7S5n^vD3Mt2`H|j>@J7>_99tE|p03SL=VrI?ay{F6HIrD5$79Pg^+f={P#i z$y~{kl`?Y`MX|}M>Po-jc$t%<5@+f+k74q)o>U}WYbDgbZ%Fu*(CFGxGC`w4PeTo^ zf7cTukaz{+vr834ZcVN^+$sN@^BSMY_6IS~v!Uj7iBmLkaxxZ}12K!bDSjjBBitK(H1NA2nfXc(-eUyx;f@M(|59#5AI*uyqs!EnT4utW@b z_Dkwz0vjGov+=HR1`as&GaiL8zvkAIIxF#dSPpEcm+$Z$A-DQvL@i^b)K`;#k0=R_ zclbA&DcLz>E%>%eL(24%nP=hI?$Pbr}adM?J6vZ!2*usZ*&(p|g9^PC6As6jD*s)rL!B<&1JP&aT1y2L#+ zeQn}fUqDNd#6(kr^8H}Pa-xk&8BchlfRj$w;1~YH-&~E0(T=qOW1Wum-_1bU53;DY zxG^Qe@0WFPCaa)~E&PQ3KHfm{kt)%>$#>2t0!tTv@Jaob@WsV&N~wE;1qOY6!n zLm{0Joxc=@f13E)FNM|?0E`3Ia`SrOaa15WEzL!0EPb zSglXV%*6isQzGXad5+%0SWw{*^Gd$Var86){=N$H!js86mvAhX#VW4BQuQHKwlL?^OF9Xq~zRp z#VM~}qM16U(uQ~$h9r?5n%R#}#w`fKJ1AFcTK!wYCLe`0K+- z97?QHI%{6D&UVRO+AHYFUN-sPsK{$R!x`4W>f%vufhlTpdI9@Wq-iS-cT`5=c}VNs z681P(?vKDC5)f(vEMFr;6kI}kFBcTfPe8Aw&6otIN_7x;u|sCf)H+{#!DK%Eb+>sF zpiD#(G4v++WWqU0idmUjR_g>mYnpu9+#(qIL@D_wPMbRi^vZT>e9^8Y zKlgv^)E={))^gB|(5}?N!N#hV_DU#Mu3}DgqY54|dGX09K&wtN1PR{j$2hQffVr0b zT32Won;=;(yYFrP(4X{i=O4d=mEtDFSnuE7!r}c|y9k62{|#L3`f`$Ssug$La8Dww z_%HE}COkVYRu@PXl7m9>gi_S4I3PFz3>+i ze~banNICL94;7|=-r{c-8w^E>5)TY_YawYZonoWuA1u!4t;b!T57R*o>qdbAP@skU zDYSu`3`~XBueVaS@^VsE!8OnTxJI*I!+WLK{BwB$+}~L}WV5cehLW;#R`!C|2+6FN z{c%uWd)?~9>iJz!{*(NiwAvPYyg$*uiuAHPe+G^}_a)Y4?v1JRl=GdH;8Dbi7O{8S z(hFv^FVJpO$4gI7$-b5N(A&JW?I_HL zUW=?0FXv%185GG7fGcR&&91QBcaxP6y-TcXppZBW&L6d)Jt*n zo8?58tb}Med=AaT7yI8%rDL_NP(cD$U8tu>OL;WdKMV$2)K^^x5_L$o5Y~q;4UaAj z=hS-DC0IX#nWZf$>gUPU+xO?8``uBs*=F>0!S^iZy8+Bg`Pa4={o$f2`VZRX(v&U~(~maD{sFbO$R}(sUP}O(NY0 zog-HMv=2VCf|HgV}*=AWa=R;jG(gtnmN#3!1wMzjaND!kzj}QkO zIb&mEklLf>Te137bVTojbV2m%kkbwo9^}kWt_Tzr=vNEEm?6@;`krCNl7i}F)-Dg? zhMPrk0I|f>`~GFs*G_&2JR3+kCKK>Y=?t$AbtD`g~FV{;@<$Nz3(+&;l0M! zz7s}(tM5nmJ8BhpV++CI=xT>pnT3MKuesvfi+h-)*fkHS;wiQXFgSrPQ(~s~4O- zmcC6yfB#>4-lsn`id*<7yU(Qv;83x!Hj8SO;K^ucf`Q-_&cnk4sz!k`!8k|2O(s0N z{V_2ct)K=d8j)FFbsTlO8!pD%onsxj-Fwl1v;?YUVu~WTqbXK%=Z#XuRvS#DBJBBL zbIJKR_*d6epvXwKCQ?l0=uwr2!*m9Ud(+RP#ezq1x<{%w*; zTd9;?wdu0;F~K&91132+mLd7&>GKusYV#P)~>_HEWlG2DhvaoN}y;SL;GPg0;Up8O4rL`NOx_ zUVR8i^UL42X@g%8yHO~yFRtAszET){s~(aV;@v0^#7sa`{ok0Tn*X$}u?S@gJl{xy z>6TW%yYCqj$Eqc-Y!D_?!4L0vl!NiVSvwEO!~}RRP<9c(yblN_ZqwvxjOGg+^=G?S z3g5_&0er0x+~x3~S{xh-k&Lpr*2p?YZu<0Waz z(66q=U0p#L_)OvRs);)hclSby87~TL0_qd47go(>|X{4OShK$@h7llm6qc zayTRH;eiqgbI`)7P(x~{3=siTZVT!!&W+Y;fuWux1H}1>y@!&UH+&1tqW}_5xmd|B z0;?9%FQ<&1Mde24$Ur}py&udyjWS9E(U?#WFEBy#9uf0J0nWWh<7?6U+HP-wbm~0+ zszV7*V`Vf7#Qrtnl(#kti0jL>9&p>Fv!s@>a|H=<1hb`#q@K+r3nM1PC3XKwz)JpR z2fN&R!*~1QMK;IG+uO6DY6p%4=U))KM$&!wkJ3|f3sK}BAGa`q&v6eD_g+rUH%)DV zh0XlGk74wg>UTn|FR7$#`#Oa51yTYw$ihR>h@8}+34rSRE}&<8ZQu8rtmUtOQ(sR;6 zIzqDuMFQuQ$=csXs!T%NYrjN%i*$+e9PyCvNSAYFvY`W`&YiJ7PG@3}_-I@x8$s^} z+hyw}{3Z-0{?J&SKoHL2OSJGe(;QTQq& z)A}u(M+o%OUcY|*@8%{3=y|+%N1LPWVc^yjgc`^%K(mu$t??br}z z!p-FFze&IuSG}pp^7BCNo{5(zvG-qfR4wO@*7hJ zf;5@dpFi(qltySp$#CScz{nZgp}K(mvrUqH(O0$TH*hjGo{xz?rDCPJ-}FAo@a$6J zsOf1afX_ixszw$%HX%eJk~;~fg31=SV46f%2MwI9V0}!9LIS}#?^B<=54|;@q|Oqo z92(vHwF)fk0tnMypRa{R+e(lOv;~{tm@c{JvIq?iW9szwDt31N_I@W#n?+c`SEaQj zc%c$kBO>)NnWN`t9OaN5J@}U3z>mqq#1t4DMTF_(P5{c(IBNw_B!C!Sh(n)(PIB5$->wm9*5%3*8fmz= z@$qUUb#7q%7n;bfDnIZXW#0=FszAZA0fwHCN{hvWW%pamhEAf-F~9x&LI2 z=JS>HNjgyWrFl~a&XIWE^ba!@6~=@{|E9(}&x73k{7&o{NiUQki~7u11?c$Iz7_2# z4awf`wg8Rb>aJFwtp58A&k5!?H&M^UL810mqTpK~(a1Tk6?RE<-PLPGz1gWxkd(T9 zQYC_%W=UL>T{?Z#}m}f&7aYkzd6_NH3%u7RmJeJ#H*QMK9vr46KHFCGAYr!-DF%5Ny93)4f*Pu4S)@$;l0Is$hJ+NM_IA00fwVLB6kP*Lmpm|NaB}Z$EhKPv= z7FzM|++4s(L!p#P5&=yTV)HPVjOCO15055?a+VNj=lK#8$moGrwj(<>^XS+D(?Um^ z!TXo$nE3`p>&Atrw}&Jg1e6D%Er}in16t7cOv*FX%Jw)=PU9Oq5Gj*@P7)YRln{;x zlKw6-iI1+JEy4mBEwn7t@I?lbeT^XF<@Bi96_%xmidf|(r=wpO^891}nK&~6m zuRt8HH)5|r6NdrwwZM)>!fg0R@8Zc zOOt1s*UEU;;n^mhs^cRS=Y>fdEF8Be5=K@^3QqaPlP)4U_1XxBB`0XnWnZi=ka9g? z=7^2rVKOa79tz<|YSv;Tft~8Bp6kL3y*G$;s2S8PYP|EbcN zy%cobhY7S?{{Sz0kXSa2QWdh+0;tda_afU^Dh#xA8uPk?Q!&9MQ;>RFN?9Nf9v{! zt)3=3I9(DMp_FR_<7GLqsSNA&rDvm~RS49vmfgS9+CJ6xYE&S`GFGl6C1pRLU?|TL z%qX3G`C+pBVGil!iZr!sd`*}C8C3epZQA{)&oo}_4CmM%?_AAEPDzBLmuOLF78#DgF5 zRjLoGV|<1-r2cJw!fXJsy;7FzRT-mF^e5|iqg?E8%Icqm;;XDc{h6n#gqiT0U6)F+ z(;J$~@Z{|^n>GJ9oqT<>Vd{&_L56F}woXiRq)+FK*{c$%W&z@_#7Ln_8O+;FjCztq zk$Vs9L(vHdO0u#j+7-5@Cp&Zh-90z3HZ3e?Hk-dCUA7K;TZU~dU+l>n_+8FbXY|>T zOdtv66uoqX66K3C+IA@%_FF0*&Zet>G7%DE>wi9f&7&=;)AX9o$;7pF$=>#Vl*zWL zR<~@BfHI#T~o-Y#zCZ%3eZ zkjJ*ocW2%irI`5p?Iw=m!<#0Xi8y<` z@?itT++&R>qR*)>vFbzJJ?rJA>m);c z7=J2OMs>zs3-gA-N?#iIJ^TA#Lj{kKhvsG;n!JC)W|&+=s4#6?QB_XIK3f#-j*t**&}dosorhgtB$J?)gfR!$MCc)4 z?q^ass=s9MM?*=E`;m7vR4_}==WR>FO5rd>g5{&Tv@G~4LU@;ucj>JXzm$rI-*kSK z(gN)PXn>uZ2IXC8xfNnkO#?p4(4Bu2|B1za1GG^7{R=2#wYXA2w(J53}@88hChGoa$bk7tC5kSI&Kmzob zmXt-gc%l~Loqv+uuSEC*W3}Dl+qF#)y?C;c5jpz9j4+&1&ywxEcSz)C_0ps^>4Y2 zHnMYsgM*`4W*$AYaTCjuvf#dKXFK~haC!|Cvk&^m#VzPQ=O6NLoCjDLTO4QCP}H+e zvd?F}E1R3vqrX3siEjM;Yd%|6chFaJRZpkN>bQh4iOKaaKEkjLTQ%=btikdw9TX=| zynbyv;k{;()Je4(cs4uM#l3$~%N{%`BFQZVPRLt+FPO+#L01G<{y>+3fx#ap_i95` z&SErZ78$c=kU>JRi+NGJ?P|%wa+n3SkPdP!^5@2X;>S$ zhMnMjKbVV3myHo$c2KlNvktbR-=N`MM?aVUS~--kGh6NX3-`t$cGlC2?%rNA;LgCL z&WJbe7sF>M@9KB?>`xpW`4EkbnN+Okn3ztmEAUketRJo%zI>7B#i)(cy3?8%{5ih1cm+CXX3k!ov1i?_znZ)x|}&-SX7%s29Sce8`XwJmCS7ktwJv zeR7>!#vZQJJ**PhJ_XhF|wHaI7Z!;_6*)0cip5HMS9^$+Ec5K zHn3n=yI@Yb#z{s~<5fp#-Ui}TU#?eyD#qH?#{46%ler<7j(MMAQ8>HHLH7Ib0qV^x zY2*Et+k0{09EOqte4F3Gd{A)Sw?7Xkl|N)Gverd35EU_4>-;EDJI}*AoU8rup!ifq zTjm|#HGOBoGE}ZdVy?Cy5%kF#+T3$#(l!aA)ZqnfJx^vx(2FZl{k~qEq3Y{?^2X0& z1cb)@Nh*ZI8rtsnU(E&CV|$Y^H>@HRqCeU+wiSe!7ro=upDxbJ)cAO|<8HSSiDU04%xRO!`#aQa@7i=r$0KwX2Lj3s|Tzi&F_& z-e`}8bjYZfk>_e^g`w|ty7zmfdqHjV$fx(u9|j4DH#s_^*m^3A&qDNF zZGzEO&0u-;bxgqCVhtN%eK;!i<31wiI`T9Xsg9hctiBxQTHp2a8=i6A-5T*{&eJrK z#;Nu$Vzh-gTlE=qmhs*h7)MgBG-^+*FY47}N+l^o-YBG4W@{2_h`Q2!^^CSb_bBy_ za9B>o+_W|v8ujrJ-^E;Tc-Ej!$1EjWE9*4U!KI+yOtRy@&#F24rvmz#uwSUn_j1L`scT%jbsjwG zTy7R6tsD0oEt>&EV}qyowDINGVfN74UY@GUD@5l=sNsYxdxyQ?IruTpSAg~s5|>XO903uAHZ7lKmLtP?I-tT*m|Kq+DotiG;P zK%2Q@%A$}GnGSpLj4>mXeK5FJ+>;^V@u9<7CS&;h=Z>VL)YQsGMvMp$V=?z`%EG^b zX#u$+2_?auV-^znSX;}HgY$nS4vT|%FoWfF+tRr@TjzeGi<^dJ5|k2U2p5# zWKy*hiFSRP$(oQZ)0nUKqhmTa^@i2yl$1;HslhAFn)GdQ-TuTrO9@1hT5rsYsDGNq zh4MzOjA4;H81Gw_yT1>wTp>^4M=q2s`~tWgM%L1EURXDJLZDNTBIaTQ#3ckCr9j9_ zJ@-Ip^Mt}D7}a5{U`LkQ&TE6AAmWY(fTI{NSUSl4Vp*TYq-* zLHTs$AmZYpeO=W)=ir>2$+}K)iz3}M*qe)q{QhOa!w zzSx=>bc8baAG`Fbn7+Dr;sAiU>aJAfsHTiOJ<*_)$|e3FNYXIyWAawPa#IQ^r|=Il z*p)`i*}m8XRrXRbQ=N!Z<1{Eh{&UBr%rI+yn{~-tXZ@d)*%?sIz4t!qSSRPVuE*u( zM$05P;|Xk--qVf=^h}uS1nLF|DNmM zQq?kb#>iaYb`(?O(?X9J#o$}un>=0kC%r;8oyYF0_ih2$ERek-Ksdl#seRcQ#j#s*G-wMXTd?x^xKMDNOaWj0VZt)}!n0znnPl?`YjOud?}+ z&3KncL>$>mzcG@@F6SJt)-uaB_Da*OHAsLnswP92Ll1lETx27K!0cCiO6;_>`~nBF z_ssN>5Uwj1Vs^q|h7TaYNj6sPKpreLdCrX>e0rdmneXeqI|XyO;Dy7RR|wb5Cb>}cu#HyXG@F9f{8u4DJd~5-4uoABo})$YGe#Z20`9&9yAzailSLnc4i> zyrX{7b$qsvFL%&Kfty-sP9`BTopt{R&|w>q5SN51n^>0fmPiudx9`;!i#z0`g5 zC!H>qiQ)1pfSfSCHd!OCMe^}hbjvc$_EI;4-T1FwjEEM--PL(cgzd(Hth)In`M>v$ zwJ+J?gIs=>SZLz9aw81lsLJ}-Q^zg^OJ^A01@>Np!KNe)@oj zP$)75idh;ic#dp7uW42@7pW11AOVpBX-G2Z@RwKGB*ZyHnHb{|zTKVMHolP`e&Ydf z`Cr&Q{gCRbc!Py2RFz~w=ydZg-M3RpGIkTY-?{WAcAz`?={;iNNxvF0%p=qEa|x*~ zGgOAA#*ByI8|M{2tG=0h!rpuC(5c$*^q4;TF$}!< ze6KFl>a)IohiQplWF#R195acMZ4a4s5KJ-gb zaY@Y=DSKwWCmWrfji`>_mv1nLJK4(}GL+u_yk0SzU%3`nX1DeG7pY?Ycy#YzP;w0E zXz;H>qU^VWzwv~=PUxty)Ciq=Z7<*ajI+9u{yH@;r?q)GCy~YH6<5M-AM;v5ZmsA( z2BJacZXuH%6nu^cV}gfcy6`+9K()oR)iPVgHQ~(xA^i4mio%IaD*^ z>r@FT(Bv@OtSO5;czeL!d+nQa9f@j;BH84@SH3jLzMaKT`o@?$fxqjavqW7V$Bc$iCKvYdEoVJd_;jy$wg z&1;gcsc~w z6B-L=<}=lz;}V(+ace9K9I~K=F(FFm*H-(%T!Yg5UcvbJPt7}0XS!Q&q)HRS`-u;0 zioq(b@33ZC!XO{S3nj|Y)|9qdzX=pI5(jrncWmTbnNCMJf1tl<5!R)Rvb%-q_q7Qm({uyQmLgMrY;h(=k%Vlju zV;loc#sBe}^(Es}jCtAecRuA(Dp21aPaVlM_NX)1-j)036@T9+t@b?)N$S6&IX%4X zIa?=<(xCTRnX^NfsBf+o)Qz65y8rXNJ1H<4J8%mR%+paHO}PcHio&ZV-QV33#^24Q zYkQIA*YN8D+XdCF_|N=_W=QoQS`uE_dKnbyoMGA+4S06AHx4ka3x}q+mwip6wGGl< zeF_Riqf#+M_fM6YAH1viB0VDm$@vCB9Vw_VW)WJqaQh>fNA<9AWpY&cJR7VL|F)Bn z6Yr`8=7;lDKYLMlf9|V)J{K&iEjbL?kl?rDR%WeNWh{;U4Bg26%RGh;TkFrHZKJGE zQeOPIeuDcA&;!X{xHFuculN1s{+4#Jk@ayZH?91lg#th=JK@CALI|0W`Q#jTO^Ls$ zL8_8tZhDp%@j5@*f6S=RAY;wYMna_Z`QtKj^H-NKrGDv9`=xl?r!3--$L!8=vqC+ zqPNQD!{y)Pn_50!Y<-t9sY5Y~qadxd`M0LNsB=!I6dO_k2n81Z#h}Vc{?1{d_q{wE z5iA0)BCY!(F_4+pkY>1`hvt5i!ne>t^}ZYvE?}cmMK*^#P>Fuy2b{qE^wIGfs}=3c z=^1#Bj=8H6;5i58#L}wN(~)ndE)hVX$MuP}BVvu*A<4XNMf@@)#`FF;Z*B!9q)Qo1 zeL+=85q4awjh-3)m#!v<%n0lk({Xw9x3n9wEgp9AMeAKmcIvhSKLwHpcnM0_xlY`I z&?~9 z9es(ZWREFzdZN(>DK#s|WpZ_K8X=@eZ_djWkMlWLLlVZDs&NXkR~6^J-xjkF zs^**~|2h)!bVQ=yV?lO+!5^E))`cH6=%6?~4dVkfLZ5_kQwkINh_s?AKcJZ1cc&3o zZ+_h4nO^VBp5B6T0q}m`lcn?9=fdiLXx1_$z-uJp(JJFuO_6~OfjzZ{-eRxAVin{d zXis3Z=ENXi!`Z8L**M}mbwR&{kJJS}a>KRMt!yDR=c91G(wP2w=i$Y61>V8^&V=BnBb@HZ28nQFu^t6wrhZ@-L2r%PXU8)22ZAM!0S3 zneecH_1@C<-R8_T6no#S^F+5MiCSkpL2LIZqwX!#avFApg0~>U5EOZ4w@_ zJlmIXjTN1xE949FC)dUXJTfR%S*g6C$HDcz@1JvMdcNj*tio;RmA5XGgzS*Ce3IGQ7q-Hx-^MU7H3Q*TtxqP?At|O{~r=& zB3Qh!qbl{$hmB1YP}1Fgvh&Yv_4Wq>m6pF}Z+(SNPjjAHtWCrL(h$2LU*iWGpGMJR zuh)hwMRqi1W29?LAb4V8T91jN=rC|;Vt>p#A1j>lOU;D-foOIU+fAG= zwF8luS3IES3+IHePfQx!y1V}Z-1 z+l1WoZ>xB~UE7C{T9lTNS1TQ+XtWd|f!Lzi3|Cnnw8{k4CeC1Jo|vFue1UdFsm+9t z+Vkf$AeQK(e|DEl05>)zA{VQ_pp3w}yGZzwJvlOuH;MVztIy~S-o{=bc*LtLE;Q0S zWDrk_Hah}b6Di#~Hu;~}UlG$b4WH0hrJLo~8^z^kP-erq?CkF?8^yaO0YDJ5#>DV^ z!iQxLXK^K1O~dp#VcYsc72$=g^i+MN5%z5*dLj`XXrnJKFFVb69}|<1$N?{Hb)<+c zEiG*l9#DuI68Ucv=ua2H=in|`BM6z*I-=%bto9z+v=u<^F=0CkEd%7>3gk6tatL1+WcV3G9Vd#O= zq47wI?uTnrcwMIdO|`JJ?KL&hA>OockOqRf0W~|1_Gcdzr}a1w4==&`oZiwUj1`w# zp`R{&eGv;rtelgdeqb&_q zD{?qdTPZge%u?V7;fWk#BLE~~275wZZW*W4uTMzfpd!1puC>dBC1e%c&luz#Ijp@f znn;k*kjyf4aX1?)rrlzTXQX5!8hi1vs`H_L`&VWNP6Dc~uMTTc^fnXaOJMy& z8k<3SgZeP0aq>-t5CQz9Vi26K zyWZNFeM46}nWvXquEjP4!P6s`_7}S5_wWZxot)i*YyNO{nY89o)Ryj&y=W<7tm91y z6TS6EFwQkuFJvp!x1W8-8s(Xr#zem0%S?T2(2<1?_%2jcSM#}89xB+tO7+j2n7c^1 zmAOOCIa)|v5HddFeVDVa;i#JdrThu*{TEy9%OBGSHg;%SZc)4A@AWpW@}v#L_bfd< z@Os;ot_(p@P38L&k8J)yR}$!6J&iVrwpz^fqemKJIXM_++>|2TjUig-XyP>*R{E&^ z4W|xbm?mIW5sC!sWBz|_pAjZ@^{_|SFj7|I>%MU=I@R_dg&uGKKmii4bZ8neRdKbK5NopvCeg=L3FaGPpCHPc z(o+z`FARht0#p$fIMW3Td*zl%#^F8(*6Z&pg5NR9!z~!LuNDsm@ydjNN}8&HP|~K= z2k^*Yz*IU`)t&5EJzZ9WUZa`va%HH8j8Hi1;{vv26vNcyiI)S*Lkkwbx1^hiV}2)9 zdg9M?jfuW&xLntF$kca=w&%9d_g%iIK1B*mr6=KQMUrko;W7eb#N(2Vrk!()myhVp ziA1IBKkd_wH|MsW5Rhl&Irr^y z$)GIz`1=~oZt$q;Mba5_H%no*Qtwz0&c){1v|f=aLgBgV`0{T?L7y84_fWE&pvC9E zZ%mfn7Wzn2V}6aQaLc9{|E0XKwJ+gK93bF?;NB(RHk(=`xLvNHlKD65_tAvmfO-2< zPD$r9E1bX+o~4oTZWP5sJ0=i?zN@ZIdxrZ2nl(g_D`*0-A4q*oaRMvD-3iJuur~0Sjyeef)o>F& zHq{r*HDeN8aELdp_BO_`3iEATp$CNL9Sx!@LI_p|xIMzmQ)T)LkiQl}G5`TU z##3a)5da{`{XTiZd%jm*n3^m^ScuPo7OL#@Ol@)=TZQ2TIwY0cAj~IjYwB1_*_)B74X$BZcw1tEzkdCi z!g&*mI+7^;<(CiE{O3<^qVSd_tz7o^QS=X>-70tsFFZlYU-9u|t7o}Z0^_^-SL1B! z`W_W-nbGxZ%kUZRB=5ba6STZpRJ(@*2Ds*ymdruq##4K?miK{Ha$I&ez8ln_*f==9 z+uDKwO25-eWk+;V{U|qDuSlt=elOFQYzi_dKHSHAdEY_pe^e3A2igiPLTY`86S9kr zuOmN;xoQ)V8${EK$;n6AHHk#F2x<$7;p1(sb?j}TUsN#!4?oL1w-{VDPKdQL?B*Ur zp%|I@*?Qf2=C!dAF5*hY6!GNn*#i}_<9OuPks|JPKT~ZNG<^M~rjG$Z3r*SOg-GdE zzzzX1|Lr>nooxFZh?{uN7z64avIscE>hJFC(1RlxXg5ginKBD0JX`Wv1G;WW|0{H` z($g<9C$_aUa#5e1TzT?HN_zywFXtV>!goP{$}XFY`Lp$WJL$_iWv&*k*)Vsyp(0~h zh#OYkma6(-a^xC|mK%RTY}}J2#3qZ9boNyPO`Xa(e;*^!pa?oT`lLe}jft6=euY6y zsu4U@C?alK)bLsx59MkwSCv4&kIJ^vAMkJi06! z`5>?_pwY{toGh|iZCnUmB0@q|F0LoZeWnHilu+;CgHn*=CF`9^a!=}-^O*;8a_m~e2%-?H2%2|F4d{yD;B;Wg4-#)LXtx$-lt?+-r1w;f71noO+a{7VE8^Rn^UcY7m zQ0sk&2`Mx8FDkN&KRSkQ$N>`C;>Ew0syuNI2nZm8P$=;5cTi^xtQJzy^h5MTdJ)3m zL$1mb+8T0VG45|S?f<1Ge%V~RzRnP9+mg{?@OY;H)S!<~bf}UMx;j5h`EC7fDUtqt zRgw`^qjZ|C7B3~dHc>L+Q|ULzi7Q3>DCqb=E~8}Tr|L|Et_@>^?pVlzns@RrO3D2C z`eR5G%dPtg7zH36SvD|EfK7cFI_0ipowzq50Ic~D-xD{46qwj1ZNyc_N=4=Py{ANR zPp?&My)KkkEMC2KrRM%-*LIfjw&smIHzMQQJ@sb>cpI^jZ)N4bT{0&jB}ISy}i9RpsE`!F~$Vm2htP^Bkmx$AV`Oq&6bv@FBb0~ zj#x=2c~J!e=ANcfw7)-6^4=8?i%@BWzm2Y25_Zx!{dAof8j1%P z=hzrKR4Y5q&q*k=k?^JG%i+!z%+yiqB^e@T{Z*L+w+gT%a0{7%Nl+AC_vB*<#GOk8zp&|3~=fU1!3 zS?Aq{uq7GuikbR%Se95nroB&!jN=_pP(Ve08}#A7G2PFQh?_M1olN4rT_yabPAt?! zvhGmGJOXF{G(bV43kWI77K1p=YDJZLl72$S5rPR7{MK|P$eE$7i6l3SPKBzDUOM`a zosBA9tufqti7n*tb=|LG2Vay#QF2r-^@DBo`aCZv72gvh$IjX0!#DF6o%vyYfvLUV zwZX|<&jE)v?aGo0Om=2!N#ofr#SBon5kuuj{55iY+h2?M(Kgf_G)R}%Tg$n*@380B zmhz<2XWmO>hP$+N&Cs!pW8KiJt??Ig@vF@t6Pz~tWpvU}3hpSh-I{$CE7~&{5lH>4D0%3L_31 z5thk+)7ji`qI7*a;2f!=gRJ?}JX?F(K1$}9%8+0W3k4*l$YlgU_2dG6=~kR{ghOWH zwcU2lLVE7;wSWEVAj45v*;jE-h*VeK&j;oB;YNLYtY^nPW0gHt(NZ8#=fYnl+%3Sh z{nPf{_=Yx_aD#p0jGhrJLps zyPq)}Ma}$~7>$)>LfY?$5G?-sTjO!znC5u6&lYi=%Cbgogo~+-|Nb%h-=4T6@#OpB zZ;B3?(lg%w&?k;2W}#OwAxTq~!Hf996|6#d;xV48tDRZZ#K4iM+D}AJ3eW5KjSv^pSnSPzzGgj0NL~}b-1i_`ptxUJW*Ad_6 zaKfA))a#s@HZSO&iqik@1yXM=?Hn%3I5TXyCCrs&92AdNPX-ocp;~rd9tz|)HtMq* zZ&I7%5(-oCE6FQ-48q1DPQ+{TMfg6!zjG}wL$IDTzW6iLyE=#eAzxWWCAp}^T{ zBMAm$E-~^KB}M>U{g2;_?YjMs$|Zb-dhN8foX7ESF&kY&y?>m84jgY7&`cE*Os@O1 zj1`4s3n9NC6Y7n{9h*ju^lQgosFYl@ONG4ocu!4m`lo18%TT!WM`r&Dc3xUfag9)E zp;VoT5)b`%2h>A+O@;Guxp+|?ihCBFYp{C4Pr8=jVc6%Ml%7%|(x1qg;aDExz%Hi*>{=to_`FF~{ zL$h6x*Y-_o?fr@C z&o2M_>F5=Ze6DA&9h{`dWk&CzQGd)$qi$ceT=arZQacl`e~N={gUf;UY}aY2Qk!9R z?z_xNUEwDM1;IJ}hm3r8J;g;q9DMFm@$E%a23#IV_FB;4LMWelHatSDqiOmaHTsg% zL$r>f$PcuM{FQ$KPhPOlbD2_y+~=^D$Y4jA>yjSyqQ!;D;ZM}eB~pV!KA|98mCkE(^f8a(=C1xpx6^72 z^a>Z%yQVAS(FJ}A>cYrp!!hlO9l^zlBI*ctKC;Jk!$Ypyc631{s?%?Qf~>t`=#w}# z;#e9|Ry2w=_V{HKT>g7UZVl>TSK+a7{!N=LAD)~OsF^9cmK~ggCyU6XC~3e=ditJ| zK)jEX?kPpKR$f3zHurxQxuJ24nJ&GyAY)6uYJab0PkV)y+E0aqf_U==V)W4IZbwJA z`0cuH%8>&J99igFEjI!}DE;6q5e&<<5aBPS-Mq25Qa2nK@#|5U6nS zZVEx^LHODEa{3ef)26swKJc6>`h7}4pB`igi$FIc=d2H^QBQEjzi%VB)RLaQ2(jq6 z`7@E-1(Hh#?=Bh5vp@e_9GxoREw|4y`D9`uY*TpwcVsO7hw{IM!*TuCUjvj3q;=oybUCwqZM^sMQ>ACXoTohDzSR6{j< znWMC6kTE-$ai=c&7$bx3Vu{jnE8L&Y-5F8@iz|t_yL9k~ z{Ucs64hxB3UpZ{>?JnkJKwjMQ|9#u4-QVB8xS~P{Oudj+h4@*$g~`Tn z1CD*O3kztTo}SIk&GeFzy6M@WoX>~euiPpf>RY8P@Ly@`nGVz=Jn6LzUBV>d1PD6C z_O0;rn~a_Xh!T7cCNw%^P!=#PW}%4+s)X4dnoiBkkL}c6k~RiKF=;wnQSn*#+(cLo zozCjEUM8OgcXi!oXnKCh-uBj7C3?%Q=W?ib>`Yc6yy?aw3WSS2P*J(BqeBf@RDPgO zHU@Lg2@>xhc^}IkXpXZ*zLy+de9kPO{kMRW^1gaS@#|vmF?I%PDJM=99)nNhvCtaa-)2L8W8p1A0~l=V>~ibF1y)mE6B9#0 z_6Y}0it-$Fc9_vK2?~;3pVwb&FF25qk!5FBO1pVFINU?XWc15qxR?Fn5{l3DFuWA_ zQnkk2Jc3cLlPz<$3wR)dQL<>8}8xx0qf$MD7XWhfCg zohK(#0}0UpY-4Y>s+QO4f|OrNU{({QkC)GQ!ijemd~TG}kf_@3x;pQHwWqrOReDkA-!A=xwzGHzO=DO_&COSgk4c{=G z{JATi+Z*!muVde>tf#OU>;-BNiB($dQ)hv>dK-59Q9`x{s>TWj)N8jt zN4UJK&!y!UbcQQW1Z+)f1dX;?A{=y@>cK`qL`4+_8GuMMr3>xy(h_=VDRcA0#6+>A zv~;~zUi&sY5ZUTOHQ(6cJG7(^z$6RxBMqK{aagG zuPG}hY3m-pbTZ$zKzqq5`u@>DrH6d#^V9;95h1}$wa`)=QNB|4q?rs_rvSAvBcE`o zn>pJxN)L_KY)=qo7sgFo){nWG=rF5xJPjG(hC?8JYK23hpYfj#Kc{tQX<*%F-F9 ztjB>~BlkP)WH9CfkY{mg%n~+!|C+|WsVo|Rcss!{H`m&WAQq(c zb&{ZGWyJ)|%g+9OQ>kg^&V*e(#gWEOXM_wi^2vGhK7htvmL=8@92;+zQ{4I>pAi&p z#M`y|1aL9DfO?5-&Ky~fPE3U06cp&UjgF6NZK9ntfq0+o?p^=b*w~?;epn2t5P%9l zn}MI76uQo3)nC(cZb<}8{A_fy_Y8S^c4}aXD z4;tzfJtrd;Bqoi*+!+6f3)1f9matp>zq~y&yyYhKA8;`-p@9}U=oplCEpS73|32oK z1O6D&edfA3jt(7B3G198%aub9KrEE6psWG@)AA=JM9023-LbW^BZRL!KcBOyx1S_n zN;|4=JZrun*(U)OVNJG)VwIvC%C1{Uielfs%-Auac;h>PLmbhaxi>Px$dYw@$PTJ9(l$uArFReb;L zS0iB_kA%B^df}JTa-twEwjWfGkKum`QGSPw^%DySyWlG4b-T@_mF>G!k-3~-Ni`h( zBOV*8Mn5`}>h>x^Nt~ka`g=?0KG`8%AL4pU?M4di%2W%1uDsU$<7bSPw8}EsW5~O} z6070KeCN*X4&=1Oxb=fStc4pJ8$=`|NEqWhG*5!~l7wuKf!-Gv7qe???;-Bi;Ams) z-$`^f_Esd?z3!%{!Hz+ppd2Mn*MCj7UI{^Ah;dw~gSl9bxg~LM+M}Bz)3M9fZqney zG)a5rr7&1}4~5|&EN%1qtQoJqcAprWku(C1%POUO5%b$lnNz;EdJ#pKIP|Z{%AH7)0@rj4J{mSuHpyCsK z@kdzxPwVUO5x4(#63cFi9=!{pB_Jh=2>>M;Kt=oWpk=|v!O`^XVJxrnimLTkDLQng z?}NY$*wEpoogWRMdxv0;je~S!L)bM}Aj?!vPL9`c@d4~2r4M)E`MkK?_EmybBe-9P zh>88-Rk?i>Nh?VS=xgEHuYy+OCVUhC?L#cX?@JjAv^!F(mcOw=vonoQjk*I6 zWto5L11vBEP#YjI0Q_Bk@MDK7XP|*DvqZ_cy1FXjeOC6c@I2D@0u461HsnG9h6P3` zDO%_bwFTndLLgubfyCo`aWkOkmynP^W|1OfAYU2YfL)lrCEfY*v7uj&K)Sc%BbrrG z#LKK(m0FsKe)gAyr7TYmi;{7C*3(E<9p|@py$&?=4HgjiK`6Y(6 zbIet>FFT4gHI+*{yxen(Ce-U-#7tGwh``0d#m(D4Ssln)Xz)iv+CL!jfS8Od5R#FV zKk+u&N3?2!F&eC$!H__LiulO+>aF+rkzvbwGNg}_h?Mjln77hXQxQ0UsPJ($iw#iJ z)YNuh9bsT*Mu$G?kPl0)c6L3^D|amu6Ak*cd+Qbt+uQ%9>KLQJp-4>o^wHK}se;>& zw)$TmnXbPRSgbCs47B%75h``suYSgeaOL|D>1Oer4Q{z1F4jXvAt7?sr(Xm->Yzb8 zH2g9rJR^e%iC9UN_N8_D*9FTaDVRLMVU(MepP&D%#q=S zMGV z&z?Oy{KCq{h6N(YfUq#!X|Me!(4aMd4)P~(vt<~2*b{g%1Q;eMvo!gkphd;RplWMt zBP(4A3CMjQfP@n{OG|d(^bW09l{*_AlSF;s{Q1mVySmI14$5m?!-S<$PmkPwk4R58 zMjtqCNa(z+oQ}Xh+qgV#pjjkao88K77(h#54v7oV!YTLDPA(awnZE0z2 zYC?OQz+K>Qy*W`~B`HKtk02l*VB@lxd{ocP&Aqd`+t~OHGrSx`V8lVCg=KciK z9kX+D{zG{$jiCm+4dbfUU7!4CXAMC2VE~=oN{>VK;UfLWZ{P03#m9pk7G-N|tIzT$ zk~5jsZ_aDd9(BKMA2N~+VeW>7gCnP)a3dx*76}^9*RJSM{ccGe5+06!cD!vjD&%=& z?Yuor!_B=x2td(C6k=sRT2AvUlWWur$YT)IBYQu+N9HH zqxvK}oeP=I^pln;_D|H;uXbfz zjEw1xXv;aTiD@)Ww*5({rC-`^sjj*Fco3}5{lbTIvVZ+!Vg`f9n>kr_ucIL0>FYff zwTOhdA9i-eZBLmiKNbZN`RQOZA3HQR8y4R%20jLOXIRg~(jG_Q)cA5MUSnYfoQ!=I=VY{G074d%;Y7JjpSk5#(D=Z> z^Lg`ZDM_(0hJ{>8rQVO))~I_EHe4$Dxf?!1^+}R{)w-#Pp7HPOs~dIL3p)kNDsbT; zFYM&}9L`9V0Z_|mR{Xf##@CTHg4@3IQMmoEZ6O|d5AW2?7hYFQHACH!kI#C8WaQ44rmKVp6ZoG7cW?{xdI8Yv6}=rR!12@y!t0i4OgAaBGNybKQ>KW<7_41=P+`_#B!{{MR*qkAUj z=(A+PKI9!&>;KpOQW&KE<;2F0LXtcf>->u#2a2zG_?L2 zH#<)4ay(cUP*oGZ9juQK!cHjL7C{42xwjw!GlFCY{AwSKitOu)WobCDyn|g*&udq4 z#aRpjWp3)}>6t@j8#$MjiL=hLXT)E8uiVRQCdgp}xDB`opVOsV8GL~C?`9O%4_0o zXlpAdbO&LFkZ}yeHCmJ$5Lz=AB{cL8mpp5OFj_JdmDZA;Bw<2!jU^*zLqkIsT50by zXK?x>KsgWyt2b<4M09kK*rY7Cd!EtN=|v*%y}hd|l5I^4$MO#!@Q|15SVawsxMryd zHq;<}Sx@O8pOO%{>HGNnnxlj-xv65tCk)hll)ci|5-;*K{lOT&0LlzB1W=lYJdZXE zIUX=6xRy3mr?iN;7E*iE`RUkxUMw#uT(Yvir;S!cy+YU6f(ft0XWSZt=sR$hM(%tW zBcKO_;m^AWH)rQ&Xm&-y-9omc>>V9{!%otl_mU?rUNE1G4N3win1hbLeEG66S;fET zSk+&Cap8q%fQnF6O%2t}%}qp9ltM2tF|pEll>{*he>>#;d%o(PciTC(DQFtS&;Qux zX-0NYhmXyVI(;iW*D(1+qmwdv`935hyQ&zy`MoIQJ?(jfzABv1jEIQ9A|NO%m%MZ5 z2Erb&5Ezn`nCR$+^Ua~qSZM?xLTFSJk@aXX3Z!A?9&2W*SsduG#12(HDJs&r`Lt-H zX<~xv?%lgXJsLxTA85Z6s0Bfz5|pSB|EIk#kH&ic+P;&bqDUDdLxW>TM2S)v6Nh9> zB9t65lbK|mNkWH^bYxbDG7lM}I;N9(DkY&zB|O)sbAIpoz0b3rKc2PT|K7)Ht!~`D z_jmYw_P+MDuf2ESlW|%L8$nk(=a%`U>)zv6f2mL()nCM}&ajKWp(mQ4+BK1T_RhWo z2ezW6px!gbUmyiCu=)v%JbSj$(%$g(U4KSJ<@deC;C1*!M7AA1d>CEtGYVAkyll}> z9(sY-`BO8)wJ*1~r)4YccPAffdbLILdQj+C_n=z_b$z;9p`~f<>~6BS!Z!WC1vzHH zt}{c`xb-#YD^qZ}X}e!Q053=ic$HfG1QuvpYvNI+c9~@%x48))5=`|!b0VpE?m5Lw z{cU4^TjtcqvANC}`h59z?VOaV9!VDdR`HGgxJ&6ntPHp6{(&xYAECdcT&fFV#B>+` zbC2rK_Jxs|IRJ{9)Qk+;Ei4D9DWDohQG$lZUOvyToOECq8y`3B&b>%WPj7W6{)!kI zDzF0}b-9GL{Aj~pjqPp+Dj2orR1`9rfB=K|BQ{(Z#}OSH>yJ(>1?NXxZ+}CI%}Vg6 zmk8Z?%h0{MJsmlM>e^p@c*?V%D?|qcHL^F#%PFnXd?E-a1ydXn5;8Pm(np_OR<;Z4 zl$MUpFDWT0fmi$lHs;8PNl8fwD?QiKeeb?kc9@Iz6kBlwY~|Fq`V_j?#m0)Kcugxr z)HiWt)#+c1#zwGWm=yvI4f2C0QXCb!9+z)z$OSF{gy14Su%`h#X zpl!b-uiF@skWwy>=`6y<2SY)S%31p`=c?J$dG?iAMj=)$+M#-KBKlRj3QO7}d+#;< zr`AcOwP_nCI_tS|48|ITJBFW3TOV1TpL6pOab{jmQEZT^HLN!Z#1c9;#O>&|hnNxe zUte0D)(Y?DZh2=e(qPHdH~XTY()iD9&I~)PBR?Cz>{giiL(@4rA$a@tK7Tr!QW=w>)q^4BGac|I{vqV;iF)IXspFJ0T@Q@I%?=Rpl~6b%W3 zz#G9m$=cc;R7;i#2cvPnuy6;gTh`YeD24Xy-_J47`}Ry_3VU>syKy0hTB1lpk%zEO zc4hFlnB%Hm;Y@5hC7l)Mkq%3v5j(Y)m-p6okXnSh;NhvBsX*g%jBTyLY*Ygqs{7|2 zfwAxGvs3LTc4A3D1}nX&SKLdu z+&2`EVdmHq<>SN{qu~##WqG8e*h86xWwDDag^e^cd_qE&ExC5E=w9ChSxx7QL+0Y_ zVClLiQ@f9-Kiz>Qa+Z$T7xnnc4Y%=7i?h@3*!+RZE9>*4w=bIYZVg?xR}FHgdCR$1 zuV8gw&5xbtz0KlIP75LI`^5xOqSmW7NQ!63WIy^WME`#+C%q%vA}4QjjJ`=%nHVUS zh72eI+PvH@dyd1`ZorxUSXlv)82s()d%3L65p1KgkF+GXVt|t>SEg(_i@o7o@#qe| zH8V9`4`&ND@3CcEtY%hcV_Tad2>3$%oYL9?J-6dC-b%7jx?@2LInzTQxLA1H8x@-U zDHYPpe%Z1tj@G(CJj1%bG6`YXvR=7zh4qBjvF>%Qv>=}!P5md%oFp1>@3M6BtUKm` zmxiaOBj+c(M?d_LoLiv!t1x#(MFl@Ue})}T4W_J6Q&SgC_|y6`lsLTKnwXTtgiRb%!P=1;5GqJ$Igd5yc~yZD#jq@|%9ylHodm4yyJ@#}^Ylffuq&FIcdx z7NpW1-h8Rk=xvH;Z-4~V1=IfXo4ZKr0YrJXWA^j!JHgY}*7|O0lrtB-m=D|+05{fk zejhh?)yy=QeoWBf6%g2r{u#fe<-G@GjK0yBd70WJCJ>wXqKh&8-1#ZFygxs1$24)r zwd7piV5^z&@w&D)OV{ZGadL1(OKU6~uzQe%Dfl8aq?{mO%G)zxxm_fq`mi zX3cuo$Y}7U;o!_b8i}!0y2WiBZjFjC_4CACxVm^8xKrs==!ct~XVJQ{1~IkW?1)04 z&ESCf;B;Wi<;#~-GBWH1)cs|Bz-SDIid0mA`xu^@3h(LB1F-N39qRu&#QqC~uD_ko zq41mN`pN~EFNehBm#<%Ez1J4K<4<_Y9KP1`FGdtC!5D$82s#FrZVaTqFSLN?P*Suj z{|>P-vD}?yeLMA5E;3fE4sW&Y>lg`_ch0yrxym(u`ujzX6}c-}O(>&CD-!&pAGS?w z|32<*#A}+En3RuuC5QF&_L>4VzGT&&61|<3o-9|@rqeaCZm1|H`kanVfO5<}QZ^94 zyq5ycCXWxdTVAlD#44Yu^jbN1wQUzju-f|i4R~^_N9`}Cjp#kUE{y0T68V$i;QjZi zt|oh$o!)M0VuJNUQjwI5#M48-n3x&(gJ5$)@)B_{Sg0!<+F79cP*73>qTzM!MQPGU z5oD%~mVwp@#J97vh`FtN(=E5y4UJuFT~(4{u6VW4x+r_x?ulODUZWjU6vcYU)OOSG z-HWGScOTYM*M-DpZ3rm0|MknH*V-xfo-EZr{jcD9VI8XaN*yfwrr*8WNSXQar6$hE zD;SJ!ZF_s3ayMG#Z?9NcxIo}I1cx=rt8@FyQ0t0kp%FfgB^QJs17jagKGGTixvhZ4 zTSfNX%e{m7jvvmIEe^QrmD=w`@O}dsjN%OOm{Z3&q4}!1khR%%pJw=Pa2cN%So~-n z4ZZ)(biy#bdyCM;3qcp0=V-y_cq1ycI+rbni1=1 zwx%E&oSC0j0C7JuIx1>heu7~=jj1v52#RYxr3|GP^#%FA>u(?t`1ch^ioX$rT3K7C08a|8&%zNmMWUtI(Thm`5>kNA_2I+ct&;4~; z5woCqPGLqCeJ{w**O}V$Hm}!a0#C5kfB5vtVA8e8@kiP1rEUX}Yigywnk<60@ORG5 zbCMp?B{mbmN(50HL|%A_7fqv@Hf#1SPWC2ATP-CnNk+o@6>*YgMn zWDb0#{_mrK9-8-4cbYB-I4N*x^?py3u(D}&Z7S?b+!;T2n}c#Pi>V|k=fww=ozPVI zAoC|5@YZjI}k>RodYU>0XH=i|b<#vGXN?yJQ5|3LM_$s~=0)CMk z*KOVcI@FDX`^WzbyLN?PiJ~nfqi&vIJ=%vy!(%^wECyUt)!)yFR0UBW07L}Pv6*~v zsjaCwhyh8*)_#0lLS`UUOF$HKC5*!nw~Yt!e0iTmZehH&2cxdmVQyubE_OeK!lxK^ z5(M(?Gkae|?vBjQKN!YwWGirvUWqLag&Ph!PQ*wN{jl8TKl&Tj2Jj%Rf!UNbH#dJ$ z_oJT02$^{%bQP?E4xY4Skd&6LZEMRtpR0r`?AV^a!S8NA7IHpJgH#Kd`*Pt__53k_tFQ&=IZT160u~Vu$RXH$t#{|{3%~r| znK7&Nr%I`FByhLaNoD0tT<)Jl(I(Oa!63q|DzN0Ooa}g4bf*c6(BE8~nwpwK1#%nR z4;(DS*-1B%i8tw6Fg?=$u+>{u=DmAxbM8L`t9*PrLXM4S2{tODuHL>c=@2YCYInCW zk&k6O4i(Vx?Eq6RIjP9^5|rnc&L_NOZseP+UX#NyESeB024~vQ0Q;Cl_;KlUuJJVd z^tvi_2lRAgQ_of*_w()BHwuM@CXl(5`<`K5pni@bcvblP6^WOfje)fCoSQFl($`T*zX&xefRJppSfY!9T&%L(_l9C`O$Q z>@3XIQv0}>$KVPm6eA;}LrNgmfu)fK+lpqTFF6CWZ*6*L!z`EAjVufecm$p2FBBX| zR0fI!$@yUfU!QHWH~$Oykl^WWw5EH4hZ;|OJu>527k2!04m`ol#&LV%$NP-+Hb8H& zYI2SDU+*T^?w`}MzV^*UQni;{aL{S7zpwn~i^j|hEddhS2*ft`rRs71*T0Q;P<3j8 zT!8!@w&ELbhFD~mA(;E`UqscbC@cG@?#r5uy>rKmU-!>d)E3l*MPGo{{D#H+m$=Fw z^%<>5UCef9s#m{$%?N4%9OT9hi=qVH;$6DA2Gy9A%)rV@i~T?>8&VXV9|IN*U#`yQ zdGj1R$beis3{4%1np-(<)t^TfWem96boJ_0!qB0RL|#!bKqCPOBa1~{kYTMm3a$_Z zi_Q_SdI2l4w0rjMt!`+bSy)&I3JyNy=Jt$@uXvZliWPWK(s6v)~sxZwr6( zMY{HWem(=C7W^3CrqYkr6tTjC`@+p(ST!+paNDNfTls~B>yZTwYyL8DsMxr6BY^6b zweQ`PGcahRNW*0$c)#ttR<@;Y-x8#cg%S+_X}U9kL8^uN!mD^EF9;g+%k)V@I>P`| zEK)i2(^ghiFVS4(BX&J<;-)TnXZh*Y48h?Hc&~Y))!{~@g^0z2A-xIa4OZ-TK7&xq z!rYjocGboE``mAIY+}^NyNg~M^;CMP$Z(#mNMHDEv6bNJ>S85_6%9AYplkP1gyJhJ zE0>0Rw^{U8qCA=>uB9F^4SjFL_m6@|JjICFe4$xEh<{@wgMe@ zNoEgEu@0&>s&YdS&l}9jZ%r)eVb9Jv8IMeF_CDM{3$&``*#E z^Ij~mU58N#fTMMU)cN-13gsjUS5TG__E|3WjQ_-h`9R>dvss->-fPoq#^8Uj9s{Pz zra=g9VLqSay|z3U6d4(qmzVc?0SqVyxZa!P<;RKY0HTC6Ku|Q>d6>XkM2BiEd0-E~ z4#8bV?WsYPN{JmhQ~*~?If=*?oOO7_Z=IPtuUT24iT2fqDB&(Vo_zc9GeE9==F-#0 zO;I?6p&gx{1=ZEn2Q-}+WQPb|g!{yB5$m2+v>_$xuNm+kxCXL4up3E~E$mhFaiH9N z6fwj}P}A0ZB|bn+_iY9%z^WbTvy|u$M3(3sZMTW%^3>B3&*kFREbh3*^9j#41?cB) z*uqRpajJmOEGz=!H<|5A4Ll$yo4@Ccn5zZ_Vx=`lvL1F^jKwwSQy6fTva~!8)sh58 zMn*DYH3ecvvhpe{x{_-R?w<2TbjX6zYLn*Mzs%oT)2LWv9|54Cx&eAl;%$ZPuq-1x zyT!u{p+Oaq@;z{I3NS25~S;#9fIEP@YsK;$$Wz&tfd#Gg1P@g9r#wlIgCbn+fI>l+&3zA$%TD{wSl_*KT ztRZQcu|OYRWO=4v`_bL{v61>vtiwQfJTfdIO$^}ured1w*vFhRrjsJ@6C`U08WYP? zfBM_*arZp5bUl`GmOr!TI`+-e#_#4qkSvfa=hAG$Zs?horCQwF-D?L2ce5NYh~k%; z9G;j6YT$CG!?#u7KG$g#f596#nrCFh?|@0f#ux&X{OHN9X=yR^k-B^sc6nxI#@yBw zg4387QM62jB+jiR8EPEdC|d^y_aJ^@P1DKGi)x9I>nH&y8nIhQ)CXpRzL$ulu&Pm^ z^(XZ;V|GpQG?ajW2yqEhSz5N5>Ja&*yqlr8xR_XTA`C>3T)P0#l_@w>v#{1Lv^)oq zLAW+h#s>Nt8z*})zNSVN#cUkMwKUU1LN=4s67m;H(8VAjl<&T1?Ks&5p^0ALKl(Sb zhz@&DX=$k4hGEuA8h06tRwhd=BNaxGj}nBfqSgBphGG^ZObDXi;7}Hk5ZE785TIl( zd_2#&mgu{81&Gxo!#v2wEr69C9v$Ti*tXl6KdsY3!NsM7RopyE((6YFvRjen7;cTJ z(s$YTp3-Ue=OSy(57Fj6a$oWU$`&n(y;j@+RqHF)R&4BG*+nh8gz$Lya}7#OKED!b z#^&J%R!}%|Cgk;swvNs|KZX(D2@{+$uY`p5Wizu7NKS$wV&|)%5oM?&KV)_6HMUK$C$o zhzeW>H5{NZ*D=Mf$%d8q+*{%K9FTzlShA+N`V^FBp$LU(!xj1LZr>TlZoiKxjU2h> zufKxPjJ@DeHI;_GzJ=BSK|vKdj>D<|;-Rpap)kI|U%uEMQb4<_m>5e=zH|PIhEp=% zC-^{tiNFjgz+8ntypw*WsNblmsR^69xw%>1z#!55&xhe>1!8O3+trUPe|j>4k<;(! z`(%%OZ9RlbxBwj~c@RV+9DVPebx&URWIfuO_(4MjzKUeB*R$iuHtFC4Gsbsg;vgujEo5h z;ic=jdG803GHi#yvw0Y>z7swZ0s;wVe#H(83EaDvc&A2a4Ko8T@0Qus<>}Fa1}cv!$QWS`2Zh{jbc?d8^_y?UHCG7d74b;>W3W9xZDldrec*CXi`*6&|idtSCc%*OnBDolRgH%Ays|oHk2xoe0L%b%p5MKufJauh06w|_VxKjS)C>jYQU2CK7TGv6jfkd zx+dO71P51RF8d5r#1JN}M+*oDhmJaI1f}f{W*6po_Wg-9HW>eaQD7@T8tBI8K*bp8c&&*8A z?9BsZNyiBWBEBKd3h?O^02#XPo_$~X^x9uH8Tk}DN|2KyoNs_^Y8AY~Y}5YaOJoOL z!J3CWdCUI&`$>}tNtYS!#Kc52^@gCAoX8b%o_0U)zmMO?`1| zh$0ZDtKjG;jsVGaZbAdH#Px7ARfGkq6$Lohhnp}9_rQ1jI43E(UVZPqO0&E;O+#r- zKCv4JvKm9}?J&Ta5FoJq8Bg1SgY@@+le*=y@YmIPXmZ#MygPnZM$m#RQV>?+ymfum6f|t)ZuH-;8;q2#e@@(GkRY&f&-M;2JaX z!?JnZ9L-unhrLBl*raWb!m~ao{$Hoh!TbB;7w=Rq^F0_5rqhm zbg~p&U5_H~37g%M-CY6F4LcFpZMvVF5e#ANGTL^^(fR-ZrkM%~2n>DxY&iMz`6C~* z3yU+?ZVi}i`2G7p+;NWL6`8FR$?Kn34;YrwB92L$8Xq4gnPVjBY)4)FTEfMd4zPC|&n&eyvN|WaayTeMU@7V*UZ>gpSh7Qv zgYj5n^hEDd8!K&D`HuTUR`QrMK4q111w!CZPsy)g6hnUgOXx?|)3q-}#K$yuy6IpykIVg+QKrgoD>jcY~1CiCch{3{(auW zW3F!|oaR4jBi;p-M${=K=r+)mdoh#*&l5eM+iu^!eF;1^7~qq5cH!NG_yN)efDZ&| zy^cb(acN4CBZR#tL?wK2nqM94x8_6DYJ6k>4E6}7+7ngz9ytn;QA3Gw3A7z4xrsuq zjA)n7Kc)tqk|lZvTx$wK9FXX8IZk8wX{@mk>AvBa4I#NqS4# z4pB&yf$)^%)WKn`r;sUVz*8@XhrpgAKPPqYT>@WHz+1B&u^Ffiq$o&#z?maXkUgwFA{<645q@Yrx1-CDK#%~ndOCsxxi^s2mRb1 zwM}kkEYczb$DZ5pc-H;T*viRU;nIgtciwPouL|Oq2q<8TQBR}TfX&AuQZ_?HGV8=w z5Z&i2JCP*=jt);wTC%1Q#R`&$rXXHO#Et)a;TPFCL6%P&17EO0e7SKOR~WPdJYr&R zGE_0d12ffvu)X;pWhA^NWGZw>&#;?*`}}@5+~Y}&oh(i3mlI8$r>mNMzAX>kDWfEIYq&S;iPFNKfk0b264(xdLus*w~2LNvaqHRYZ46vax8)qhjxgH?tBh=`|k@a&=f_^$1;f{7xe7 z9`Ibeh?A-6OJ!tyJ^fSQ24~h}%OFJvr+=sB{trj@zc2pxw*3FPHr}nRpXA(X`yj_b QgMu$*1vU9x*-JP71DNovkpKVy literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/recipes/index.rst b/doc/sphinx/source/recipes/index.rst index e18ada0fd7..9943989b8f 100644 --- a/doc/sphinx/source/recipes/index.rst +++ b/doc/sphinx/source/recipes/index.rst @@ -94,6 +94,7 @@ Future projections recipe_tcr recipe_tebaldi21esd recipe_climate_change_hotspot + recipe_bock24acp IPCC ^^^^ diff --git a/doc/sphinx/source/recipes/recipe_bock24acp.rst b/doc/sphinx/source/recipes/recipe_bock24acp.rst new file mode 100644 index 0000000000..bc1d4d3717 --- /dev/null +++ b/doc/sphinx/source/recipes/recipe_bock24acp.rst @@ -0,0 +1,143 @@ +.. _recipes_bock24acp: + +Cloud properties and their projected changes in CMIP models with low to high climate sensitivity +================================================================================================ + +Overview +-------- + +The recipes recipe_bock24acp_*.yml reproduce figures (Fig. 3, 4, 6 and 7) from the publication `Bock and Lauer, 2024`_ investigating cloud properties and their projected changes in CMIP models with low to high climate sensitivity. + +.. _`Bock and Lauer, 2024`: https://doi.org/10.5194/acp-24-1587-2024 + +Available recipes and diagnostics +--------------------------------- + +Recipes are stored in recipes/clouds + + * recipe_bock24acp_fig3-4_maps.yml + * recipe_bock24acp_fig6_zonal.yml + * recipe_bock24acp_fig7_boxplots.yml + +Diagnostics are stored in diag_scripts/ + + Fig. 3 and 4: + + * clouds/clouds_ecs_groups_maps.py: Geographical maps of the multi-year annual means for group means of historical CMIP simulations from all three ECS groups. + + Fig. 6: + + * clouds/clouds_ecs_groups_zonal.py: Zonally averaged group means. + + Fig. 7: + + * clouds/clouds_ecs_groups_boxplots.py: Boxplots of relative changes for all groups. + + +User settings in recipe +----------------------- + +#. Script clouds_ecs_groups_maps.py + + *Required settings (scripts)* + + reference: if true, a reference dataset is given within 'variable_group' equal 'OBS' + + *Optional settings (scripts)* + + plot_each_model: one figure for each single model + + +#. Script clouds/clouds_ecs_groups_zonal.py + + *Required settings (scripts)* + + group_by: list of 'variable_group's to have the order + plot_type: 'zonal' and 'height' plots are available + + *Optional settings (scripts)* + + filename_attach: attachment to the output files + + +#. Script clouds/clouds_ecs_groups_boxplots.py + + *Required settings (scripts)* + + exclude_datasets: list of datasets which are not used for the statistics, default is ['MultiModelMean', 'MultiModelP5', 'MultiModelP95'] + group_by: list of 'variable_group's to have the order + plot_type: 'zonal' and 'height' plots are available + + *Optional settings (scripts)* + + filename_attach: attachment to the output files + title: set title of figure + y_range: set range of the y-axes + + +Variables +--------- + +* clt (atmos, monthly, longitude latitude time) +* clivi (atmos, monthly, longitude latitude time) +* clwvi (atmos, monthly, longitude latitude time) +* rlut (atmos, monthly, longitude latitude time) +* rsut (atmos, monthly, longitude latitude time) +* rlutcs (atmos, monthly, longitude latitude time) +* rsutcs (atmos, monthly, longitude latitude time) +* tas (atmos, monthly, longitude latitude time) + + +Observations and reformat scripts +--------------------------------- + +* CERES-EBAF (Ed4.2) - TOA radiation fluxes (used for calculation of + the cloud radiative effects) + + *Reformat script:* cmorizers/data/formatters/datasets/ceres_ebaf.py + + +References +---------- + +* Bock, L. and Lauer, A.: Cloud properties and their projected changes in CMIP + models with low to high climate sensitivity, Atmos. Chem. Phys., 24, 1587–1605, + https://doi.org/10.5194/acp-24-1587-2024, 2024. + + +Example plots +------------- + +.. _fig_bock24acp_1: +.. figure:: /recipes/figures/bock24acp/map_netcre.png + :align: center + + Geographical map of the multi-year annual mean net cloud radiative effect from + (a) CERES–EBAF Ed4.2 (OBS) and (b–d) group means of historical CMIP simulations + from all three ECS groups (Fig. 4). + +.. _fig_bock24acp_2: +.. figure:: /recipes/figures/bock24acp/zonal_diff_clt_ssp585.png + :align: center + + The upper panel show the zonally averaged group means of total cloud + fraction from historical simulations (solid lines) + and RCP8.5/SSP5-8.5 scenarios (dashed lines) for the three different ECS groups. + Lower panels show the corresponding relative differences of all zonally + averaged group means between the RCP8.5/SSP5-8.5 scenarios and the corresponding + historical simulations. Shading indicates the 5 % and 95 % quantiles of the single + model results (Fig. 6a). + +.. _fig_bock24acp_3: +.. figure:: /recipes/figures/bock24acp/boxplot_ssp585_south_oc.png + :align: center + + Relative change (calculated as the difference between the scenario value and the + historical value divided by the historical value) of total cloud fraction (clt), + ice water path (iwp), liquid water path (lwp), and net cloud radiative effect + (netcre) per degree of warming averaged over the Southern Ocean (30–65°S). In the + box plot, each box indicates the range from the first + quartile to the third quartile, the vertical line shows the median, and the + whiskers the minimum and maximum values, excluding the outliers. Outliers are + defined as being outside 1.5 times the interquartile range (Fig. 7b). + diff --git a/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_boxplots.py b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_boxplots.py new file mode 100644 index 0000000000..2f24436fcc --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_boxplots.py @@ -0,0 +1,227 @@ +"""Python diagnostic for plotting boxplots.""" +import logging +from pathlib import Path + +import iris +import matplotlib.pyplot as plt +import pandas as pd +import seaborn as sns + +from esmvaltool.diag_scripts.shared import ( + ProvenanceLogger, + get_diagnostic_filename, + get_plot_filename, + group_metadata, + run_diagnostic, + select_metadata, +) + +logger = logging.getLogger(Path(__file__).stem) + +VAR_NAMES = { + 'cl': 'cloud_fraction', + 'cli': 'ice_water_content', + 'clw': 'liquid_water_content', +} +PALETTE = { + 'high ECS': 'royalblue', + 'med ECS': 'green', + 'low ECS': 'orange', +} + + +def get_provenance_record(ancestor_files): + """Create a provenance record describing the diagnostic data and plot.""" + caption = ("Relative change per degree of warming averaged over the" + "chosen region.") + + record = { + 'caption': caption, + 'statistics': ['mean'], + 'domains': ['global'], + 'plot_types': ['zonal'], + 'authors': [ + 'bock_lisa', + ], + 'references': [ + 'bock24acp', + ], + 'ancestors': ancestor_files, + } + return record + + +def read_data(filename): + """Compute an example diagnostic.""" + logger.debug("Loading %s", filename) + cube = iris.load_cube(filename) + + if cube.var_name == 'cli': + cube.convert_units('g/kg') + elif cube.var_name == 'clw': + cube.convert_units('g/kg') + + cube = iris.util.squeeze(cube) + return cube + + +def compute_diff(filename1, filename2): + """Compute difference between two cubes.""" + logger.debug("Loading %s", filename1) + cube1 = iris.load_cube(filename1) + cube2 = iris.load_cube(filename2) + + if cube1.var_name == 'cli': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + elif cube1.var_name == 'clw': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + + cube = cube2 - cube1 + cube.metadata = cube1.metadata + return cube + + +def compute_diff_temp(input_data, group, var, dataset): + """Compute relative change per temperture change.""" + dataset_name = dataset['dataset'] + var = dataset['short_name'] + + input_file_1 = dataset['filename'] + + var_data_2 = select_metadata(input_data, + short_name=var, + dataset=dataset_name, + variable_group=var + "_" + group[1]) + if not var_data_2: + raise ValueError( + f"No '{var}' data for '{dataset_name}' in '{group[1]}' available") + + input_file_2 = var_data_2[0]['filename'] + + tas_data_1 = select_metadata(input_data, + short_name='tas', + dataset=dataset_name, + variable_group='tas_' + group[0]) + tas_data_2 = select_metadata(input_data, + short_name='tas', + dataset=dataset_name, + variable_group='tas_' + group[1]) + if not tas_data_1: + raise ValueError( + f"No 'tas' data for '{dataset_name}' in '{group[0]}' available") + if not tas_data_2: + raise ValueError( + f"No 'tas' data for '{dataset_name}' in '{group[1]}' available") + input_file_tas_1 = tas_data_1[0]['filename'] + input_file_tas_2 = tas_data_2[0]['filename'] + + cube = read_data(input_file_1) + + cube_diff = compute_diff(input_file_1, input_file_2) + cube_tas_diff = compute_diff(input_file_tas_1, input_file_tas_2) + + cube_diff = (100. * (cube_diff / iris.analysis.maths.abs(cube)) / + cube_tas_diff) + + return cube_diff + + +def create_data_frame(input_data, cfg): + """Create data frame.""" + data_frame = pd.DataFrame(columns=['Variable', 'Group', 'Dataset', 'Data']) + + ifile = 0 + + all_vars = group_metadata(input_data, 'short_name') + groups = group_metadata(input_data, 'variable_group', sort='dataset') + + for var in all_vars: + if var != 'tas': + logger.info("Processing variable %s", var) + + if var == 'clivi': + varname = 'iwp' + else: + varname = var + + for group_names in cfg['group_by']: + logger.info("Processing group %s of variable %s", + group_names[0], var) + + for dataset in groups[var + "_" + group_names[0]]: + dataset_name = dataset['dataset'] + + if dataset_name not in cfg['exclude_datasets']: + cube_diff = compute_diff_temp(input_data, group_names, + var, dataset) + + group_name = group_names[0].split('_')[1] + " ECS" + + data_frame.loc[ifile] = [ + varname, group_name, dataset_name, cube_diff.data + ] + ifile = ifile + 1 + + data_frame['Data'] = data_frame['Data'].astype(str).astype(float) + + return data_frame + + +def plot_boxplot(data_frame, input_data, cfg): + """Create boxplot.""" + sns.set_style('darkgrid') + sns.set(font_scale=2) + sns.boxplot(data=data_frame, + x='Variable', + y='Data', + hue='Group', + palette=PALETTE) + plt.ylabel('Relative change (%/K)') + if 'y_range' in cfg: + plt.ylim(cfg.get('y_range')) + plt.title(cfg['title']) + + provenance_record = get_provenance_record( + ancestor_files=[d['filename'] for d in input_data]) + + # Save plot + plot_path = get_plot_filename('boxplot' + '_' + cfg['filename_attach'], + cfg) + plt.savefig(plot_path) + logger.info("Wrote %s", plot_path) + plt.close() + + with ProvenanceLogger(cfg) as provenance_logger: + provenance_logger.log(plot_path, provenance_record) + + +def main(cfg): + """Run diagnostic.""" + cfg.setdefault('exclude_datasets', + ['MultiModelMean', 'MultiModelP5', 'MultiModelP95']) + cfg.setdefault('title', 'Test') + + plt.figure(constrained_layout=True, figsize=(12, 8)) + + # Get input data + input_data = list(cfg['input_data'].values()) + + # Create data frame + data_frame = create_data_frame(input_data, cfg) + + # Create plot + plot_boxplot(data_frame, input_data, cfg) + + # Save file + basename = "boxplot_region_" + cfg['filename_attach'] + csv_path = get_diagnostic_filename(basename, cfg).replace('.nc', '.csv') + data_frame.to_csv(csv_path) + logger.info("Wrote %s", csv_path) + + +if __name__ == '__main__': + + with run_diagnostic() as config: + main(config) diff --git a/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_maps.py b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_maps.py new file mode 100644 index 0000000000..fe9a0946e5 --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_maps.py @@ -0,0 +1,516 @@ +"""Python diagnostic for plotting geographical maps.""" +import logging +import secrets +from copy import deepcopy +from pathlib import Path + +import cartopy.crs as ccrs +import iris +import iris.plot as iplt +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from iris.analysis.stats import pearsonr + +from esmvaltool.diag_scripts.shared import ( + extract_variables, + get_diagnostic_filename, + get_plot_filename, + group_metadata, + run_diagnostic, + save_data, + save_figure, +) + +logger = logging.getLogger(Path(__file__).stem) + +VAR_NAMES = { + 'clt': 'total_cloud_fraction', + 'lwp': 'liquid_water_path', + 'clivi': 'ice_water_path', + 'netcre': 'net_cre', + 'swcre': 'sw_cre', + 'lwcre': 'lw_cre', +} +PANEL = {'ECS_high': 222, 'ECS_med': 223, 'ECS_low': 224, 'OBS': 221} +PANEL_woOBS = { + 'ECS_high': 131, + 'ECS_med': 132, + 'ECS_low': 133, +} +PANEL_LABELS = { + 'ECS_high': 'b)', + 'ECS_med': 'c)', + 'ECS_low': 'd)', + 'OBS': 'a)' +} +PANEL_LABELS_woOBS = { + 'ECS_high': 'a)', + 'ECS_med': 'b)', + 'ECS_low': 'c)', +} +PANDAS_PRINT_OPTIONS = ['display.max_rows', None, 'display.max_colwidth', -1] + + +def get_provenance_record(attributes, ancestor_files): + """Create a provenance record describing the diagnostic data and plot.""" + caption = f"Climatology of {attributes['short_name']}." + + record = { + 'caption': caption, + 'statistics': ['mean'], + 'domains': ['global'], + 'plot_types': ['map'], + 'authors': [ + 'bock_lisa', + ], + 'references': [ + 'bock24acp', + ], + 'ancestors': ancestor_files, + } + return record + + +def area_weighted_mean(cube): + """Calculate area weighted mean over the globe.""" + logger.debug("Computing field mean") + grid_areas = iris.analysis.cartography.area_weights(cube) + mean = cube.collapsed(['longitude', 'latitude'], + iris.analysis.MEAN, + weights=grid_areas) + return mean + + +def calculate_bias(model_cube, obs_cube): + """Calculate area weighted mean over the globe.""" + logger.debug("Computing bias") + diff = model_cube - obs_cube + bias = area_weighted_mean(diff) + bias.attributes = model_cube.attributes + return bias + + +def calculate_rmsd(model_cube, obs_cube): + """Calculate global RMSD.""" + logger.debug("Computing RMSD") + diff = model_cube - obs_cube + rmsd = area_weighted_mean(diff**2)**0.5 + rmsd.attributes = model_cube.attributes + return rmsd + + +def calculate_corr(model_cube, obs_cube): + """Calculate pattern correlation.""" + logger.debug("Computing Correlation") + grid_areas = iris.analysis.cartography.area_weights(model_cube) + corr = pearsonr(model_cube, obs_cube, weights=grid_areas) + return corr + + +def compute_diagnostic(filename): + """Load cube.""" + logger.debug("Loading %s", filename) + cube = iris.load_cube(filename) + + cube = iris.util.squeeze(cube) + return cube + + +def plot_model(cube, attributes, cfg): + """Plot each model.""" + levels = [10, 20, 30, 40, 50, 60, 70, 80, 90] + if attributes['short_name'] == 'clt': + levels = [10, 20, 30, 40, 50, 60, 70, 80, 90] + cmap = 'viridis' + elif attributes['short_name'] == 'clivi': + levels = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + cmap = 'viridis' + elif attributes['short_name'] == 'lwp': + levels = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + cmap = 'viridis' + elif attributes['short_name'] == 'netcre': + levels = [-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50] + cmap = 'bwr' + elif attributes['short_name'] == 'lwcre': + levels = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] + cmap = 'Reds' + elif attributes['short_name'] == 'swcre': + levels = [-90, -80, -70, -60, -50, -40, -30, -20, -10, 0] + cmap = 'Blues_r' + else: # default + cmap = 'viridis' + plt.axes(projection=ccrs.Robinson()) + iplt.contourf(cube, levels=levels, cmap=cmap, extend='both') + plt.gca().coastlines() + colorbar = plt.colorbar(orientation='horizontal') + colorbar.set_label(cube.var_name + '/' + cube.units.origin) + if attributes['short_name'] == 'clt': + ticks = [10, 20, 30, 40, 50, 60, 70, 80, 90] + elif attributes['short_name'] == 'clivi': + ticks = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + elif attributes['short_name'] == 'lwp': + ticks = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + elif attributes['short_name'] == 'netcre': + ticks = [-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50] + elif attributes['short_name'] == 'lwcre': + ticks = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] + elif attributes['short_name'] == 'swcre': + ticks = [-90, -80, -70, -60, -50, -40, -30, -20, -10, 0] + else: + ticks = levels + colorbar.set_ticks(ticks) + colorbar.set_ticklabels([str(tick) for tick in ticks]) + + # Appearance + dataset_name = attributes['dataset'] + exp_name = attributes['exp'] + title = f'{VAR_NAMES.get(cube.var_name, cube.var_name)} for {dataset_name}' + filename = (f'{VAR_NAMES.get(cube.var_name, cube.var_name)}_' + f'{exp_name}_{dataset_name}') + + plt.title(title) + plot_path = get_plot_filename(filename, cfg) + plt.savefig(plot_path, bbox_inches='tight', orientation='landscape') + logger.info("Wrote %s", plot_path) + plt.close() + + +def read_data(groups, cfg): + """Collect cubes.""" + logger.debug("Read data") + cubes = iris.cube.CubeList() + cubes_out = iris.cube.CubeList() + + for group_name in groups: + logger.info("Processing variable %s", group_name) + + for attributes in groups[group_name]: + logger.info("Processing dataset %s", attributes['dataset']) + input_file = attributes['filename'] + cube = compute_diagnostic(input_file) + cube.attributes['variable_group'] = group_name + cube.attributes['dataset'] = attributes['dataset'] + + cubes.append(cube) + + if (attributes['dataset'] == 'MultiModelMean' + or group_name == 'OBS'): + cubes_out.append(cube) + else: + if cfg['plot_each_model']: + plot_model(cube, attributes, cfg) + + return cubes, cubes_out + + +def plot_diagnostic(cubes, attributes, input_data, cfg): + """Create diagnostic data and plot it.""" + if cfg['reference']: + fig = plt.figure(figsize=(14, 9)) + title = attributes['long_name'] + fig.suptitle(title, fontsize=22) + plt.subplots_adjust(left=0.05, + bottom=0.15, + right=0.95, + top=0.90, + wspace=0.2, + hspace=0.05) + else: + fig = plt.figure(figsize=(10, 3)) + title = attributes['long_name'] + fig.suptitle(title, fontsize=16) + plt.subplots_adjust(left=0.02, + bottom=0.10, + right=0.98, + top=0.95, + wspace=0.01, + hspace=0.01) + + cmap = 'bwr' + if attributes['short_name'] == 'clt': + levels = [10, 20, 30, 40, 50, 60, 70, 80, 90] + cmap = 'viridis' + elif attributes['short_name'] == 'clivi': + levels = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + cmap = 'viridis' + elif attributes['short_name'] == 'lwp': + levels = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + cmap = 'viridis' + elif attributes['short_name'] == 'netcre': + levels = [-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50] + cmap = 'bwr' + elif attributes['short_name'] == 'lwcre': + levels = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] + cmap = 'Reds' + elif attributes['short_name'] == 'swcre': + levels = [-90, -80, -70, -60, -50, -40, -30, -20, -10, 0] + cmap = 'Blues_r' + elif attributes['short_name'] == 'clt_diff': + levels = list(np.arange(-30, 31, 2.5)) + elif attributes['short_name'] == 'clivi_diff': + levels = list(np.arange(-0.1, 0.105, 0.01)) + elif attributes['short_name'] == 'lwp_diff': + levels = list(np.arange(-0.1, 0.105, 0.01)) + elif attributes['short_name'] in [ + 'netcre_diff', 'lwcre_diff', 'swcre_diff' + ]: + levels = list(np.arange(-30, 31, 2.5)) + else: + levels = list(np.linspace(min(cubes), max(cubes), 10)) + + for cube in cubes: + logger.info("Plotting %s %s of group %s", cube.attributes['dataset'], + attributes['short_name'], + cube.attributes['variable_group']) + mean = area_weighted_mean(cube) + + legend = cube.attributes['variable_group'] + + if cfg['reference']: + ipanel = PANEL.get(legend, None) + else: + ipanel = PANEL_woOBS.get(legend, None) + + plt.subplot(ipanel, projection=ccrs.Robinson()) + + im = iplt.contourf(cube, levels=levels, cmap=cmap, extend='both') + + plt.gca().coastlines() + + if cfg['reference']: + plt.title(legend, fontsize=18) + ipanel_label = PANEL_LABELS.get(legend, None) + plt.title(ipanel_label, fontsize=22, loc='left') + fsize = 14 + else: + plt.title(legend, fontsize=9) + ipanel_label = PANEL_LABELS_woOBS.get(legend, None) + plt.title(ipanel_label, fontsize=12, loc='left') + fsize = 8 + if attributes['short_name'] in ['clt', 'netcre']: + plt.title(f'mean = {mean.data:.1f} ', + fontsize=fsize, + loc='right') + elif attributes['short_name'] in ['clivi', 'lwp']: + plt.title(f'mean = {mean.data:.3f} ', + fontsize=fsize, + loc='right') + elif attributes['short_name'] in ['clivi_diff', 'lwp_diff']: + plt.title(f'bias = {mean.data:.3f} ', + fontsize=fsize, + loc='right') + elif attributes['short_name'] in ['clt_diff', 'netcre_diff']: + plt.title(f'bias = {mean.data:.1f} ', + fontsize=fsize, + loc='right') + else: + plt.title(f'{mean.data:.1f} ', fontsize=fsize, loc='right') + + if cfg['reference']: + cbar_ax = fig.add_axes([0.2, 0.08, 0.6, 0.03]) + colorbar = fig.colorbar(im, cax=cbar_ax, orientation='horizontal') + else: + cbar_ax = fig.add_axes([0.2, 0.18, 0.6, 0.03]) + colorbar = fig.colorbar(im, cax=cbar_ax, orientation='horizontal') + + if cubes[0].var_name == "clivi": + colorbar.set_label('iwp / ' + cubes[0].units.origin) + else: + colorbar.set_label(cubes[0].var_name + ' / ' + cubes[0].units.origin) + if attributes['short_name'] == 'clt': + ticks = [10, 20, 30, 40, 50, 60, 70, 80, 90] + elif attributes['short_name'] == 'clivi': + ticks = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + elif attributes['short_name'] == 'lwp': + ticks = [0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2] + elif attributes['short_name'] == 'netcre': + ticks = [-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50] + elif attributes['short_name'] == 'lwcre': + ticks = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] + elif attributes['short_name'] == 'swcre': + ticks = [-90, -80, -70, -60, -50, -40, -30, -20, -10, 0] + + elif attributes['short_name'] == 'clt_diff': + ticks = list(np.arange(-30, 31, 5)) + elif attributes['short_name'] == 'clivi_diff': + ticks = [ + -0.1, -0.08, -0.06, -0.04, -0.02, 0., 0.02, 0.04, 0.06, 0.08, 0.1 + ] + elif attributes['short_name'] == 'lwp_diff': + ticks = [ + -0.1, -0.08, -0.06, -0.04, -0.02, 0., 0.02, 0.04, 0.06, 0.08, 0.1 + ] + elif attributes['short_name'] in [ + 'netcre_diff', 'lwcre_diff', 'swcre_diff' + ]: + ticks = list(np.arange(-30, 31, 5)) + else: + ticks = levels + + colorbar.set_ticks(ticks) + colorbar.set_ticklabels([str(tick) for tick in ticks]) + + # Save the data and the plot + provenance_record = get_provenance_record( + attributes, ancestor_files=[d['filename'] for d in input_data]) + basename = 'map_' + attributes['short_name'] + + save_data(basename, provenance_record, cfg, cubes) + save_figure(basename, provenance_record, cfg) + + +def get_dataframe(cubes, cube_obs): + """Create dataframe.""" + df = pd.DataFrame(columns=['Dataset', 'Group', 'Statistic', 'Value']) + idf = 0 + + for cube in cubes: + dataset = cube.attributes['dataset'] + group = cube.attributes['variable_group'] + logger.info("Computing statistics of dataset %s", dataset) + + mean = area_weighted_mean(cube) + bias = calculate_bias(cube, cube_obs) + rmsd = calculate_rmsd(cube, cube_obs) + corr = calculate_corr(cube, cube_obs) + + df.loc[idf] = [dataset, group, 'Mean', mean.data] + idf = idf + 1 + df.loc[idf] = [dataset, group, 'Bias', bias.data] + idf = idf + 1 + df.loc[idf] = [dataset, group, 'RMSD', rmsd.data] + idf = idf + 1 + df.loc[idf] = [dataset, group, 'Corr', corr.data] + idf = idf + 1 + + return df + + +def write_statistics(df, attributes, cfg): + """Write statistics in csv file.""" + df['Value'] = df['Value'].astype(str).astype(float) + + basename = "statistic_all_" + attributes['short_name'] + csv_path = get_diagnostic_filename(basename, cfg).replace('.nc', '.csv') + df.to_csv(csv_path) + logger.info("Wrote %s", csv_path) + + stat = df.groupby(['Statistic', 'Group'])['Value'].describe() + basename = "statistic_" + attributes['short_name'] + csv_path = get_diagnostic_filename(basename, cfg).replace('.nc', '.csv') + stat.to_csv(csv_path) + logger.info("Wrote %s", csv_path) + + +def bootstrapping(cubes, cube_obs, all_groups, attributes, cfg): + """Calculate bootstrapping.""" + logger.info("Bootstrapping") + + for group in all_groups: + if group != 'OBS': + logger.info("Processing group %s", group) + cubes_part = {} + datasets = [] + for cube in cubes: + if cube.attributes['variable_group'] == group: + dataset = cube.attributes['dataset'] + cubes_part[dataset] = cube + datasets.append(dataset) + + nsample = 1000 + sample_stat = pd.DataFrame( + columns=['Mean', 'Bias', 'RMSD', 'Corr']) + + ncubes = len(cubes_part) + array = list(np.arange(0, ncubes)) + for iboot in range(0, nsample): + cube = cubes_part[datasets[0]].copy() + ires = [secrets.choice(array) for _ in range(len(array))] + for i, icube in enumerate(ires): + if i == 0: + cube = cubes_part[datasets[icube]].copy() + else: + cube += cubes_part[datasets[icube]] + cube.data = cube.data / ncubes + sample_stat.loc[iboot] = [ + area_weighted_mean(cube).data, + calculate_bias(cube, cube_obs).data, + calculate_rmsd(cube, cube_obs).data, + calculate_corr(cube, cube_obs).data + ] + + sample_stat = sample_stat.astype(float) + stat = sample_stat.describe() + basename = f"bootstrapping_{attributes['short_name']}_{group}" + csv_path = (get_diagnostic_filename(basename, + cfg).replace('.nc', '.csv')) + stat.to_csv(csv_path) + logger.info("Wrote %s", csv_path) + + +def main(cfg): + """Run diagnostic.""" + cfg = deepcopy(cfg) + cfg.setdefault('plot_each_model', False) + cfg.setdefault('plot_bias', False) + + input_data = list(cfg['input_data'].values()) + + groups = group_metadata(input_data, 'variable_group', sort='dataset') + attributes = next(iter(extract_variables(cfg).values())) + all_groups = list(group_metadata(input_data, 'variable_group')) + + # Read data + cubes, cubes_out = read_data(groups, cfg) + + # Plotting climatologies + plot_diagnostic(cubes_out, attributes, input_data, cfg) + + if cfg['reference']: + # Compute bias plots + cube_obs = cubes_out.extract_cube( + iris.Constraint(cube_func=lambda cube: cube.attributes[ + 'variable_group'] == 'OBS')) + + # Bootstrapping + bootstrapping(cubes, cube_obs, all_groups, attributes, cfg) + + # Compute statistics + df = get_dataframe(cubes, cube_obs) + + # write statistics + write_statistics(df, attributes, cfg) + + # compute bias + cubes_diff = iris.cube.CubeList() + attributes['short_name'] = attributes['short_name'] + "_diff" + + if cfg['plot_bias']: + for cube in cubes_out: + if (cube.attributes['variable_group'] != 'OBS' + or cube.attributes['dataset'] != 'MultiModelMean'): + logger.info("Processing %s of group %s", + cube.attributes['dataset'], + cube.attributes['variable_group']) + bias = calculate_bias(cube, cube_obs) + rmsd = calculate_rmsd(cube, cube_obs) + corr = calculate_corr(cube, cube_obs) + cube_diff = cube - cube_obs + cube_diff.attributes = cube.attributes + cube_diff.var_name = cube.var_name + cube_diff.attributes['short_name'] = attributes[ + 'short_name'] + cubes_diff.append(cube_diff) + logger.info('%s : bias = %f, rmsd = %f, corr = %f', + cube.attributes['variable_group'], bias.data, + rmsd.data, corr.data) + + # Plotting biases + plot_diagnostic(cubes_diff, attributes, input_data, cfg) + + +if __name__ == '__main__': + + with run_diagnostic() as config: + main(config) diff --git a/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_zonal.py b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_zonal.py new file mode 100644 index 0000000000..7bb71eb54f --- /dev/null +++ b/esmvaltool/diag_scripts/clouds/clouds_ecs_groups_zonal.py @@ -0,0 +1,486 @@ +"""Python diagnostic for plotting zonal averages.""" +import logging +from copy import deepcopy +from pathlib import Path + +import iris +import iris.quickplot as qplt +import matplotlib.pyplot as plt +import numpy as np + +from esmvaltool.diag_scripts.shared import ( + group_metadata, + run_diagnostic, + save_data, + save_figure, + select_metadata, +) + +logger = logging.getLogger(Path(__file__).stem) + +VAR_NAMES = { + 'clt': 'total_cloud_fraction', + 'clivi': 'ice_water_path', + 'lwp': 'liquid_water_path', + 'swcre': 'shortwave_cloud_radiative_effect', + 'lwcre': 'longwave_cloud_radiative_effect', + 'netcre': 'net_cloud_radiative_effect', +} +LINE_LEGEND = { + 'ECS_high_hist': 'ECS_high', + 'ECS_med_hist': 'ECS_med', + 'ECS_low_hist': 'ECS_low', +} +LINE_COLOR = { + 'ECS_high_hist': 'royalblue', + 'ECS_high_scen': 'royalblue', + 'ECS_med_hist': 'green', + 'ECS_med_scen': 'green', + 'ECS_low_hist': 'orange', + 'ECS_low_scen': 'orange', + 'CMIP6': 'firebrick', + 'CMIP5': 'royalblue', + 'CMIP3': 'darkcyan', + 'OBS': 'black' +} +LINE_DASH = { + 'ECS_high_hist': 'solid', + 'ECS_high_scen': 'dashed', + 'ECS_med_hist': 'solid', + 'ECS_med_scen': 'dashed', + 'ECS_low_hist': 'solid', + 'ECS_low_scen': 'dashed', + 'CMIP6': 'solid', + 'CMIP5': 'solid', + 'CMIP3': 'solid', + 'OBS': 'solid' +} + + +def get_provenance_record(short_name, ancestor_files): + """Create a provenance record describing the diagnostic data and plot.""" + caption = (f"Zonally averaged group means of {short_name} in the upper" + "panel and the corresponding relative differences in lower" + "panel.") + + record = { + 'caption': caption, + 'statistics': ['mean'], + 'domains': ['global'], + 'plot_types': ['zonal'], + 'authors': [ + 'bock_lisa', + ], + 'references': [ + 'bock24acp', + ], + 'ancestors': ancestor_files, + } + return record + + +def _get_multi_model_mean(cubes, var): + """Compute multi-model mean.""" + logger.debug("Calculating multi-model mean") + datasets = [] + mmm = [] + for (dataset_name, cube) in cubes.items(): + datasets.append(dataset_name) + mmm.append(cube.data) + mmm = np.ma.array(mmm) + dataset_0 = list(cubes.keys())[0] + mmm_cube = cubes[dataset_0].copy(data=np.ma.mean(mmm, axis=0)) + attributes = { + 'dataset': 'MultiModelMean', + 'short_name': var, + 'datasets': '|'.join(datasets), + } + mmm_cube.attributes = attributes + return mmm_cube + + +def _get_multi_model_quantile(cubes, var, quantile): + """Compute multi-model quantile.""" + logger.debug("Calculating multi-model %s quantile", quantile) + datasets = [] + mmq = [] + for (dataset_name, cube) in cubes.items(): + datasets.append(dataset_name) + mmq.append(cube.data) + mmq = np.ma.array(mmq) + dataset_0 = list(cubes.keys())[0] + mmq_cube = cubes[dataset_0].copy(data=np.quantile(mmq, quantile, axis=0)) + attributes = { + 'dataset': 'MultiModel' + str(quantile), + 'short_name': var, + 'datasets': '|'.join(datasets), + } + mmq_cube.attributes = attributes + return mmq_cube + + +def compute_diagnostic(filename): + """Compute an example diagnostic.""" + logger.debug("Loading %s", filename) + cube = iris.load_cube(filename) + + if cube.var_name == 'cli': + cube.convert_units('g/kg') + elif cube.var_name == 'clw': + cube.convert_units('g/kg') + + logger.debug("Reading %s", filename) + cube = iris.util.squeeze(cube) + return cube + + +def compute_diff(filename1, filename2): + """Compute difference between two cubes.""" + logger.debug("Loading %s", filename1) + cube1 = iris.load_cube(filename1) + cube2 = iris.load_cube(filename2) + + if cube1.var_name == 'cli': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + elif cube1.var_name == 'clw': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + + cube = cube2 - cube1 + cube.metadata = cube1.metadata + cube = iris.util.squeeze(cube) + return cube + + +def compute_diff_temp(input_data, group, dataset, plot_type): + """Compute relative change per temperture change.""" + dataset_name = dataset['dataset'] + var = dataset['short_name'] + + input_file_1 = dataset['filename'] + + var_data_2 = select_metadata(input_data, + short_name=var, + dataset=dataset_name, + variable_group=group[1]) + if not var_data_2: + raise ValueError( + f"No '{var}' data for '{dataset_name}' in '{group[1]}' available") + + input_file_2 = var_data_2[0]['filename'] + + if plot_type == 'zonal': + ta_data_1 = select_metadata(input_data, + short_name='tas', + dataset=dataset_name, + variable_group='tas_' + group[0]) + ta_data_2 = select_metadata(input_data, + short_name='tas', + dataset=dataset_name, + variable_group='tas_' + group[1]) + elif plot_type == 'height': + ta_data_1 = select_metadata(input_data, + short_name='ta', + dataset=dataset_name, + variable_group='ta_' + group[0]) + ta_data_2 = select_metadata(input_data, + short_name='ta', + dataset=dataset_name, + variable_group='ta_' + group[1]) + else: + raise ValueError(f"The plot_type '{var}' is not implemented.") + + if not ta_data_1: + raise ValueError(f"No temperature data for '{dataset_name}' " + f"in '{group[0]}' available") + if not ta_data_2: + raise ValueError(f"No temperature data for '{dataset_name}' " + f"in '{group[1]}' available") + input_file_ta_1 = ta_data_1[0]['filename'] + input_file_ta_2 = ta_data_2[0]['filename'] + + cube = compute_diagnostic(input_file_1) + if var in ['lwp', 'clivi', 'clw', 'cli']: + cube.data[cube.data < 0.001] = np.nan + elif var in ['cl']: + cube.data[cube.data < 0.1] = np.nan + elif var in ['netcre', 'swcre', 'lwcre']: + cube.data[abs(cube.data) < 1.] = np.nan + + cube_diff = compute_diff(input_file_1, input_file_2) + cube_ta_diff = compute_diff(input_file_ta_1, input_file_ta_2) + + cube_ta_diff.data[cube_ta_diff.data < 1.] = np.nan + + cube_diff = (100. * (cube_diff / iris.analysis.maths.abs(cube)) / + cube_ta_diff) + + cube_diff.metadata = cube.metadata + + if plot_type == 'zonal': + logger.debug("Computing zonal mean") + cube_diff = cube_diff.collapsed('longitude', iris.analysis.MEAN) + elif plot_type == 'height': + logger.debug("Computing field mean") + grid_areas = iris.analysis.cartography.area_weights(cube_diff) + cube_diff = cube_diff.collapsed(['longitude', 'latitude'], + iris.analysis.MEAN, + weights=grid_areas) + else: + raise ValueError(f"Plot type {plot_type} is not implemented.") + + cube_diff.units = '%/K' + + return cube_diff + + +def plot_diagnostic(cube, legend, plot_type): + """Create diagnostic data and plot it.""" + cube_label = legend + line_color = LINE_COLOR.get(legend, legend) + line_dash = LINE_DASH.get(legend, legend) + + plt.subplot(211) + + if plot_type == 'height': + cube.coord('air_pressure').convert_units('hPa') + y_axis = cube.coord('air_pressure') + qplt.plot(cube, + y_axis, + label=cube_label, + color=line_color, + linestyle=line_dash) + else: + lat = cube.coord('latitude') + qplt.plot(lat, + cube, + label=cube_label, + color=line_color, + linestyle=line_dash) + + logger.info("Plotting %s", legend) + + +def plot_diagnostic_diff(cube, legend, plot_type): + """Create diagnostic data and plot it.""" + cube_label = LINE_LEGEND.get(legend, legend) + line_color = LINE_COLOR.get(legend, legend) + line_dash = LINE_DASH.get(legend, legend) + + plt.subplot(212) + + if cube.var_name == 'pr': + cube.units = cube.units / 'kg m-3' + cube.data = cube.core_data() / 1000. + cube.convert_units('mm day-1') + elif cube.var_name == 'cli': + cube.convert_units('g/kg') + elif cube.var_name == 'clw': + cube.convert_units('g/kg') + + if plot_type == 'height': + cube.coord('air_pressure').convert_units('hPa') + y_axis = cube.coord('air_pressure') + qplt.plot(cube, + y_axis, + label=cube_label, + color=line_color, + linestyle=line_dash) + else: + lat = cube.coord('latitude') + qplt.plot(lat, + cube, + label=cube_label, + color=line_color, + linestyle=line_dash) + + logger.info("Plotting %s", legend) + + +def plot_errorband(cube1, cube2, legend, plot_type): + """Create diagnostic data and plot it.""" + line_color = LINE_COLOR.get(legend, legend) + line_dash = LINE_DASH.get(legend, legend) + + plt.subplot(211) + + if cube1.var_name == 'pr': + cube1.units = cube1.units / 'kg m-3' + cube1.data = cube1.core_data() / 1000. + cube1.convert_units('mm day-1') + cube2.units = cube2.units / 'kg m-3' + cube2.data = cube2.core_data() / 1000. + cube2.convert_units('mm day-1') + elif cube1.var_name == 'cli': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + elif cube1.var_name == 'clw': + cube1.convert_units('g/kg') + cube2.convert_units('g/kg') + + if plot_type == 'height': + cube1.coord('air_pressure').convert_units('hPa') + cube2.coord('air_pressure').convert_units('hPa') + y_axis = cube1.coord('air_pressure').points + plt.fill_betweenx(y_axis, + cube1.data, + cube2.data, + color=line_color, + linestyle=line_dash, + alpha=.1) + else: + lat = cube1.coord('latitude').points + plt.fill_between(lat, + cube1.data, + cube2.data, + color=line_color, + linestyle=line_dash, + alpha=.1) + logger.info("Plotting %s", legend) + + +def main(cfg): + """Run diagnostic.""" + cfg = deepcopy(cfg) + cfg.setdefault('filename_attach', 'base') + + plot_type = cfg['plot_type'] + + input_data = list(cfg['input_data'].values()) + + groups = group_metadata(input_data, 'variable_group', sort='dataset') + + plt.figure(figsize=(8, 12)) + + for group_name in groups: + if ('tas_' not in group_name) and ('ta_' not in group_name): + logger.info("Processing variable %s", group_name) + + dataset_names = [] + cubes = {} + + for dataset in groups[group_name]: + + dataset_name = dataset['dataset'] + var = dataset['short_name'] + + if dataset_name not in [ + 'MultiModelMean', 'MultiModelP5', 'MultiModelP95' + ]: + + logger.info("Loop dataset %s", dataset_name) + + input_file = dataset['filename'] + cube = compute_diagnostic(input_file) + logger.debug("Computing zonal mean") + if plot_type == 'zonal': + cube = cube.collapsed('longitude', iris.analysis.MEAN) + elif plot_type == 'height': + grid_areas = ( + iris.analysis.cartography.area_weights(cube)) + cube = cube.collapsed(['longitude', 'latitude'], + iris.analysis.MEAN, + weights=grid_areas) + else: + raise ValueError( + f"Plot type {plot_type} is not implemented.") + + cubes[dataset_name] = cube + + cube_mmm = _get_multi_model_mean(cubes, var) + + plot_diagnostic(cube_mmm, group_name, plot_type) + + cube_p5 = _get_multi_model_quantile(cubes, var, 0.05) + cube_p95 = _get_multi_model_quantile(cubes, var, 0.95) + + plot_errorband(cube_p5, cube_p95, group_name, plot_type) + + if plot_type == 'height': + plt.ylim(1000., 100.) + plt.yscale('log') + plt.yticks([1000., 800., 600., 400., 300., 200., 100.], + [1000, 800, 600, 400, 300, 200, 100]) + + long_name = input_data[0]['long_name'] + if plot_type == 'height': + title = 'Vertical mean of ' + long_name + elif plot_type == 'zonal': + if long_name == 'Total Cloud Cover Percentage': + title = 'Zonal mean of Total Cloud Fraction' + else: + title = 'Zonal mean of ' + long_name + else: + title = long_name + + plt.title(title) + plt.legend(ncol=1) + plt.grid(True) + + for group_name in cfg['group_by']: + + logger.info("Processing group %s", group_name[0]) + + dataset_names = [] + cubes_diff = {} + + for dataset in groups[group_name[0]]: + dataset_name = dataset['dataset'] + var = dataset['short_name'] + + if dataset_name not in [ + 'MultiModelMean', 'MultiModelP5', 'MultiModelP95' + ]: + logger.info("Loop dataset %s", dataset_name) + dataset_names.append(dataset_name) + + cube_diff = compute_diff_temp(input_data, group_name, dataset, + plot_type) + + cubes_diff[dataset_name] = cube_diff + + cube_mmm = _get_multi_model_mean(cubes_diff, var) + + plot_diagnostic_diff(cube_mmm, group_name[0], plot_type) + + if plot_type == 'height': + plt.xlim(0., 1.) + plt.ylim(1000., 100.) + plt.yscale('log') + plt.yticks([1000., 800., 600., 400., 300., 200., 100.], + [1000, 800, 600, 400, 300, 200, 100]) + plt.axvline(x=0, ymin=0., ymax=1., color='black', linewidth=3) + title = 'Difference of vertical mean of ' + long_name + elif plot_type == 'zonal': + plt.axhline(y=0, xmin=-90., xmax=90., color='black', linewidth=3) + title = 'Difference of zonal mean of ' + long_name + else: + title = long_name + + plt.title(title) + plt.legend(ncol=1) + plt.grid(True) + + short_name = input_data[0]['short_name'] + provenance_record = get_provenance_record( + short_name, ancestor_files=[d['filename'] for d in input_data]) + + if plot_type == 'height': + basename = ('level_diff_' + short_name + '_' + + cfg['filename_attach']) + else: + basename = ('zonal_diff_' + short_name + '_' + + cfg['filename_attach']) + + # Save the data used for the plot + save_data(basename, provenance_record, cfg, cube_mmm) + + # And save the plot + save_figure(basename, provenance_record, cfg) + + +if __name__ == '__main__': + + with run_diagnostic() as config: + main(config) diff --git a/esmvaltool/recipes/clouds/recipe_bock24acp_fig3-4_maps.yml b/esmvaltool/recipes/clouds/recipe_bock24acp_fig3-4_maps.yml new file mode 100644 index 0000000000..88076fafed --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_bock24acp_fig3-4_maps.yml @@ -0,0 +1,218 @@ +# ESMValTool +# recipe_bock24acp_fig3-4_maps.yml +# Note: The variables LWP and IWP are commented out at the moment as a different +# standard name for this variables in CMIP5 and CMIP6 gives an error. Iris +# is working on a solution for this problem. +--- +documentation: + title: Cloud properties regarding ECS (geographical maps). + + description: | + Geographical maps of cloud properties, models are grouped in + three groups regarding their ECS. + + authors: + - bock_lisa + + maintainer: + - bock_lisa + + references: + - bock24acp + + projects: + - cmug + - esm2025 + + +YEARS: &years_hist + start_year: 1985 + end_year: 2004 + +YEARS_scen: &years_scen + start_year: 2081 + end_year: 2100 + + +DATASETS_ECS_HIGH: &datasets_ecs_high + # CMIP6 + - {dataset: CanESM5, grid: gn} + - {dataset: CESM2, grid: gn, ensemble: r4i1p1f1} + - {dataset: CESM2-WACCM, grid: gn, institute: NCAR} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2} + - {dataset: HadGEM3-GC31-LL, grid: gn, ensemble: r1i1p1f3} + - {dataset: HadGEM3-GC31-MM, grid: gn, ensemble: r1i1p1f3} + - {dataset: IPSL-CM6A-LR} + - {dataset: KACE-1-0-G} + - {dataset: NESM3, grid: gn} + - {dataset: TaiESM1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + # CMIP5 + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_MED: &datasets_ecs_med + # CMIP6 + - {dataset: BCC-CSM2-MR, grid: gn} + - {dataset: CMCC-CM2-SR5, grid: gn} + - {dataset: CMCC-ESM2, grid: gn} + - {dataset: FGOALS-f3-L} + - {dataset: FGOALS-g3, grid: gn} + - {dataset: GISS-E2-1-H, grid: gn} + - {dataset: MPI-ESM1-2-HR, grid: gn} + - {dataset: MPI-ESM1-2-LR, grid: gn} + - {dataset: MRI-ESM2-0, grid: gn} + # CMIP5 + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_LOW: &datasets_ecs_low + # CMIP6 + - {dataset: CAMS-CSM1-0, grid: gn} + - {dataset: GISS-E2-1-G, grid: gn} + - {dataset: MIROC6, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: NorESM2-LM, grid: gn, institute: NCC} + - {dataset: NorESM2-MM, grid: gn, institute: NCC} + # CMIP5 + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5} + + +preprocessors: + + lat_lon_mmm: + custom_order: true + regrid: + target_grid: 2x2 + scheme: linear + multi_model_statistics: + span: full + statistics: [mean] + climate_statistics: + operator: mean + + lat_lon: + regrid: + target_grid: 2x2 + scheme: linear + climate_statistics: + operator: mean + + +diagnostics: + + # Figure 3abc + clt_lat_lon: &lat_lon_diag + description: comparison of geographical maps + variables: + ECS_high: &var_clt + short_name: clt + preprocessor: lat_lon_mmm + mip: Amon + project: CMIP6 + exp: historical + ensemble: r1i1p1f1 + grid: gr + <<: *years_hist + additional_datasets: *datasets_ecs_high + ECS_med: + <<: *var_clt + additional_datasets: *datasets_ecs_med + ECS_low: + <<: *var_clt + additional_datasets: *datasets_ecs_low + scripts: + lat_lon: + script: clouds/clouds_ecs_groups_maps.py + group_by: variable_group + plot_each_model: false + reference: false + + + # Figure 3def + # lwp_lat_lon: + # <<: *lat_lon_diag + # variables: + # ECS_high: + # <<: *var_clt + # short_name: lwp + # derive: true + # additional_datasets: *datasets_ecs_high + # ECS_med: + # <<: *var_clt + # short_name: lwp + # derive: true + # additional_datasets: *datasets_ecs_med + # ECS_low: + # <<: *var_clt + # short_name: lwp + # derive: true + # additional_datasets: *datasets_ecs_low + + + # Figure 3ghi + # iwp_lat_lon: + # <<: *lat_lon_diag + # variables: + # ECS_high: + # <<: *var_clt + # short_name: clivi + # additional_datasets: *datasets_ecs_high + # ECS_med: + # <<: *var_clt + # short_name: clivi + # additional_datasets: *datasets_ecs_med + # ECS_low: + # <<: *var_clt + # short_name: clivi + # additional_datasets: *datasets_ecs_low + + + # Figure 4 + netcre_lat_lon: &lat_lon_cre + description: comparison of geographical maps + variables: + ECS_high: &var_cre + <<: *var_clt + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + ECS_med: + <<: *var_cre + additional_datasets: *datasets_ecs_med + ECS_low: + <<: *var_cre + additional_datasets: *datasets_ecs_low + OBS: + <<: *var_cre + preprocessor: lat_lon + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, start_year: 2001, end_year: 2022} + scripts: + lat_lon: + script: clouds/clouds_ecs_groups_maps.py + group_by: variable_group + plot_each_model: false + reference: true diff --git a/esmvaltool/recipes/clouds/recipe_bock24acp_fig6_zonal.yml b/esmvaltool/recipes/clouds/recipe_bock24acp_fig6_zonal.yml new file mode 100644 index 0000000000..69426ffb54 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_bock24acp_fig6_zonal.yml @@ -0,0 +1,566 @@ +# ESMValTool +# recipe_bock24acp_fig6_zonal.yml +--- +documentation: + title: Cloud properties regarding ECS (zonal plots). + + description: | + Zonal plots of cloud properties and their projected changes, + models are grouped in three groups regarding their ECS. + + authors: + - bock_lisa + + maintainer: + - lauer_axel + + references: + - bock24acp + + project: + - cmug + - esm2025 + + +YEARS_hist: &years_hist + start_year: 1985 + end_year: 2004 + +YEARS_scen: &years_scen + start_year: 2081 + end_year: 2100 + + +DATASETS_ECS_HIGH: &datasets_ecs_high + # CMIP6 + - {dataset: CanESM5, grid: gn} + - {dataset: CESM2, grid: gn, ensemble: r4i1p1f1} + - {dataset: CESM2-WACCM, grid: gn, institute: NCAR} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2} + - {dataset: HadGEM3-GC31-LL, grid: gn, ensemble: r1i1p1f3} + - {dataset: HadGEM3-GC31-MM, grid: gn, ensemble: r1i1p1f3} + - {dataset: IPSL-CM6A-LR} + - {dataset: KACE-1-0-G} + - {dataset: NESM3, grid: gn} + - {dataset: TaiESM1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + # CMIP5 + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_HIGH_scenario: &datasets_ecs_high_scenario + # CMIP6 + - {dataset: CanESM5, grid: gn, exp: ssp585} + - {dataset: CESM2, grid: gn, ensemble: r4i1p1f1, exp: ssp585} + - {dataset: CESM2-WACCM, grid: gn, institute: NCAR, exp: ssp585} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: HadGEM3-GC31-LL, grid: gn, ensemble: r1i1p1f3, exp: ssp585} + - {dataset: HadGEM3-GC31-MM, grid: gn, ensemble: r1i1p1f3, exp: ssp585} + - {dataset: IPSL-CM6A-LR, exp: ssp585} + - {dataset: KACE-1-0-G, exp: ssp585} + - {dataset: NESM3, grid: gn, exp: ssp585} + - {dataset: TaiESM1, grid: gn, exp: ssp585} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, exp: ssp585} + # CMIP5 + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + +DATASETS_ECS_MED: &datasets_ecs_med + # CMIP6 + - {dataset: BCC-CSM2-MR, grid: gn} + - {dataset: CMCC-CM2-SR5, grid: gn} + - {dataset: CMCC-ESM2, grid: gn} + - {dataset: FGOALS-f3-L} + - {dataset: FGOALS-g3, grid: gn} + - {dataset: GISS-E2-1-H, grid: gn} + - {dataset: MPI-ESM1-2-HR, grid: gn} + - {dataset: MPI-ESM1-2-LR, grid: gn} + - {dataset: MRI-ESM2-0, grid: gn} + # CMIP5 + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_MED_scenario: &datasets_ecs_med_scenario + # CMIP6 + - {dataset: BCC-CSM2-MR, grid: gn, exp: ssp585} + - {dataset: CMCC-CM2-SR5, grid: gn, exp: ssp585} + - {dataset: CMCC-ESM2, grid: gn, exp: ssp585} + - {dataset: FGOALS-f3-L, exp: ssp585} + - {dataset: FGOALS-g3, grid: gn, exp: ssp585} + - {dataset: GISS-E2-1-H, grid: gn, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: MPI-ESM1-2-HR, grid: gn, exp: ssp585} + - {dataset: MPI-ESM1-2-LR, grid: gn, exp: ssp585} + - {dataset: MRI-ESM2-0, grid: gn, exp: ssp585} + # CMIP5 + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + +DATASETS_ECS_LOW: &datasets_ecs_low + # CMIP6 + - {dataset: CAMS-CSM1-0, grid: gn} + - {dataset: GISS-E2-1-G, grid: gn} + - {dataset: MIROC6, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: NorESM2-LM, grid: gn, institute: NCC} + - {dataset: NorESM2-MM, grid: gn, institute: NCC} + # CMIP5 + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_LOW_scenario: &datasets_ecs_low_scenario + # CMIP6 + - {dataset: CAMS-CSM1-0, grid: gn, exp: ssp585, end_year: 2099} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: MIROC6, grid: gn, exp: ssp585} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, exp: ssp585} + - {dataset: NorESM2-LM, grid: gn, institute: NCC, exp: ssp585} + - {dataset: NorESM2-MM, grid: gn, institute: NCC, exp: ssp585} + # CMIP5 + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + + +preprocessors: + + zonal: + regrid: + target_grid: 2x2 + scheme: linear + climate_statistics: + operator: mean + + +diagnostics: + + # Figure 6a + clt_zonal: &zonal_diag + description: comparison of zonal mean + variables: + ECS_high_hist: &var_clt + short_name: clt + preprocessor: zonal + mip: Amon + project: CMIP6 + exp: historical + ensemble: r1i1p1f1 + grid: gr + <<: *years_hist + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas + <<: *var_clt + short_name: tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + zonal_diff: + script: clouds/clouds_ecs_groups_zonal.py + group_by: [['ECS_low_hist', 'ECS_low_scen'], + ['ECS_med_hist', 'ECS_med_scen'], + ['ECS_high_hist', 'ECS_high_scen']] + plot_type: zonal + filename_attach: 'ssp585' + + + # Figure 6b + lwp_zonal: + <<: *zonal_diag + variables: + ECS_high_hist: + <<: *var_clt + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: + <<: *var_tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + + + # Figure 6c + iwp_zonal: + <<: *zonal_diag + variables: + ECS_high_hist: + <<: *var_clt + short_name: clivi + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + short_name: clivi + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + short_name: clivi + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: + <<: *var_tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + + + # Figure 6d + netcre_zonal: + <<: *zonal_diag + variables: + ECS_high_hist: + <<: *var_clt + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: + <<: *var_tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + OBS: + <<: *var_clt + short_name: netcre + derive: true + preprocessor: zonal + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, start_year: 2001, end_year: 2022} + + + # Figure 6e + swcre_zonal: + <<: *zonal_diag + variables: + ECS_high_hist: + <<: *var_clt + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + short_name: swcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: + <<: *var_tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + OBS: + <<: *var_clt + short_name: swcre + derive: true + preprocessor: zonal + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, start_year: 2001, end_year: 2022} + + + # Figure 6f + lwcre_zonal: + <<: *zonal_diag + variables: + ECS_high_hist: + <<: *var_clt + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_high + ECS_med_hist: + <<: *var_clt + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_med + ECS_low_hist: + <<: *var_clt + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_low + ECS_high_scen: + <<: *var_clt + <<: *years_scen + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_high_scenario + ECS_med_scen: + <<: *var_clt + <<: *years_scen + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + ECS_low_scen: + <<: *var_clt + <<: *years_scen + short_name: lwcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: + <<: *var_tas + tas_ECS_med_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + OBS: + <<: *var_clt + short_name: lwcre + derive: true + preprocessor: zonal + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, start_year: 2001, end_year: 2022} diff --git a/esmvaltool/recipes/clouds/recipe_bock24acp_fig7_boxplots.yml b/esmvaltool/recipes/clouds/recipe_bock24acp_fig7_boxplots.yml new file mode 100644 index 0000000000..ef4b507be2 --- /dev/null +++ b/esmvaltool/recipes/clouds/recipe_bock24acp_fig7_boxplots.yml @@ -0,0 +1,1004 @@ +# ESMValTool +# recipe_bock24acp_fig7_boxplots.yml +--- +documentation: + title: Cloud properties regarding ECS (boxplots). + + description: | + Boxplots fo projected changes of cloud properties + for different regions. + + authors: + - bock_lisa + + maintainer: + - bock_lisa + + references: + - bock24acp + + project: + - cmug + - esm2025 + + +YEARS_hist: &years_hist + start_year: 1985 + end_year: 2004 + +YEARS_scen: &years_scen + start_year: 2081 + end_year: 2100 + +VARIABLE_SETTINGS: &var_settings + short_name: clt + mip: Amon + project: CMIP6 + exp: historical + ensemble: r1i1p1f1 + grid: gr + <<: *years_hist + +BOXPLOT_SETTINGS: &boxplot_settings + script: clouds/clouds_ecs_groups_boxplots.py + group_by: [['ECS_low_hist', 'ECS_low_scen'], + ['ECS_med_hist', 'ECS_med_scen'], + ['ECS_high_hist', 'ECS_high_scen']] + y_range: [-25., 22.] + + +DATASETS_ECS_HIGH: &datasets_ecs_high + # CMIP6 + - {dataset: CanESM5, grid: gn} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2} + - {dataset: HadGEM3-GC31-LL, grid: gn, ensemble: r1i1p1f3} + - {dataset: HadGEM3-GC31-MM, grid: gn, ensemble: r1i1p1f3} + - {dataset: IPSL-CM6A-LR} + - {dataset: KACE-1-0-G} + - {dataset: NESM3, grid: gn} + - {dataset: TaiESM1, grid: gn} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn} + # CMIP5 + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_HIGH_scenario: &datasets_ecs_high_scenario + # CMIP6 + - {dataset: CanESM5, grid: gn, exp: ssp585} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: CNRM-ESM2-1, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: HadGEM3-GC31-LL, grid: gn, ensemble: r1i1p1f3, exp: ssp585} + - {dataset: HadGEM3-GC31-MM, grid: gn, ensemble: r1i1p1f3, exp: ssp585} + - {dataset: IPSL-CM6A-LR, exp: ssp585} + - {dataset: KACE-1-0-G, exp: ssp585} + - {dataset: NESM3, grid: gn, exp: ssp585} + - {dataset: TaiESM1, grid: gn, exp: ssp585} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2, grid: gn, exp: ssp585} + # CMIP5 + - {dataset: CSIRO-Mk3-6-0, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: HadGEM2-ES, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5A-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5A-MR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MIROC-ESM, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + +DATASETS_ECS_MED: &datasets_ecs_med + # CMIP6 + - {dataset: BCC-CSM2-MR, grid: gn} + - {dataset: CMCC-CM2-SR5, grid: gn} + - {dataset: CMCC-ESM2, grid: gn} + - {dataset: FGOALS-f3-L} + - {dataset: FGOALS-g3, grid: gn} + - {dataset: GISS-E2-1-H, grid: gn} + - {dataset: MPI-ESM1-2-HR, grid: gn} + - {dataset: MPI-ESM1-2-LR, grid: gn} + - {dataset: MRI-ESM2-0, grid: gn} + # CMIP5 + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_MED_scenario: &datasets_ecs_med_scenario + # CMIP6 + - {dataset: BCC-CSM2-MR, grid: gn, exp: ssp585} + - {dataset: CMCC-CM2-SR5, grid: gn, exp: ssp585} + - {dataset: CMCC-ESM2, grid: gn, exp: ssp585} + - {dataset: FGOALS-f3-L, exp: ssp585} + - {dataset: FGOALS-g3, grid: gn, exp: ssp585} + - {dataset: GISS-E2-1-H, grid: gn, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: MPI-ESM1-2-HR, grid: gn, exp: ssp585} + - {dataset: MPI-ESM1-2-LR, grid: gn, exp: ssp585} + - {dataset: MRI-ESM2-0, grid: gn, exp: ssp585} + # CMIP5 + - {dataset: ACCESS1-0, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: ACCESS1-3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: BNU-ESM, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: CanESM2, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: CCSM4, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: FGOALS-g2, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-CM3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MPI-ESM-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MPI-ESM-MR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + +DATASETS_ECS_LOW: &datasets_ecs_low + # CMIP6 + - {dataset: CAMS-CSM1-0, grid: gn} + - {dataset: GISS-E2-1-G, grid: gn} + - {dataset: MIROC6, grid: gn} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn} + - {dataset: NorESM2-LM, grid: gn, institute: NCC} + - {dataset: NorESM2-MM, grid: gn, institute: NCC} + # CMIP5 + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5} + +DATASETS_ECS_LOW_scenario: &datasets_ecs_low_scenario + # CMIP6 + - {dataset: CAMS-CSM1-0, grid: gn, exp: ssp585, end_year: 2099} + - {dataset: GISS-E2-1-G, grid: gn, ensemble: r1i1p1f2, exp: ssp585} + - {dataset: MIROC6, grid: gn, exp: ssp585} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2, grid: gn, exp: ssp585} + - {dataset: NorESM2-LM, grid: gn, institute: NCC, exp: ssp585} + - {dataset: NorESM2-MM, grid: gn, institute: NCC, exp: ssp585} + # CMIP5 + - {dataset: bcc-csm1-1, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: bcc-csm1-1-m, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-ESM2G, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GFDL-ESM2M, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GISS-E2-H, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: GISS-E2-R, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: inmcm4, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: IPSL-CM5B-LR, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MIROC5, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: MRI-CGCM3, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + - {dataset: NorESM1-M, ensemble: r1i1p1, project: CMIP5, exp: rcp85} + + +preprocessors: + + tropical_ocean: + custom_order: true + extract_region: + start_latitude: -30. + end_latitude: 30. + start_longitude: 0. + end_longitude: 360. + mask_landsea: &mask_land + mask_out: land + area_statistics: &area_mean + operator: mean + climate_statistics: &clim_mean + operator: mean + + southern_ocean: + custom_order: true + extract_region: + start_latitude: -65. + end_latitude: -30. + start_longitude: 0. + end_longitude: 360. + mask_landsea: *mask_land + area_statistics: *area_mean + climate_statistics: *clim_mean + + pacific_itcz: + custom_order: true + extract_region: + start_latitude: 0. + end_latitude: 12. + start_longitude: 135. + end_longitude: 275. + mask_landsea: *mask_land + area_statistics: *area_mean + climate_statistics: *clim_mean + + stratocumulus: + custom_order: true + extract_shape: + shapefile: shapefiles/sc_regions.shp + crop: true + decomposed: false + ids: + sc: + - SEP + - NEP + - SEA + mask_landsea: *mask_land + area_statistics: *area_mean + climate_statistics: *clim_mean + + arctic: + custom_order: true + extract_region: + start_latitude: 70. + end_latitude: 90. + start_longitude: 0. + end_longitude: 360. + mask_landsea: *mask_land + area_statistics: *area_mean + climate_statistics: *clim_mean + + +diagnostics: + + # Figure 7c + diag_tropical_ocean: + description: compare field means + variables: + clt_ECS_high_hist: &var_clt_1 + <<: *var_settings + preprocessor: tropical_ocean + additional_datasets: *datasets_ecs_high + clt_ECS_med_hist: + <<: *var_clt_1 + additional_datasets: *datasets_ecs_med + clt_ECS_low_hist: + <<: *var_clt_1 + additional_datasets: *datasets_ecs_low + clt_ECS_high_scen: + <<: *var_clt_1 + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + clt_ECS_med_scen: + <<: *var_clt_1 + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + clt_ECS_low_scen: + <<: *var_clt_1 + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + clivi_ECS_high_hist: + <<: *var_clt_1 + short_name: clivi + additional_datasets: *datasets_ecs_high + clivi_ECS_med_hist: + <<: *var_clt_1 + short_name: clivi + additional_datasets: *datasets_ecs_med + clivi_ECS_low_hist: + <<: *var_clt_1 + short_name: clivi + additional_datasets: *datasets_ecs_low + clivi_ECS_high_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: clivi + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + clivi_ECS_med_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + clivi_ECS_low_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + lwp_ECS_high_hist: + <<: *var_clt_1 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + lwp_ECS_med_hist: + <<: *var_clt_1 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + lwp_ECS_low_hist: + <<: *var_clt_1 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + lwp_ECS_high_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: lwp + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + lwp_ECS_med_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + lwp_ECS_low_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + netcre_ECS_high_hist: + <<: *var_clt_1 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + netcre_ECS_med_hist: + <<: *var_clt_1 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + netcre_ECS_low_hist: + <<: *var_clt_1 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + netcre_ECS_high_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: netcre + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + netcre_ECS_med_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + netcre_ECS_low_scen: + <<: *var_clt_1 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas_1 + <<: *var_clt_1 + short_name: tas + tas_ECS_med_hist: + <<: *var_tas_1 + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas_1 + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas_1 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas_1 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas_1 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + barplot: + <<: *boxplot_settings + filename_attach: 'ssp585_tropoc' + title: 'Tropical Ocean' + + + # Figure 7b + diag_southern_ocean: + description: compare field means + variables: + clt_ECS_high_hist: &var_clt_2 + <<: *var_settings + preprocessor: southern_ocean + additional_datasets: *datasets_ecs_high + clt_ECS_med_hist: + <<: *var_clt_2 + additional_datasets: *datasets_ecs_med + clt_ECS_low_hist: + <<: *var_clt_2 + additional_datasets: *datasets_ecs_low + clt_ECS_high_scen: + <<: *var_clt_2 + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + clt_ECS_med_scen: + <<: *var_clt_2 + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + clt_ECS_low_scen: + <<: *var_clt_2 + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + clivi_ECS_high_hist: + <<: *var_clt_2 + short_name: clivi + additional_datasets: *datasets_ecs_high + clivi_ECS_med_hist: + <<: *var_clt_2 + short_name: clivi + additional_datasets: *datasets_ecs_med + clivi_ECS_low_hist: + <<: *var_clt_2 + short_name: clivi + additional_datasets: *datasets_ecs_low + clivi_ECS_high_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: clivi + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + clivi_ECS_med_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + clivi_ECS_low_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + lwp_ECS_high_hist: + <<: *var_clt_2 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + lwp_ECS_med_hist: + <<: *var_clt_2 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + lwp_ECS_low_hist: + <<: *var_clt_2 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + lwp_ECS_high_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: lwp + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + lwp_ECS_med_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + lwp_ECS_low_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + netcre_ECS_high_hist: + <<: *var_clt_2 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + netcre_ECS_med_hist: + <<: *var_clt_2 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + netcre_ECS_low_hist: + <<: *var_clt_2 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + netcre_ECS_high_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: netcre + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + netcre_ECS_med_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + netcre_ECS_low_scen: + <<: *var_clt_2 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas_2 + <<: *var_clt_2 + short_name: tas + tas_ECS_med_hist: + <<: *var_tas_2 + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas_2 + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas_2 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas_2 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas_2 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + barplot: + <<: *boxplot_settings + filename_attach: 'ssp585_south_oc' + title: 'Southern Ocean' + + + # Figure 7d + diag_pacific_itcz: + description: compare field means + variables: + clt_ECS_high_hist: &var_clt_3 + <<: *var_settings + preprocessor: pacific_itcz + additional_datasets: *datasets_ecs_high + clt_ECS_med_hist: + <<: *var_clt_3 + additional_datasets: *datasets_ecs_med + clt_ECS_low_hist: + <<: *var_clt_3 + additional_datasets: *datasets_ecs_low + clt_ECS_high_scen: + <<: *var_clt_3 + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + clt_ECS_med_scen: + <<: *var_clt_3 + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + clt_ECS_low_scen: + <<: *var_clt_3 + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + clivi_ECS_high_hist: + <<: *var_clt_3 + short_name: clivi + additional_datasets: *datasets_ecs_high + clivi_ECS_med_hist: + <<: *var_clt_3 + short_name: clivi + additional_datasets: *datasets_ecs_med + clivi_ECS_low_hist: + <<: *var_clt_3 + short_name: clivi + additional_datasets: *datasets_ecs_low + clivi_ECS_high_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: clivi + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + clivi_ECS_med_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + clivi_ECS_low_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + lwp_ECS_high_hist: + <<: *var_clt_3 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + lwp_ECS_med_hist: + <<: *var_clt_3 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + lwp_ECS_low_hist: + <<: *var_clt_3 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + lwp_ECS_high_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: lwp + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + lwp_ECS_med_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + lwp_ECS_low_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + netcre_ECS_high_hist: + <<: *var_clt_3 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + netcre_ECS_med_hist: + <<: *var_clt_3 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + netcre_ECS_low_hist: + <<: *var_clt_3 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + netcre_ECS_high_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: netcre + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + netcre_ECS_med_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + netcre_ECS_low_scen: + <<: *var_clt_3 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas_3 + <<: *var_clt_3 + short_name: tas + tas_ECS_med_hist: + <<: *var_tas_3 + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas_3 + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas_3 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas_3 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas_3 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + barplot: + <<: *boxplot_settings + filename_attach: 'ssp585_paitcz' + title: 'Pacific ITCZ' + + + # Figure 7e + diag_stratocumulus: + description: compare field means + variables: + clt_ECS_high_hist: &var_clt_str + <<: *var_settings + preprocessor: stratocumulus + additional_datasets: *datasets_ecs_high + clt_ECS_med_hist: + <<: *var_clt_str + additional_datasets: *datasets_ecs_med + clt_ECS_low_hist: + <<: *var_clt_str + additional_datasets: *datasets_ecs_low + clt_ECS_high_scen: + <<: *var_clt_str + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + clt_ECS_med_scen: + <<: *var_clt_str + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + clt_ECS_low_scen: + <<: *var_clt_str + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + clivi_ECS_high_hist: + <<: *var_clt_str + short_name: clivi + additional_datasets: *datasets_ecs_high + clivi_ECS_med_hist: + <<: *var_clt_str + short_name: clivi + additional_datasets: *datasets_ecs_med + clivi_ECS_low_hist: + <<: *var_clt_str + short_name: clivi + additional_datasets: *datasets_ecs_low + clivi_ECS_high_scen: + <<: *var_clt_str + <<: *years_scen + short_name: clivi + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + clivi_ECS_med_scen: + <<: *var_clt_str + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + clivi_ECS_low_scen: + <<: *var_clt_str + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + lwp_ECS_high_hist: + <<: *var_clt_str + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + lwp_ECS_med_hist: + <<: *var_clt_str + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + lwp_ECS_low_hist: + <<: *var_clt_str + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + lwp_ECS_high_scen: + <<: *var_clt_str + <<: *years_scen + short_name: lwp + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + lwp_ECS_med_scen: + <<: *var_clt_str + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + lwp_ECS_low_scen: + <<: *var_clt_str + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + netcre_ECS_high_hist: + <<: *var_clt_str + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + netcre_ECS_med_hist: + <<: *var_clt_str + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + netcre_ECS_low_hist: + <<: *var_clt_str + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + netcre_ECS_high_scen: + <<: *var_clt_str + <<: *years_scen + short_name: netcre + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + netcre_ECS_med_scen: + <<: *var_clt_str + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + netcre_ECS_low_scen: + <<: *var_clt_str + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas_str + <<: *var_clt_str + short_name: tas + tas_ECS_med_hist: + <<: *var_tas_str + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas_str + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas_str + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas_str + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas_str + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + barplot: + <<: *boxplot_settings + filename_attach: 'ssp585_stratocumulus' + title: 'Stratocumulus region' + + + # Figure 7a + diag_arctic: + description: compare field means + variables: + clt_ECS_high_hist: &var_clt_5 + <<: *var_settings + preprocessor: arctic + additional_datasets: *datasets_ecs_high + clt_ECS_med_hist: + <<: *var_clt_5 + additional_datasets: *datasets_ecs_med + clt_ECS_low_hist: + <<: *var_clt_5 + additional_datasets: *datasets_ecs_low + clt_ECS_high_scen: + <<: *var_clt_5 + <<: *years_scen + additional_datasets: *datasets_ecs_high_scenario + clt_ECS_med_scen: + <<: *var_clt_5 + <<: *years_scen + additional_datasets: *datasets_ecs_med_scenario + clt_ECS_low_scen: + <<: *var_clt_5 + <<: *years_scen + additional_datasets: *datasets_ecs_low_scenario + clivi_ECS_high_hist: + <<: *var_clt_5 + short_name: clivi + additional_datasets: *datasets_ecs_high + clivi_ECS_med_hist: + <<: *var_clt_5 + short_name: clivi + additional_datasets: *datasets_ecs_med + clivi_ECS_low_hist: + <<: *var_clt_5 + short_name: clivi + additional_datasets: *datasets_ecs_low + clivi_ECS_high_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: clivi + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + clivi_ECS_med_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_med_scenario + clivi_ECS_low_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: clivi + additional_datasets: *datasets_ecs_low_scenario + lwp_ECS_high_hist: + <<: *var_clt_5 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_high + lwp_ECS_med_hist: + <<: *var_clt_5 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med + lwp_ECS_low_hist: + <<: *var_clt_5 + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low + lwp_ECS_high_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: lwp + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + lwp_ECS_med_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_med_scenario + lwp_ECS_low_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: lwp + derive: true + additional_datasets: *datasets_ecs_low_scenario + netcre_ECS_high_hist: + <<: *var_clt_5 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_high + netcre_ECS_med_hist: + <<: *var_clt_5 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med + netcre_ECS_low_hist: + <<: *var_clt_5 + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low + netcre_ECS_high_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: netcre + derive: true + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + netcre_ECS_med_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_med_scenario + netcre_ECS_low_scen: + <<: *var_clt_5 + <<: *years_scen + short_name: netcre + derive: true + additional_datasets: *datasets_ecs_low_scenario + tas_ECS_high_hist: &var_tas_5 + <<: *var_clt_5 + short_name: tas + tas_ECS_med_hist: + <<: *var_tas_5 + additional_datasets: *datasets_ecs_med + tas_ECS_low_hist: + <<: *var_tas_5 + additional_datasets: *datasets_ecs_low + tas_ECS_high_scen: + <<: *var_tas_5 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_high_scenario + tas_ECS_med_scen: + <<: *var_tas_5 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_med_scenario + tas_ECS_low_scen: + <<: *var_tas_5 + <<: *years_scen + exp: ssp585 + additional_datasets: *datasets_ecs_low_scenario + scripts: + barplot: + <<: *boxplot_settings + filename_attach: 'ssp585_pol' + title: 'Arctic' diff --git a/esmvaltool/references/bock24acp.bibtex b/esmvaltool/references/bock24acp.bibtex new file mode 100644 index 0000000000..303b019050 --- /dev/null +++ b/esmvaltool/references/bock24acp.bibtex @@ -0,0 +1,12 @@ +@article{https://doi.org/10.5194/acp-24-1587-2024, +author = {Bock, L. and Lauer, A.}, +title = {Cloud properties and their projected changes in CMIP models with low to high climate sensitivity}, +journal = {Atmospheric Chemistry and Physics}, +volume = {24}, +number = {3}, +pages = {1587--1605}, +doi = {10.5194/acp-24-1587-2024}, +url = {https://doi.org/10.5194/acp-24-1587-2024}, +year = {2024} +} + From 5008b41db88b25ac9665a8be287b71e5192961ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2025 12:07:51 +0000 Subject: [PATCH 81/87] [Condalock] Update Linux condalock file (#3859) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 521 +++++++++++++++++++++++--------------------- 1 file changed, 269 insertions(+), 252 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 0d7555766e..2c4be9fdc0 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -5,14 +5,14 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/_py-xgboost-mutex-2.0-gpu_0.tar.bz2#7702188077361f43a4d61e64c694f850 https://conda.anaconda.org/conda-forge/noarch/_r-mutex-1.0.1-anacondar_1.tar.bz2#19f9db5f4f1b7f5ef5f6d67207f25f38 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de https://conda.anaconda.org/conda-forge/noarch/cuda-version-11.8-h70ddcb2_3.conda#670f0e1593b8c1d84f57ad5fe5256799 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.5-ha770c72_0.conda#2889e6b9c666c3a564ab90cedc5832fd +https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.1-ha770c72_0.conda#e94dd7479ba12963364d855fb23cce4f https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 @@ -22,29 +22,31 @@ https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.2.0-h41c2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.2.0-h41c2201_101.conda#60b9a16fd147f7184b5a964aa08f3b0f -https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda#0ea96f90a10838f58412aa84fdd9df09 +https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda#460eba7851277ec1fd80a1a24080787a https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda#cf0c5521ac2a20dfa6c662a4009eeef6 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.28-hb9d3cd8_0.conda#1b53af320b24547ce0fb8196d2604542 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-hb9d3cd8_1.conda#ee228789a85f961d14567252a03e725f +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2ecf2f1c7e4e21fcfe6423a51a992d84 +https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda#7c7927b404672409d9917d49bff5f2d6 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-hf23e847_1.conda#b1aa0faa95017bca11369bd080487ec4 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda#33405d2a66b1411db9f7242c8b97c9e7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda#23cc74f77eb99315c0360ec3533147a9 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024b-hb9d3cd8_0.conda#db124840386e1f842f93372897d1b857 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda#19608a9656912805b2b9a2f6bd257b04 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda#77cbc488235ebbaab2b6e912d3934bae +https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda#7c21106b851ec72c037b162c216d8f05 https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-hfd43aa1_1.conda#f301eb944d297fc879c441fffe461d8a https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-h756ea98_1.conda#5e08c385a1b8a79b52012b74653bbb99 https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h756ea98_3.conda#bfe6623096906d2502c78ccdbfc3bc7a @@ -71,42 +73,45 @@ https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-he02047a_3.c https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.6.3-hb9d3cd8_1.conda#cc4687e1814ed459f3bd6d8e05251ab2 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2#e728e874159b042d92b90238a3cb0dc2 https://conda.anaconda.org/conda-forge/linux-64/libopenlibm4-0.8.1-hd590300_1.conda#e6af610e01d04927a5060c95ce4e0875 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.2.0-h2a3dede_1.conda#160623b9425f5c04941586da43bd1a9c https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda#b6f02b52a174e612e89548f4663ce56a +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda#b58da17db24b6e08bcbf8fed2fb8c915 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 +https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h5888daf_1.conda#9fc429740cfb418a3b3ca107ba7b5e7d https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-hd0bcaf9_1007.conda#28eb714416de4eb83e2cbc47e99a1b45 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda#1bee70681f504ea424fb07cdb090c001 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.5-h3931f03_0.conda#334dba9982ab9f5d62033c61698a8683 https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.3.0-h5888daf_0.conda#355898d24394b2af353eb96358db9fdd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-imake-1.0.10-h5888daf_0.conda#040f0ca9f518151897759ad09ea98b2d https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 +https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.6.3-hbcc6ac9_1.conda#f529917bab7862aaad6867bf2ea47a99 +https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.6.3-hb9d3cd8_1.conda#de3f31a6eed01bc2b8c7dcad07ad9034 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h5888daf_2.conda#e0409515c467b87176b070bff5d9442e https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.2-h5888daf_0.conda#135fd3c66bccad3d2254f50f9809e86a +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.3-h7955e40_0.conda#01cf93c645fa03d44ffe603f51f3d27f https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h2af50b2_12.conda#700f1883f5a0a28c30fd98c43d4d946f https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/bwidget-1.9.14-ha770c72_1.tar.bz2#5746d6202ba2abad4a4707f2a2462795 +https://conda.anaconda.org/conda-forge/linux-64/bwidget-1.10.1-ha770c72_0.conda#bfe52ddc809cff2e046781928d195400 https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda#4336bd67920dd504cd8c6761d6a99645 https://conda.anaconda.org/conda-forge/linux-64/fmt-11.0.2-h434a139_0.conda#995f7e13598497691c1dc476d889bc04 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb @@ -124,8 +129,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.conda#4fab9799da9571266d05ca5503330655 https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libde265-1.0.15-h00ab1b0_0.conda#407fee7a5d7ab2dca12c9ca7f62310ad -https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda#ee605e794bdc14e2b7f84c4faa0d8c2c -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda#8247f80f3dc464d9322e85007e307fe8 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-he02047a_3.conda#9aba7960731e6b4547b3a52f812ed801 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda#0a7f4cd238267c88e5d69f7826a407eb https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d @@ -133,29 +138,28 @@ https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.cond https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-ilp64-0.3.28-pthreads_h3e26593_1.conda#9d5c316d93ee4c5effd9afda8e8af823 +https://conda.anaconda.org/conda-forge/linux-64/libsuitesparseconfig-7.8.3-ss783_h83006af.conda#1dbec7fae0400c4f83cd400a01d187d6 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.20.0-h0e7cc3e_1.conda#d0ed81c4591775b70384f4cc78e05cd1 https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.6.2-h9c3ff4c_0.tar.bz2#a730b2badd586580c5752cc73842e068 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2#c66fe2d123249af7651ebde8984c51c2 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h59595ed_0.conda#a7b444a6e008b804b35521895e3440e2 -https://conda.anaconda.org/conda-forge/linux-64/nccl-2.23.4.1-h03a54cd_3.conda#5ea398a88c7271b2e3ec56cd33da424f +https://conda.anaconda.org/conda-forge/linux-64/nccl-2.24.3.1-h03a54cd_0.conda#7aca64af9bbbf8e681ac68d839973162 https://conda.anaconda.org/conda-forge/linux-64/nss-3.107-hdf54f9c_0.conda#294b7009fe9010b35c25bb683f663bc3 https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.8.1-hd590300_1.conda#6eba22eb06d69e53d0ca01eef42bc675 https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h8bc8fbc_6.conda#dff3627fec2c0584ded391205295abf0 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b -https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda#05a8ea5f446de33006171a7afe6ae857 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda#0b666058a179b744a622d0a4a0c56353 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.5-he73a12e_0.conda#4c3e9fab69804ec6077697922d70c6e2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/xorg-makedepend-1.0.9-h59595ed_0.conda#71c756cfcc6649ed7614eb07712bfce0 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.3-hbcc6ac9_1.conda#62aae173382a8aae284726353c6a6a24 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h235a6dd_1.conda#c05358e3a231195f7f0b3f592078bb0c https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.9-h5e77a74_0.conda#d7714013c40363f45850a25113e2cb05 @@ -168,336 +172,347 @@ https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.2.0-hc https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.2.0-h2c03514_1.conda#41664acd4c99ef4d192e12950ff68ca6 https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-h3e53b52_1004.conda#c21dc684e0e8efa507aba61a030f65e7 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libamd-3.3.3-ss783_h889e182.conda#3f5acd96dfc9ff4c3b02c38120d7dc8b https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h1909e37_2.conda#21e468ed3786ebcb2124b123aa2484b7 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda#8ea26d42ca88ec5258802715fe1ee10b +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a +https://conda.anaconda.org/conda-forge/linux-64/libbtf-2.3.2-ss783_h2377355.conda#c60157e1d22e52ccc5aabc7b2f61c94d +https://conda.anaconda.org/conda-forge/linux-64/libcamd-3.3.3-ss783_h2377355.conda#0178bc68cbcdb89d02b46594acace3d6 +https://conda.anaconda.org/conda-forge/linux-64/libccolamd-3.3.4-ss783_h2377355.conda#69a12c4c23969027c00a5ccca335df74 +https://conda.anaconda.org/conda-forge/linux-64/libcolamd-3.3.4-ss783_h2377355.conda#15fbaba693872fecc4f557922e41859d +https://conda.anaconda.org/conda-forge/linux-64/libcxsparse-4.4.1-ss783_h2377355.conda#1728fa3e6b6e0852e06418cba06e2596 https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.8.4-hd24f944_1.conda#81d00656b41bc42266a999f613dd0fc9 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda#13e8e54035ddd2b91875ba399f0f7c04 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hdb8da77_0.conda#32b23f3487beae7e81495fbc1099ae9e https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hf539b9f_1021.conda#e8c7620cc49de0c6a2349b6dd6e39beb +https://conda.anaconda.org/conda-forge/linux-64/libldl-3.3.2-ss783_h2377355.conda#22292db3a270520d9a63ac2625931603 https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-hd5b35b9_1.conda#06def97690ef90781a91b786cb48a0a9 +https://conda.anaconda.org/conda-forge/linux-64/librbio-4.3.4-ss783_h2377355.conda#02b58b64883d9d888252c6a485e003e6 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hc670b87_16.conda#3d9f3a2e5d7213c34997e4464d2f938c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.2-cuda118_h09a87be_2.conda#58d4ae1f355257b428eace2119c4bde4 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-hb346dea_0.conda#c81a9f1118541aaa418ccb22190c817e -https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.3-cuda118_h09a87be_0.conda#4aeecb7576dd57f1f45e9725383f8f36 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h8d12d68_1.conda#1a21e49e190d1ffe58531a81b6e400e1 +https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h05a5f5f_3.conda#eec77634ccdb2ba6c231290c399b1dae https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.28-pthreads_h3d04fff_1.conda#fdaa89df7b34f5c904f8f1348e5a62a5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda#0515111a9cdf69f83278f7c197db9807 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.14.1-hed91bc2_1.conda#909188c8979846bac8e586908cf1ca6a -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.0-h9eae976_1.conda#53abf1ef70b9ae213b22caa5350f97a9 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.2-h9eae976_0.conda#64a954de15d114281535a26fd4d1f294 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-h988505b_2.conda#9dda9667feba914e0e80b95b82f7402b https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda#a7a49a8b85122b49214798321e2e96b4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda#279b0de5f6ba95457190a1c459a64e31 -https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_0.conda#ae5f4ad87126c55ba3f690ef07f81d64 -https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.3-pyhd8ed1ab_0.conda#ec763b0a58960558ca0ad7255a51a237 -https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda#7d78a232029458d0077ede6cda30ed0c -https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 -https://conda.anaconda.org/conda-forge/linux-64/astroid-3.3.5-py312h7900ff3_0.conda#e1ed4d572a4a16b97368ab00fd646487 +https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda#8c4061f499edec6b8ac7000f6d586829 +https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda#296b403617bafa89df4971567af79013 +https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a +https://conda.anaconda.org/conda-forge/linux-64/astroid-3.3.8-py312h7900ff3_0.conda#9b0b26c5846fdbe76a146e1f8715a1ac https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 +https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.30-hec5e740_0.conda#bc1b9f70ea7fa533aefa6a8b6fbe8da7 https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.5-h0009854_0.conda#d393d0a6c9b993771fbc67a998fccf6c https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py312h7900ff3_9.conda#6df4f61b215587c40ec93810734778ca https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 -https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda#a374efa97290b8799046df7c5ca17164 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda#c88ca2bb7099167912e3b26463fff079 -https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-pyhd8ed1ab_0.conda#6e67fa19bedafa7eb7d6ea91de53e03d -https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda#b34c2833a1f56db610aeb27f206d800d +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_2.conda#1f76b7e2b3ab88def5aa2f158322c7e6 +https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-pyhd8ed1ab_1.conda#840293a20343a601ca2738d359e403eb +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 -https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda#0d07dc29b1c1cc973f76b74beb44915f -https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_1.conda#c5f4eec949e6514ca49e606b1fb7c043 +https://conda.anaconda.org/conda-forge/linux-64/crc32c-2.7.1-py312h66e93f0_0.conda#85a6111a6fb1b1e569e68484df606963 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py312h8fd2918_3.conda#21e433caf1bb1e4c95832f8bb731d64c https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 -https://conda.anaconda.org/conda-forge/noarch/dill-0.3.9-pyhd8ed1ab_0.conda#27faec84454995f6774786c7e5833cd6 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda#fe521c1608280cc2803ebd26dc252212 -https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e +https://conda.anaconda.org/conda-forge/noarch/dill-0.3.9-pyhd8ed1ab_1.conda#5e11310fca410e9f31381157079dee55 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073f7446c90f417b0787122f5b -https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_0.tar.bz2#15621abf59053e184114d3e1d4f9d01e -https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_0.conda#cdcdbe90dfab4075fc1f3c4cf2e4b4e5 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 -https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2#348e27e78a5e39090031448c72f66d5e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 +https://conda.anaconda.org/conda-forge/noarch/ecmwf-api-client-1.6.3-pyhd8ed1ab_1.conda#375691f2607aa31feaf360c58f342b43 +https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda#3366592d3c219f2731721f11bc93755c +https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda#71bf9646cbfabf3022c8da4b6b4da737 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda#d692e9ba6f92dc51484bf3477e36ce7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h743c826_0.conda#12e6988845706b2cfbc3bc35c9a61a95 +https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda#ecb5d11305b8ba1801543002e69d2f2f https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h66e93f0_0.conda#f98e36c96b2c66d9043187179ddb04f4 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.10.0-pyhff2d567_0.conda#816dbc4679a64e4417cd1385d661bb31 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f -https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_0.tar.bz2#6b1f32359fc5d2ab7b491d0029bfffeb +https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_1.conda#8b9328ab4aafb8fde493ab32c5eba731 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd81877a_7.conda#74fbff91ca7c1b9a36b15903f2242f86 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda#2aa5ff7fa34a81b9196532c84c10d865 +https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda#566e75c90c1d0c8c459eb0ad9833dc7a +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 -https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/noarch/isodate-0.7.2-pyhd8ed1ab_0.conda#d68d25aca67d1a06bf6f5b43aea9430d -https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda#ff7ca04134ee8dde1d7cf491a78ef7c7 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 +https://conda.anaconda.org/conda-forge/noarch/isodate-0.7.2-pyhd8ed1ab_1.conda#14c42a6334f38c412449f5a5e4043a5a +https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda#7ac5f795c15f288984e32add616cdc59 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/noarch/legacy-cgi-2.6.1-pyh5b84bb0_3.conda#f258b7f54b5d9ddd02441f10c4dca2ac https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.7-hadbb8c3_0.conda#4a099677417658748239616b6ca96bb6 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda#5dbd1b0fc0d01ec5e0e1fbe667281a11 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libheif-1.18.2-gpl_hffcb242_100.conda#76ac2c07b62d45c192940f010eea11fa -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda#804ca9e91bcaea0824a341d55b1684f2 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda#4dc03a53fc69371a6158d0ed37214cd3 -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda#80030debaa84cfc31755d53742df3ca6 +https://conda.anaconda.org/conda-forge/linux-64/libheif-1.19.5-gpl_hc21c24c_100.conda#3b57852666eaacc13414ac811dde3f8a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 +https://conda.anaconda.org/conda-forge/linux-64/libspex-3.2.1-ss783_h5a7e440.conda#16f6f74255e7dead91a9809386ad531c +https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.5.0-hae8dbeb_0.conda#bb895ca27e7e33ab7a7c2c63529ce1e0 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda#ed6ead7e9ab9469629c6cfb363b5c6e2 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py312hb3f7f12_1.conda#b99d90ef4e77acdab74828f79705a919 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda#a755704ea0e2503f8c227d84829a8e81 -https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2#34fc335fc50eef0b5ea708f2b5f54e0c -https://conda.anaconda.org/conda-forge/noarch/mistune-3.0.2-pyhd8ed1ab_0.conda#5cbee699846772cc939bef23a0d524ed +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b +https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda#827064ddfe0de2917fb29f1da4f8f533 https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py312h68727a3_0.conda#5c9b020a3f86799cdc6115e55df06146 -https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_1.conda#e397d9b841c37fc3180b73275ce7e990 +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda#5b5e3267d915a107eca793d52e1b780a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 -https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhd8ed1ab_0.conda#70959cd1db3cf77b2a27a0836cfd08a7 +https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda#29097e7ea634a45cc5386b95cac6568f +https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyh29332c3_1.conda#0aa03903d33997f3886be58abc890aef https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.2-h669347b_0.conda#1e6c10f7d749a490612404efeb179eb8 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhff2d567_1.conda#8508b703977f4c4ada34d657d051972c +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 -https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda#17064acba08d3686f1135b5ec1b32b12 -https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py312h66e93f0_2.conda#2c6c0c68f310bc33972e7c83264d7786 -https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda#0524eb91d3d78d76d671c6e3cd7cee82 -https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda#72453e39709f38d0494d096bb5f678b7 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda#0cf7fef6aa123df28adb21a590065e3d -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda#035c17fbf099f50ff60bf2eb303b0a83 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.0-pyhd8ed1ab_0.conda#4c849126120d1b3d61cf0eac8120ea70 -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda#986287f89929b2d629bd6ef6497dc307 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda#617f15191456cc6a13db418a275435e5 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda#5a5870a74432aa332f7d32180633ad05 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h66e93f0_0.conda#55d5742a696d7da1c1262e99b6217ceb +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.1-py312h66e93f0_0.conda#add2c79595fa8a9b6d653d7e4e2cf05f +https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_1.conda#e895db5e6cee923018cbb1656c8ca7fa +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_1.conda#4731450b2c059fc567696242bcb7fc05 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda#38e34d2d1d9dca4fb2b9a0a04f604e2c +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda#c0def296b2f6d2dd7b030c2a7f66bb1f https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.21.0-py312h12e396e_0.conda#37f4ad7cb4214c799f32e5f411c6c69f +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py312h12e396e_0.conda#bfb49da0cc9098597d527def04d66f8b https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py312h66e93f0_1.conda#532c3e5d0280be4fea52396ec1fa7d5d -https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed +https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_1.conda#ed39b4a7d7e9294cd8fa1ca05d5bd06b https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda#fc80f7995e396cbaeabd23cf46c413dc +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.3-py312h66e93f0_1.conda#c8d1a609d5f3358d715c2273011d9f4d -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 -https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f -https://conda.anaconda.org/conda-forge/noarch/tenacity-9.0.0-pyhd8ed1ab_0.conda#42af51ad3b654ece73572628ad2882ae -https://conda.anaconda.org/conda-forge/noarch/termcolor-2.5.0-pyhd8ed1ab_0.conda#29a5d22565b850099cd9959862d1b154 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb +https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_1.conda#60ce69f73f3e75b21f1c27b1b471320c +https://conda.anaconda.org/conda-forge/noarch/tenacity-9.0.0-pyhd8ed1ab_1.conda#a09f66fe95a54a92172e56a4a97ba271 +https://conda.anaconda.org/conda-forge/noarch/termcolor-2.5.0-pyhd8ed1ab_1.conda#1ce02d60767af357e864ce61895268d2 https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda#df68d78237980a159bd7149f33c0e8fd -https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_0.conda#ee8ab0fe4c8dfc5a6319f7f8246022fc -https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda#0062a5f3347733f67b0f33ca48cc21dd -https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda#34feccdd4177f2d3d53c73fc44fd9a37 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_1.conda#1d9ab4fc875c52db83f9c9b40af4e2c8 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda#e417822cb989e80a0d2b1b576fdd1657 -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda#501f6d3288160a31d99a2f1321e77393 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2025.1.10.15-pyhd8ed1ab_0.conda#c09a1ab3bdcabb625004ab692cda1e6f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py312h2ec8cdc_1.conda#96226f62dddc63226472b7477d783967 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda#588486a61153f94c7c13816f7069e440 -https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_1.conda#6042b782b893029aa40335782584a092 -https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda#bdb2f437ce62fd2f1fef9119a37a12d9 -https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.2.0-pyhd8ed1ab_0.conda#a1f7264726115a2f8eac9773b1f27eba +https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_2.conda#a7bafc627d25a939bb68206bd7abd483 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.2.0-pyhd8ed1ab_1.conda#c57589177253e911e293345226c7eca1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.2.1-hb9d3cd8_1.conda#f35a9a2da717ade815ffa70c0e8bdfbd -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-hb9d3cd8_4.conda#7da9007c0582712c4bad4131f89c8372 -https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.9.0-pyhd8ed1ab_0.conda#156c91e778c1d4d57b709f8c5333fd06 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.9.0-pyhd8ed1ab_1.conda#c79cea50b258f652010cb6c8d81591b5 https://conda.anaconda.org/conda-forge/noarch/yapf-0.32.0-pyhd8ed1ab_0.tar.bz2#177cba0b4bdfacad5c5fbb0ed31504c4 https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 -https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 +https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda#e52c2ef711ccf31bb7f70ca87d144b9e https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a -https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 -https://conda.anaconda.org/conda-forge/linux-64/arpack-3.9.1-nompi_h77f6705_101.conda#ff39030debb47f6b53b45bada38e0903 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda#74ac5069774cdbc53910ec4d631a3999 +https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda#1a3981115a398535dbe3f6d5faae3d36 +https://conda.anaconda.org/conda-forge/linux-64/arpack-3.9.1-nompi_hf03ea27_102.conda#e09af397232ef1070e0b6cbf4c64aacb https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.5-hbaf354b_4.conda#2cefeb144de7712995d1b52cc6a3864c https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.13.0-h935415a_0.conda#debd1677c2fea41eb2233a260f48a298 -https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_0.conda#6d4e9ecca8d88977147e109fc7053184 -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyhd8ed1ab_0.conda#461bcfab8e65c166e297222ae919a2d4 +https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda#d48f7e9fdec44baf6d1da416fe402b04 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyhd8ed1ab_3.conda#b33551d9bac06d754762e8ccb3c4df03 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.1-hf8ad068_0.conda#1b7a01fd02d11efe0eb5a676842a7b7d -https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f -https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.8-py312h178313f_0.conda#fe8c93f4c75908fe2a1cc45ed0c47edf +https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-pyhd8ed1ab_1.conda#82bea35e4dac4678ba623cf10e95e375 +https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda#55c7804f428719241a90b152016085a1 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py312h178313f_0.conda#df113f58bdfc79c98f5e07b6bd3eb4c2 https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.1-h18eb788_0.conda#2e7dedf73dfbfcee662e2a0f6175e4bb -https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.0-py312h66e93f0_1.conda#a921e2fe122e7f38417b9b17c7a13343 -https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py312h66e93f0_0.conda#6198b134b1c08173f33653896974d477 +https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_1.conda#af53e838cab8872e7e014a8336aaaffb https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a +https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda#c56a7fa5597ad78b62e1f5d21f7f8b8f https://conda.anaconda.org/conda-forge/noarch/fire-0.7.0-pyhd8ed1ab_0.conda#c8eefdf1e822c56a6034602e67bc92a5 -https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda#a25e5df6b26be3c2d64be307c1ef0b37 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.0-py312h178313f_0.conda#f404f4fb99ccaea68b00c1cc64fc1e68 +https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_1.conda#c43926857c0c7ba1a29c8c4a221a5e78 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py312h178313f_1.conda#bc18c46eda4c2b29431981998507e723 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b +https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda#40182a8d62a61d147ec7d3e4c5c36ac2 https://conda.anaconda.org/conda-forge/linux-64/git-2.46.0-pl5321hb5640b7_0.conda#825d146359bc8b85083d92259d0a0e1b -https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda#7c14f3706e099f8fcd47af2d494616cc https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.1.0-h0b3b770_0.conda#ab1d7d56034814f4c3ed9f69f8c68806 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.1-pyha770c72_0.conda#b9f5330c0853ccabc39a9878c6f1a2ab -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda#c808991d29b9838fb4d96ce8267ec9ec -https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda#25df261d4523d9f9783bcdb7208d872f +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_1.conda#ef7dc847f19fe4859d5aaa33385bf509 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf8243ee348f3a10a14ed0cae323e0c1 https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_1.conda#afcd1b53bcac8844540358e33f33d28f +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 +https://conda.anaconda.org/conda-forge/linux-64/libcholmod-5.3.0-ss783_h3fa60b6.conda#c832eba46245682fabd96afb3f561601 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py312he28fd5a_2.conda#3acf38086326f49afed094df4ba7c9d9 -https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 +https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.0-pyhd8ed1ab_0.conda#d10024c163a52eeecbb166fdeaef8b12 +https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_2.conda#cc2da171723d50bc1a7f8a53a8d0319f +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h710cb58_1.conda#69a8838436435f59d72ddcb8dfd24a28 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda#385f46a4df6f97892503a841121a9acf -https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda#5dd546fe99b44fda83963d15f84263b7 -https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.1-pyhd8ed1ab_0.conda#81bb643d6c3ab4cbeaf724e9d68d0a6a +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c +https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f +https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.1-pyhd8ed1ab_1.conda#71ac632876630091c81c50a05ec5e030 https://conda.anaconda.org/conda-forge/linux-64/poppler-24.08.0-h47131b8_1.conda#0854b9ff0cc10a1f6f67b0f352b8e75a https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 -https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 -https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyh7850678_0.conda#5003da197661e40a2509e9c4651f1eea -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_0.conda#b6dfd90a2141e573e4b6a81630b56df5 -https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_0.conda#3ec7a7dd072707e61baac6d474349958 +https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda#a36aa6e0119331d3280f4bba043314c7 +https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda#d4582021af437c931d7d77ec39007845 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_1.conda#24ed1dc544b101075fa7462be5c3a5c5 https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda#746ce19f0829ec3e19c93007b1a224d3 -https://conda.anaconda.org/conda-forge/noarch/rdflib-7.1.1-pyh0610db2_0.conda#325219de79481bcf5b6446d327e3d492 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 -https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.3.2-pyhd8ed1ab_0.conda#579728219c07d6151da2b02f14e68e4f +https://conda.anaconda.org/conda-forge/noarch/rdflib-7.1.1-pyhd8ed1ab_1.conda#2405a5561bffdef682167ca6db14683c +https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_1.conda#8c9083612c1bfe6878715ed5732605f8 +https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.3.2-pyhd8ed1ab_1.conda#cc0f2fcfec5e6b67a20cb24f8b9f3c93 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-pyhd8ed1ab_3.conda#1f7482562f2082f1b2abf8a3e2a41b63 -https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py312h66e93f0_1.conda#28ed869ade5601ee374934a31c9d628e -https://conda.anaconda.org/conda-forge/linux-64/tbb-2022.0.0-hceb3a55_0.conda#79f0161f3ca73804315ca980f65d9c60 +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.10-py312h66e93f0_0.conda#5260b7fb19694ee5bc4ed0ee7a2a769f https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda#f1acf5fdefa8300de697982bcb1761c9 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_0.conda#4085c9db273a148e149c03627350e22c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda#1d601bc1d28b5ce6d112b90f4b9b8ede -https://conda.anaconda.org/conda-forge/noarch/webob-1.8.9-pyhd8ed1ab_0.conda#ff98f23ad74d2a3256debcd9df65d37d +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda#9efbfdc37242619130ea42b1cc4ed861 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_1.conda#c7b1961b139c21381764de4704b6bbfb +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.28.1-pyhd8ed1ab_0.conda#680b1c287b10cefc8bda0530b217229f +https://conda.anaconda.org/conda-forge/noarch/webob-1.8.9-pyhd8ed1ab_1.conda#293718ddac83a0fbc0f2193ff77d1e1c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hb9d3cd8_1.conda#f35bec7fface97f67f44ca952fc740b7 -https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhd8ed1ab_1.conda#8380155472575eec439a47eef8f62b80 +https://conda.anaconda.org/conda-forge/noarch/yamale-5.3.0-pyhd8ed1ab_0.conda#d4b5f3a50decd28cd747f4b5f7aea33f https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_1.conda#fe91647002aab05979fee9392d745f96 -https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.0-py312h66e93f0_0.conda#601d2b19a54fd9346ba18c07c2516339 -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.8-py312h178313f_0.conda#63eb2bd555d446218c7bbdec2dd746c5 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h66e93f0_0.conda#91df2efaa08730416bec2a4502309275 +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.11-py312h178313f_0.conda#8219afa093757bbe07b9825eb1973ed9 https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.2-h6c0439f_6.conda#4e472c316d08af60faeb71f86d7563e1 https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hd126650_2.conda#36df3cf05459de5d0a41c77c4329634b https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.7.0-h10ac4d7_1.conda#ab6d507ad16dbe2157920451d662e4a1 -https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.2-pyhd8ed1ab_0.conda#ac582de2324988b79870b50c89c91c75 +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-hd8ed1ab_3.conda#e250a492fc70bf604737328dbe02846c +https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.2-pyhd8ed1ab_1.conda#53eca64665361194ca4bbaf87c0ded99 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d -https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 +https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyhecae5ae_1.conda#04151bb8e351c6209caad045e4b1f4bd https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a -https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.3-py312hda17c39_0.conda#2abada8c216dd6e32514535a3fa245d4 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.11.2-pyhff2d567_1.conda#ae2be36dab764e655a22f240837cef75 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py312hda17c39_0.conda#50052304026b6f33fdd34563ee4b47b8 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.12.1-pyhd8ed1ab_0.conda#48060c395f1e87a80330c0adaad332f7 https://conda.anaconda.org/conda-forge/noarch/eofs-2.0.0-pyhff2d567_0.conda#a3cce45423d73c3d4420b71351e71fef -https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe +https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-pyhd8ed1ab_1.conda#4f282d2b2904441afca6367764fa718e https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-hf7fa9e8_2.conda#1d6bdc6b2c62c8cc90c67b50142d7b7f -https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda#0b2154c1818111e17381b1df5b4b0176 -https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-hf1a501a_15.conda#d2e16a32f41d67c7d280da11b2846328 +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.44-pyhff2d567_0.conda#140a4e944f7488467872e562a2a52789 +https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-h51d0b48_17.conda#21ce981dc10b2d7ec8da29872b6fa96c https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py312h6d9a048_4.conda#a810fadedc4edc06b4282d1222467837 https://conda.anaconda.org/conda-forge/noarch/imageio-2.36.1-pyh12aca89_1.conda#84d5a2f075c861a8f98afd2842f7eb6e https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.1-hd8ed1ab_0.conda#d6c936d009aa63e5f82d216c95cdcaee https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_0.conda#720745920222587ef942acfbc578b584 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_0.conda#a14218cfb29662b4a19ceb04e93e298e +https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hf8d3e68_2.conda#ffe68c611ae0ccfda4e7a605195e22b3 -https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_1.conda#4809b9f4c6ce106d443c3f90b8e10db2 +https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda#d10d9393680734a8febc4b362a4c94f2 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_0.conda#2c51703b4d775f8943c08a361788131b +https://conda.anaconda.org/conda-forge/linux-64/libklu-2.3.5-ss783_hfbdfdfc.conda#9ef3af7a987541ae75e8d3765c6f31a2 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/libpq-17.2-h04577a9_0.conda#52dd46162c6fb2765b49e6fd06adf8d5 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h15fa968_9.conda#4957a903bd6a68cc2e53e47476f9c6f4 +https://conda.anaconda.org/conda-forge/linux-64/libspqr-4.3.4-ss783_hae1ff0d.conda#04b223bbfa980f40315c3699a0e0ad33 +https://conda.anaconda.org/conda-forge/linux-64/libumfpack-6.3.5-ss783_hd4f9ce1.conda#7196f225e50e2582ea887e12146ddb5f https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda#e064ca33edf91ac117236c4b5dee207a https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.14.1-py312hf9745cd_0.conda#eff78da3a99c42c0950cfd25eb996c20 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py312hfb8ada1_0.conda#d0745ae74c2b26571b692ddde112eebb -https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 -https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhff2d567_0.conda#a97b9c7586cedcf4a0a158ef3479975c -https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_0.conda#6f9eb38d0a87898cf5a7c91adaccd691 -https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba -https://conda.anaconda.org/conda-forge/noarch/pylint-3.3.1-pyhd8ed1ab_0.conda#2a3426f75e2172c932131f4e3d51bcf4 +https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.0-h861ebed_0.conda#8779ee58be1c8b35e7af464a73674957 +https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d +https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_1.conda#e557abf678a0bf100fe7cf9d2b4f4a72 +https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_3.conda#556a52a96313364aa79990ed1337b9a5 +https://conda.anaconda.org/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda#5842a1fa3b9b4f9fe7069b9ca5ed068d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h9211aeb_9.conda#173afeb0d112c854fd1a9fcac4b5cce3 https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py312hfb10629_0.conda#325cc5f0e0dc36562f3de2a4dbded572 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_0.conda#cb8a11b6d209e3d85e5094bdbd9ebd9c -https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.5-pyhd8ed1ab_0.conda#ecd5e850bcd3eca02143e7df030ee50f -https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_0.conda#52b91ecba854d55b28ad916a8b10da24 -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 -https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2.post1-pyhff2d567_0.conda#bd5ae3c630d5eed353badb091fd3e603 -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py312hc0a28a1_2.conda#8300d634adec4a6aed35a87e90e9cb07 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda#b43233a9e2f62fb94affe5607ea79473 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.5-pyhd8ed1ab_1.conda#b92ee0cf3b26087455244248b1a04e0a +https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_1.conda#c4b7295798eff80144dc4ca4551efa80 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd +https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2.post1-pyhff2d567_1.conda#0903621fe8a9f37286596529528f4f74 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.8.0-py312hc0a28a1_0.conda#3f62987017ad18e9e7dadce9899de9ef +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.0-py312h180e4f1_1.conda#401e9d25f6ed7d9d9a06da0dca473c3e https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.conda#5be02e05e1adaa42826cc6800ce399bc -https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_1.conda#5abeaa41ec50d4d1421a8bc8fbc93054 -https://conda.anaconda.org/conda-forge/linux-64/suitesparse-7.8.3-hb42a789_1.conda#216fa6eae33d712fa688fa2d113a65ad +https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda#9aa358575bbd4be126eaa5e0039f835c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.16-hb9d3cd8_0.conda#7c0a9bf62d573409d12ad14b362a96e5 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.379-h5a9005d_9.conda#5dc18b385893b7991a3bbeb135ad7c3e https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.12.0-hd2e3451_0.conda#61f1c193452f0daa582f39634627ea33 -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.6.1-pyhd8ed1ab_0.conda#e88d74bb7b9b89d4c9764286ceb94cc9 +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.6.2-pyhd8ed1ab_1.conda#976ff24762f1f991b08f7a7a41875086 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.38.3-h8bb6dbc_1.conda#73265d4acc551063cc5c5beab37f33c5 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.3-pyhd8ed1ab_0.conda#dd3acd023fc358afab730866a0e5e3f5 -https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 -https://conda.anaconda.org/conda-forge/linux-64/julia-1.10.4-hf18f99d_1.conda#cc0ef9c191bab16211970a29b6787d69 -https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-h8bb6dbc_1.conda#87c13b15a9f3ec25cd3c9d8f2e33fe0b +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h8ee276e_7.conda#28a9681054948a7d7e96a7b8fe9b604e +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda#c1b0f663ff141265d1be1242259063f0 +https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_1.conda#d733874844f9808ed46a93362f89bc2d +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 +https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_2.conda#bb0230917e2473c77d615104dbe8a49d https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.9.2-h353785f_1.conda#c363d0b330b4b21b4c1b10e0981d3a99 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda#9e7960f0b9ab3895ef73d92477c47dae -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda#83f045969988f5c7a65f3950b95a8b35 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_2.conda#2380c9ba933ffaac9ad16d8eac8e3318 -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h22f9119_106.conda#5b911bfe75855326bae6857451268e59 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h21d6d8e_102.conda#9049ba34261ce7106220711d313fcf61 +https://conda.anaconda.org/conda-forge/linux-64/libparu-1.0.0-ss783_h8814b27.conda#707eb61a0c3b223702ac326c04546b50 +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-h49af25d_2.conda#b9846db0abffb09847e2cb0fec4b4db6 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda#c27a17a8c54c0d35cf83bbc0de8f7f77 +https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h22f9119_108.conda#0967d692b1dd33e7d809cfa355090e4b +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h21d6d8e_101.conda#0cabc6745882859ec7be35433c7b8f24 https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d https://conda.anaconda.org/conda-forge/linux-64/postgresql-17.2-h1122569_0.conda#848402b976b31bfecb3e476ea85cb285 -https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.8.2-pyhd8ed1ab_0.conda#84377261c09c02182d76fbe79e69c9bf -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_2.conda#85fa2fdd26d5a38792eb57bc72463f07 -https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d +https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.8.2-pyhd8ed1ab_1.conda#7bfe485a0e86e9e4b7111357765c73dc +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.3.0-pyhd8ed1ab_0.conda#269109707b3810adce78b6afb2a82c80 +https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_1.conda#010e50e74c467db278f1398a74106a04 https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py312hc0a28a1_3.conda#81bbcb20ea4a53b05a8cf51f31496038 https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h32f4cee_16.conda#feee98a221344be7a447b80b410df867 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.2-py312h7a48858_1.conda#6b5f4c68483bd0c22bca9094dafc606b -https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_0.conda#8e1b01f05e8f97b0fcc284f957175903 +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py312h7a48858_0.conda#102727f71df02a51e9e173f2e6f87d57 +https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_1.conda#3917cd49c30278aad07536ee77084eb0 https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda#40d80cd9fa4cc759c6dba19ea96642db https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda#97dc960f3d9911964d73c2cf240baea5 -https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-h13910d2_3.conda#7f10762cd62c8ad03323c4dc3ee544b1 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.9.20-pyhd8ed1ab_0.conda#6de55c7859ed314159eaf2b7b4f19cc7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 -https://conda.anaconda.org/conda-forge/noarch/xarray-2024.11.0-pyhd8ed1ab_0.conda#7358eeedbffd742549d372e0066999d3 -https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda#41abde21508578e02e3fd492e82a05cd +https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-heeae502_5.conda#2977d5268a6050196c42f03fd2a70020 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.12.12-pyhd8ed1ab_0.conda#59d646aa704b6024cb965be43493ed45 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/xarray-2025.1.1-pyhd8ed1ab_0.conda#81db80ba986122da460800a67bf8ac7f +https://conda.anaconda.org/conda-forge/noarch/zarr-3.0.0-pyhd8ed1ab_0.conda#5b82afdd503bec6825b274e7d6f425eb https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.11.0-h325d260_1.conda#11d926d1f4a75a1b03d1c053ca20424b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.10.0-pyhd8ed1ab_0.conda#9437cfe346eab83b011b4def99f0e879 -https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.11.2-pyhff2d567_1.conda#171408408370e59126dc3e39352c6218 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.10.0-pyhd8ed1ab_2.conda#ed15dcf944706ae6ea54968dfa4a06a5 +https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_1.conda#dd71e4ec2fbffe38c0359976505f816e +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.12.1-pyhd8ed1ab_0.conda#58df114d7649ddb3f68c9b9adc6fbabe https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h9e768e6_3.conda#c330e87e698bae8e7381c0315cf25dd0 https://conda.anaconda.org/conda-forge/linux-64/gdal-3.9.2-py312h1299960_7.conda#9cf27e3f9d97ea13f250db9253a25dc8 https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda#953e31ea00d46beb7e64a79fc291ec44 @@ -511,14 +526,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgdal-pg-3.9.2-h5e77dd0_7.cond https://conda.anaconda.org/conda-forge/linux-64/libgdal-postgisraster-3.9.2-h5e77dd0_7.conda#3392965ffc4e8b7c66a532750ce0e91f https://conda.anaconda.org/conda-forge/linux-64/libgdal-xls-3.9.2-h03c987c_7.conda#165f12373452e8d17889e9c877431acf https://conda.anaconda.org/conda-forge/linux-64/magics-4.15.4-h24e9adf_1.conda#9731bb0d2a3917cab718fd7c90dea857 -https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 -https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 -https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda#5971cc64048943605f352f7f8612de6c +https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_1.conda#1efb1227abaf20324ceb7ac9c06bb86d +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea +https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_1.conda#9a2be7d0089f5934b550933ca0d9fe85 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py312h7900ff3_1.conda#f110e71421e5c86e50232cc027c6d85c -https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.2-cuda118_pyh40095f8_2.conda#b6eb4d80feb259ec87309a09d7ad48d4 +https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.3-cuda118_pyh0cc23a4_0.conda#44e85f4f035efbdb185400a3c35d11c8 https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 -https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.6.1-pyhd8ed1ab_0.conda#d1023ccf92d8235cd4808ef53e274a5e +https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.6.1-pyhd8ed1ab_1.conda#8f854db1ce53e64891f718db849adbb0 https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r42hc72bb7e_1005.conda#f2744985b083b1bbffd4df19437cf1e8 @@ -577,29 +592,31 @@ https://conda.anaconda.org/conda-forge/noarch/r-withr-3.0.0-r42hc72bb7e_0.conda# https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.45-r42ha18555a_0.conda#9e13c392bfcee4a261e4b513d6d862e7 https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r42hc72bb7e_2.conda#2f3614450b54f222c1eff786ec2a45ec https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda#97f60a93ca12f4fdd5f44049dcee4345 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.24.0-py312hf9745cd_3.conda#3612f99c589d51c363c8b90c0bcf3a18 -https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.0-py312hf9745cd_1.conda#7494c06b01edc857a4f7910946c408ab +https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 +https://conda.anaconda.org/conda-forge/linux-64/suitesparse-7.8.3-ss783_h36e971b.conda#64c7f927c297e2e3b94c4330e3d9db18 https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.26.0-h86fa3b2_0.conda#061175d9d4c046a1cf8bffe95a359fab https://conda.anaconda.org/conda-forge/linux-64/cdo-2.4.1-h9fe33b1_1.conda#a326dab3d2a1a8e32c2a6f792fac3161 -https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.14.1-pyhd8ed1ab_0.conda#1870fe8c9bd8967429e227be28ab94d2 -https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyh9f0ad1d_0.tar.bz2#acd9a12a35e5a0221bdf39eb6e4811dc +https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.15.0-pyhd8ed1ab_0.conda#211303621409d703235598be8c378b3c +https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyhd8ed1ab_1.conda#a8dc13f40343dd9706cab9b9cbc49099 https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda#a201de7d36907f2355426e019168d337 https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 -https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_41-imagemagick_hcfc5581_0.conda#da7c6862e9159761ad8af4531587279c +https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_43-imagemagick_hf2058d9_2.conda#d656f8b4405fb5f1821f3ebba98e5e10 https://conda.anaconda.org/conda-forge/noarch/iris-3.11.0-pyha770c72_0.conda#a5e36260789ce92074c3736533ecdd61 +https://conda.anaconda.org/conda-forge/linux-64/julia-1.10.4-hf18f99d_1.conda#cc0ef9c191bab16211970a29b6787d69 https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h8d2e343_13_cpu.conda#dc379f362829d5df5ce6722565110029 https://conda.anaconda.org/conda-forge/linux-64/libgdal-kea-3.9.2-h1df15e4_7.conda#c693e703649051ee9db0fabd4fcd0483 https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.9.2-hf2d2f32_7.conda#4015ef020928219acc0b5c9edbce8d30 https://conda.anaconda.org/conda-forge/linux-64/libgdal-tiledb-3.9.2-h4a3bace_2.conda#c3fac34ecba2fcf9d5d31a03b975d5a1 -https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_1.tar.bz2#789ce01416721a5533fb74aa4361fd13 -https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.3-pyhd8ed1ab_0.conda#96283f508e7296912824cd9e112eaf93 -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.1-pyhd8ed1ab_0.conda#3ee79082e59a28e1db11e2a9c3bcd85a -https://conda.anaconda.org/conda-forge/linux-64/nco-5.2.8-hf7c1f58_0.conda#6cd18a9c6b8269b0cd101ba9cc3d02ab -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed -https://conda.anaconda.org/conda-forge/noarch/prospector-1.13.3-pyhd8ed1ab_0.conda#46b277d8d1b3b302150054f308b45095 +https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_2.conda#7807e1b976aaab2b457002abffdf5e1c +https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.3-pyhd8ed1ab_1.conda#b7ad70c100bced5b6bc2d479c473d2a7 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/linux-64/nco-5.3.0-hf7c1f58_0.conda#1bc175c5bab6f9c78326ac162859b897 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda#b3e783e8e8ed7577cf0b6dee37d1fbac +https://conda.anaconda.org/conda-forge/noarch/prospector-1.13.3-pyhd8ed1ab_1.conda#0d6d32575a276ff0a1e612220d435b4a https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.1-py312h7900ff3_0.conda#683ec8787a523de54b02c885e2c2aefa -https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.2-py312h7900ff3_0.conda#a972ba77217a2cac592c41dd3cc56dfd +https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.3-py312h7900ff3_0.conda#16e30aaadf0c1f957d4d42553c9403ac https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r42ha503ecb_0.conda#12b6fa8fe80a6494a948c6ea2f34340d https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r42h57805ef_0.conda#9febce7369c72d991e2399d7d28f3390 @@ -625,22 +642,22 @@ https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.10_0-r42h9f9f741_0.cond https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.3.0-r42ha503ecb_0.conda#3d62906e9c1fecf61370a3ad6e808e5e https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.6-r42hbfba7a4_1.conda#5c3d7a89a2d5e1c0885f92d1aa6fde30 https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r42h57805ef_1.conda#5367d265c0c9c151dea85f1ccb515ec1 -https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b -https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda#a79d8797f62715255308d92d3a91ef2e -https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.2-cuda118_pyh256f914_2.conda#15301dcebb59ad1a582a0200891b3fea -https://conda.anaconda.org/conda-forge/noarch/datapi-0.1.1-pyhd8ed1ab_0.conda#59e86501bc8fc4fc8f1a33912b74ae5f -https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhd8ed1ab_4.conda#f481c17430f801e68ee3b57cc30ecd2e +https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_1.conda#584e6aab3a5cffde537c575ad6a673ff +https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 +https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.3-cuda118_pyh256f914_0.conda#cfb6634184cb3d62af351ce8e5be72c3 +https://conda.anaconda.org/conda-forge/noarch/datapi-0.1.2-pyhd8ed1ab_0.conda#9f2f0d8106777cdcd4f2eac665065091 +https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhd8ed1ab_5.conda#6779887899e0b0b6fb316253eb0f5c64 https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-h5888daf_13_cpu.conda#b654d072b8d5da807495e49b28a0b884 https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.9.2-ha770c72_7.conda#63779711c7afd4fcf9cea67538baa67a https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h39682fd_13_cpu.conda#49c60a8dc089d8127b9368e9eb6c1a77 https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.5-pyhd8ed1ab_1.conda#dd50a122c5b9782b1e9b2695473bfd95 https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py312h7900ff3_1.conda#080bc8f34a9cb0ab81ae0369fd43b7ab https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py312h7900ff3_1.conda#ea719cfcc2e5b815b137b7082ece8aeb -https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.9.0-pyhd8ed1ab_0.conda#177a9651dc31c11a81eddc2a5e2e524e +https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.9.0-pyhd8ed1ab_1.conda#53912b9ade4f2ea4dd1d5d6d3de7df70 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h01725c0_2_cpu.conda#add603bfa43d9bf3f06783f780e1a817 -https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhd8ed1ab_0.conda#3fd1a0b063c1fbbe4b7bd5a5a7601e84 +https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhff2d567_1.conda#61f71e3d4df9dbe55340c129f96cb8ee https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_3.4-r42h61816a4_2.conda#8536251313f441c4d70ff11ad976d294 https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.6-r42hc72bb7e_0.conda#4fb1765d6dc531936db81af3f6be316a https://conda.anaconda.org/conda-forge/noarch/r-doparallel-1.0.17-r42hc72bb7e_2.conda#1cddfbaade4416f0234670391bb31ba2 @@ -657,10 +674,10 @@ https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r42h75 https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_45-r42hbcb9c34_0.conda#bcd96dc088f54514a54d57e6b8ed51b6 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.5-r42ha503ecb_0.conda#5689030c60302fb5bb7a48b54c11dbe8 https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.5-pyhd8ed1ab_0.conda#f0bc736c973b48bf4bd09a1fba45c5b2 +https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.5-pyhd8ed1ab_1.conda#b53d59d2abbc0b383d8a1bc0f06ed2d6 https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py312h5aa26c2_1.conda#4a30f4277a1894928a7057d0e14c1c95 https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-h5888daf_13_cpu.conda#cd2c36e8865b158b82f61c6aac28b7e1 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.5-hd8ed1ab_1.conda#593a8fd80968f14f8a7b3a685ddc455e https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-h7cb714c_54.conda#7363202c15302898deb49e82ca3e5f58 https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.1-r42hc72bb7e_0.conda#6bd41a85dc43541400311eca03d4e2d4 https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r42hc72bb7e_1005.conda#da116b29105a8d48571975a185e9bb94 @@ -671,18 +688,18 @@ https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.cond https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.11-py312hd177ed6_1.conda#246c5f31c607ecfe1ece1e8cc6ecc9c5 https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-17.0.0-hf54134d_13_cpu.conda#46f41533959eee8826c09e55976b8c06 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.4-hd8ed1ab_1.conda#ab83e3b9ca2b111d8f332e9dc8b2170f +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.5-hd8ed1ab_1.conda#82ffc2974cd09b45182f018b5af731c8 https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_2.conda#5f7d505626cb057e1320bbd46dd02ef2 https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.19-pyhd8ed1ab_0.conda#09ea33eb6525cc703ce1d39c88378320 +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.21-pyhd8ed1ab_0.conda#e72a014dbbd35545dcfba4de9c92fb1d https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.3-r42hc72bb7e_0.conda#1b2b8fa85a9d0556773abac4763d8ef9 https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r42ha503ecb_1.conda#6aa1414e06dfffc39d3b5ca78b60b377 https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.5-r42hc72bb7e_0.conda#959f69b6dfd4b620a15489975fa27670 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.11.2-pyhff2d567_1.conda#4ea56955c9922ac99c35d0784cffeb96 +https://conda.anaconda.org/conda-forge/noarch/dask-2024.12.1-pyhd8ed1ab_0.conda#f3134df9565c4d4415ff0e61f3aa28d0 https://conda.anaconda.org/conda-forge/linux-64/r-fields-15.2-r42h61816a4_0.conda#d84fe2f9e893e92089370b195e2263a0 https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r42hc72bb7e_1.conda#7fe060235dac0fc0b3d387f98e79d128 https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_1.conda#86286b197e33e3b034416c18ba0f574c @@ -690,11 +707,11 @@ https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_0-r42h57805ef_2.con https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.11.1-pyhd8ed1ab_0.conda#54cad67b1fb303d452019c45e4fea1bc https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r42hc72bb7e_2.conda#8079a86a913155fe2589ec0b76dc9f5e https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.14-pyhd8ed1ab_0.conda#351a11ac1215eb4f6c5b82e30070277a -https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.5-pyhd8ed1ab_0.conda#b808b8a0494c5cca76200c73e260a060 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.0-pyhd8ed1ab_0.conda#344261b0e77f5d2faaffb4eac225eeb7 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda#05706dd5a145a9c91861495cd435409a -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e +https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.6-pyhd8ed1ab_0.conda#2e4c30e09d50d025836279d80140d0a4 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda#837aaf71ddf3b27acae0e7e9015eebc6 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda#1a3281a0dc355c02b5506d87db2d78ac +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 From 8d1a905ff75cfc1a894f4f889e813e22d53b7eaf Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Fri, 17 Jan 2025 17:34:33 +0000 Subject: [PATCH 82/87] Fix circle ci nightly test installation from source development mode (and test mode) that times out (#3864) Co-authored-by: Manuel Schlund <32543114+schlunma@users.noreply.github.com> --- .circleci/config.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 82492e724f..ffb051468a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -90,8 +90,9 @@ commands: # Install . /opt/conda/etc/profile.d/conda.sh mkdir /logs - mamba env create >> /logs/conda.txt 2>&1 + mamba env create conda activate esmvaltool + mamba list >> /logs/conda.txt pip install << parameters.flags >> ".[<>]"> /logs/install.txt 2>&1 esmvaltool install Julia > /logs/install_julia.txt 2>&1 if [[ "<>" != *'--editable'* ]] @@ -201,8 +202,9 @@ jobs: # https://docs.esmvaltool.org/en/latest/quickstart/installation.html#install-from-source . /opt/conda/etc/profile.d/conda.sh mkdir /logs - mamba env create >> /logs/conda.txt 2>&1 + mamba env create conda activate esmvaltool + mamba list >> /logs/conda.txt pip install --editable .[develop] esmvaltool install Julia > /logs/install_julia.txt 2>&1 git clone https://github.com/ESMValGroup/ESMValCore $HOME/ESMValCore From c84868e3b7d9cfa07e40cd5ccf755f8f87ba1446 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:09:19 +0000 Subject: [PATCH 83/87] [Condalock] Update Linux condalock file (#3865) Co-authored-by: valeriupredoi --- conda-linux-64.lock | 385 ++++++++++++++++++++++---------------------- 1 file changed, 193 insertions(+), 192 deletions(-) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 2c4be9fdc0..c475b3c9a2 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -12,10 +12,10 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed3 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda#ad8527bf134a90e1c9ed35fa0b64318c -https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.1-ha770c72_0.conda#e94dd7479ba12963364d855fb23cce4f +https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.2-ha770c72_0.conda#4ded4ab71d9fd3764d796a23ca3e722b https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.2.0-h41c2201_101.conda#fb126e22f5350c15fec6ddbd062f4871 @@ -41,9 +41,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-hf23e847_1.con https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda#33405d2a66b1411db9f7242c8b97c9e7 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda#04b34b9a40cdc48cfdab261ab176ff74 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024b-hb9d3cd8_0.conda#db124840386e1f842f93372897d1b857 +https://conda.anaconda.org/conda-forge/linux-64/tzcode-2025a-hb9d3cd8_0.conda#e18bdeebf29176790089b654cfedaaec https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda#fb901ff28063514abb6046c9ec2c4a45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -66,6 +67,7 @@ https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda#8247f80f3dc464d9322e85007e307fe8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -80,7 +82,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.con https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.2.0-h2a3dede_1.conda#160623b9425f5c04941586da43bd1a9c https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda#b58da17db24b6e08bcbf8fed2fb8c915 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_0.conda#84bd1c9a82b455e7a2f390375fb38f90 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -90,11 +92,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 https://conda.anaconda.org/conda-forge/linux-64/mbedtls-3.5.1-h5888daf_1.conda#9fc429740cfb418a3b3ca107ba7b5e7d https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-hd0bcaf9_1007.conda#28eb714416de4eb83e2cbc47e99a1b45 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/nspr-4.36-h5888daf_0.conda#de9cd5bca9e4918527b9b72b6e2e1409 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda#5e2a7acfa2c24188af39e7944e1b3604 https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h4bc722e_1009.conda#1bee70681f504ea424fb07cdb090c001 https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.6.6-he8a937b_2.conda#77d9955b4abddb811cb8ab1aa7d743e4 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.5-h3931f03_0.conda#334dba9982ab9f5d62033c61698a8683 https://conda.anaconda.org/conda-forge/linux-64/sed-4.8-he412f7d_0.tar.bz2#7362f0042e95681f5d371c46c83ebd08 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -123,6 +125,7 @@ https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.c https://conda.anaconda.org/conda-forge/linux-64/gtest-1.14.0-h434a139_2.conda#89971b339bb4dfbf3759f1f2528d81b1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda#c48fc56ec03229f294176923c3265c05 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa @@ -130,7 +133,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-he8f35ee_3.co https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 https://conda.anaconda.org/conda-forge/linux-64/libde265-1.0.15-h00ab1b0_0.conda#407fee7a5d7ab2dca12c9ca7f62310ad https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda#8247f80f3dc464d9322e85007e307fe8 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-he02047a_3.conda#9aba7960731e6b4547b3a52f812ed801 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda#0a7f4cd238267c88e5d69f7826a407eb https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda#88928158ccfe797eac29ef5e03f7d23d @@ -150,8 +152,9 @@ https://conda.anaconda.org/conda-forge/linux-64/openlibm-0.8.1-hd590300_1.conda# https://conda.anaconda.org/conda-forge/linux-64/p7zip-16.02-h9c3ff4c_1001.tar.bz2#941066943c0cac69d5aa52189451aa5f https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda#f2cfec9406850991f4e3d960cc9e3321 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_0.conda#2b3a22991c20ed6ea2ed65d3407a91f4 https://conda.anaconda.org/conda-forge/linux-64/tktable-2.10-h8bc8fbc_6.conda#dff3627fec2c0584ded391205295abf0 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 @@ -161,68 +164,23 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.co https://conda.anaconda.org/conda-forge/linux-64/xorg-makedepend-1.0.9-h59595ed_0.conda#71c756cfcc6649ed7614eb07712bfce0 https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.3-hbcc6ac9_1.conda#62aae173382a8aae284726353c6a6a24 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h235a6dd_1.conda#c05358e3a231195f7f0b3f592078bb0c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.9-h5e77a74_0.conda#d7714013c40363f45850a25113e2cb05 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.2-h68e2383_0.conda#e7b11b508252ddc35c4b51dedef17b01 -https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda#ee3e687b78b778db7b304e5b00a4dca6 -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee -https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.2.0-hc73f493_1.conda#131a59b3bb1dbbfc63ec0f21eb0e8c65 -https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.2.0-h2c03514_1.conda#41664acd4c99ef4d192e12950ff68ca6 -https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-h3e53b52_1004.conda#c21dc684e0e8efa507aba61a030f65e7 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libamd-3.3.3-ss783_h889e182.conda#3f5acd96dfc9ff4c3b02c38120d7dc8b -https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 -https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h1909e37_2.conda#21e468ed3786ebcb2124b123aa2484b7 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a -https://conda.anaconda.org/conda-forge/linux-64/libbtf-2.3.2-ss783_h2377355.conda#c60157e1d22e52ccc5aabc7b2f61c94d -https://conda.anaconda.org/conda-forge/linux-64/libcamd-3.3.3-ss783_h2377355.conda#0178bc68cbcdb89d02b46594acace3d6 -https://conda.anaconda.org/conda-forge/linux-64/libccolamd-3.3.4-ss783_h2377355.conda#69a12c4c23969027c00a5ccca335df74 -https://conda.anaconda.org/conda-forge/linux-64/libcolamd-3.3.4-ss783_h2377355.conda#15fbaba693872fecc4f557922e41859d -https://conda.anaconda.org/conda-forge/linux-64/libcxsparse-4.4.1-ss783_h2377355.conda#1728fa3e6b6e0852e06418cba06e2596 -https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.8.4-hd24f944_1.conda#81d00656b41bc42266a999f613dd0fc9 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda#13e8e54035ddd2b91875ba399f0f7c04 -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hdb8da77_0.conda#32b23f3487beae7e81495fbc1099ae9e -https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hf539b9f_1021.conda#e8c7620cc49de0c6a2349b6dd6e39beb -https://conda.anaconda.org/conda-forge/linux-64/libldl-3.3.2-ss783_h2377355.conda#22292db3a270520d9a63ac2625931603 -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-hd5b35b9_1.conda#06def97690ef90781a91b786cb48a0a9 -https://conda.anaconda.org/conda-forge/linux-64/librbio-4.3.4-ss783_h2377355.conda#02b58b64883d9d888252c6a485e003e6 -https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 -https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hc670b87_16.conda#3d9f3a2e5d7213c34997e4464d2f938c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f -https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.3-cuda118_h09a87be_0.conda#4aeecb7576dd57f1f45e9725383f8f36 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h8d12d68_1.conda#1a21e49e190d1ffe58531a81b6e400e1 -https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h05a5f5f_3.conda#eec77634ccdb2ba6c231290c399b1dae -https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 -https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.28-pthreads_h3d04fff_1.conda#fdaa89df7b34f5c904f8f1348e5a62a5 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 -https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 -https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.14.1-hed91bc2_1.conda#909188c8979846bac8e586908cf1ca6a -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.2-h9eae976_0.conda#64a954de15d114281535a26fd4d1f294 -https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-h988505b_2.conda#9dda9667feba914e0e80b95b82f7402b -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda#279b0de5f6ba95457190a1c459a64e31 https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda#8c4061f499edec6b8ac7000f6d586829 https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda#296b403617bafa89df4971567af79013 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/linux-64/astroid-3.3.8-py312h7900ff3_0.conda#9b0b26c5846fdbe76a146e1f8715a1ac -https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.30-hec5e740_0.conda#bc1b9f70ea7fa533aefa6a8b6fbe8da7 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.5-h0009854_0.conda#d393d0a6c9b993771fbc67a998fccf6c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h235a6dd_1.conda#c05358e3a231195f7f0b3f592078bb0c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.9-h5e77a74_0.conda#d7714013c40363f45850a25113e2cb05 https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py312h7900ff3_9.conda#6df4f61b215587c40ec93810734778ca +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf -https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda#b34c2833a1f56db610aeb27f206d800d +https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.15.2-h68e2383_0.conda#e7b11b508252ddc35c4b51dedef17b01 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_2.conda#1f76b7e2b3ab88def5aa2f158322c7e6 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-pyhd8ed1ab_1.conda#840293a20343a601ca2738d359e403eb https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/config-0.5.1-pyhd8ed1ab_0.tar.bz2#97275d4898af65967b1ad57923cef770 @@ -241,15 +199,16 @@ https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda#71bf9646cbfabf3022c8da4b6b4da737 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 +https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda#ee3e687b78b778db7b304e5b00a4dca6 https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda#d692e9ba6f92dc51484bf3477e36ce7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda#ecb5d11305b8ba1801543002e69d2f2f +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda#8f5b0b297b59e1ac160ad4beec99dbee https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h66e93f0_0.conda#f98e36c96b2c66d9043187179ddb04f4 https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_1.conda#8b9328ab4aafb8fde493ab32c5eba731 -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e -https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe +https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.2.0-hc73f493_1.conda#131a59b3bb1dbbfc63ec0f21eb0e8c65 +https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.2.0-h2c03514_1.conda#41664acd4c99ef4d192e12950ff68ca6 +https://conda.anaconda.org/conda-forge/linux-64/hdfeos2-2.20-h3e53b52_1004.conda#c21dc684e0e8efa507aba61a030f65e7 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda#2aa5ff7fa34a81b9196532c84c10d865 https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda#566e75c90c1d0c8c459eb0ad9833dc7a @@ -258,32 +217,45 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/isodate-0.7.2-pyhd8ed1ab_1.conda#14c42a6334f38c412449f5a5e4043a5a https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda#7ac5f795c15f288984e32add616cdc59 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a https://conda.anaconda.org/conda-forge/noarch/legacy-cgi-2.6.1-pyh5b84bb0_3.conda#f258b7f54b5d9ddd02441f10c4dca2ac -https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.7-hadbb8c3_0.conda#4a099677417658748239616b6ca96bb6 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libamd-3.3.3-ss783_h889e182.conda#3f5acd96dfc9ff4c3b02c38120d7dc8b +https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-he8f35ee_3.conda#1091193789bb830127ed067a9e01ac57 +https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.1.1-h1909e37_2.conda#21e468ed3786ebcb2124b123aa2484b7 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a +https://conda.anaconda.org/conda-forge/linux-64/libbtf-2.3.2-ss783_h2377355.conda#c60157e1d22e52ccc5aabc7b2f61c94d +https://conda.anaconda.org/conda-forge/linux-64/libcamd-3.3.3-ss783_h2377355.conda#0178bc68cbcdb89d02b46594acace3d6 +https://conda.anaconda.org/conda-forge/linux-64/libccolamd-3.3.4-ss783_h2377355.conda#69a12c4c23969027c00a5ccca335df74 +https://conda.anaconda.org/conda-forge/linux-64/libcolamd-3.3.4-ss783_h2377355.conda#15fbaba693872fecc4f557922e41859d https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 -https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/libheif-1.19.5-gpl_hc21c24c_100.conda#3b57852666eaacc13414ac811dde3f8a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 -https://conda.anaconda.org/conda-forge/linux-64/libspex-3.2.1-ss783_h5a7e440.conda#16f6f74255e7dead91a9809386ad531c -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.5.0-hae8dbeb_0.conda#bb895ca27e7e33ab7a7c2c63529ce1e0 -https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 +https://conda.anaconda.org/conda-forge/linux-64/libcxsparse-4.4.1-ss783_h2377355.conda#1728fa3e6b6e0852e06418cba06e2596 +https://conda.anaconda.org/conda-forge/linux-64/libgit2-1.8.4-hd24f944_1.conda#81d00656b41bc42266a999f613dd0fc9 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_1.conda#37d1af619d999ee8f1f73cf5a06f4e2f +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hdb8da77_0.conda#32b23f3487beae7e81495fbc1099ae9e +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hf539b9f_1021.conda#e8c7620cc49de0c6a2349b6dd6e39beb +https://conda.anaconda.org/conda-forge/linux-64/libldl-3.3.2-ss783_h2377355.conda#22292db3a270520d9a63ac2625931603 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-hd5b35b9_1.conda#06def97690ef90781a91b786cb48a0a9 +https://conda.anaconda.org/conda-forge/linux-64/librbio-4.3.4-ss783_h2377355.conda#02b58b64883d9d888252c6a485e003e6 +https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 +https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hc670b87_16.conda#3d9f3a2e5d7213c34997e4464d2f938c +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f +https://conda.anaconda.org/conda-forge/linux-64/libxgboost-2.1.3-cuda118_h09a87be_0.conda#4aeecb7576dd57f1f45e9725383f8f36 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h8d12d68_1.conda#1a21e49e190d1ffe58531a81b6e400e1 https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda#ed6ead7e9ab9469629c6cfb363b5c6e2 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.3-py312hb3f7f12_1.conda#b99d90ef4e77acdab74828f79705a919 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_1.conda#827064ddfe0de2917fb29f1da4f8f533 +https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h05a5f5f_3.conda#eec77634ccdb2ba6c231290c399b1dae +https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda#2eeb50cab6652538eee8fc0bc3340c81 https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py312h68727a3_0.conda#5c9b020a3f86799cdc6115e55df06146 https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda#5b5e3267d915a107eca793d52e1b780a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda#29097e7ea634a45cc5386b95cac6568f https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyh29332c3_1.conda#0aa03903d33997f3886be58abc890aef https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda#fd40bf7f7f4bc4b647dc8512053d9873 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 -https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.2-h669347b_0.conda#1e6c10f7d749a490612404efeb179eb8 +https://conda.anaconda.org/conda-forge/linux-64/openblas-ilp64-0.3.28-pthreads_h3d04fff_1.conda#fdaa89df7b34f5c904f8f1348e5a62a5 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda#617f15191456cc6a13db418a275435e5 @@ -304,10 +276,10 @@ https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1. https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 -https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py312h12e396e_0.conda#bfb49da0cc9098597d527def04d66f8b https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py312h66e93f0_1.conda#532c3e5d0280be4fea52396ec1fa7d5d -https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_1.conda#ed39b4a7d7e9294cd8fa1ca05d5bd06b +https://conda.anaconda.org/conda-forge/linux-64/s2geometry-0.10.0-h8413349_4.conda#d19f88cf8812836e6a4a2a7902ed0e77 +https://conda.anaconda.org/conda-forge/noarch/semver-3.0.3-pyhd8ed1ab_0.conda#6f0d1772b767a39d70631dce48421f3d https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/linux-64/simplejson-3.19.3-py312h66e93f0_1.conda#c8d1a609d5f3358d715c2273011d9f4d @@ -316,6 +288,7 @@ https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#6 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 +https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.14.1-hed91bc2_1.conda#909188c8979846bac8e586908cf1ca6a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_1.conda#60ce69f73f3e75b21f1c27b1b471320c https://conda.anaconda.org/conda-forge/noarch/tenacity-9.0.0-pyhd8ed1ab_1.conda#a09f66fe95a54a92172e56a4a97ba271 @@ -327,31 +300,36 @@ https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_1.conda# https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda#e417822cb989e80a0d2b1b576fdd1657 https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda#019a7385be9af33791c989871317e1ed -https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2025.1.10.15-pyhd8ed1ab_0.conda#c09a1ab3bdcabb625004ab692cda1e6f +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2025.1.15.22-pyhd8ed1ab_0.conda#246846b15ba47e8684a7c88ce1de3e82 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py312h2ec8cdc_1.conda#96226f62dddc63226472b7477d783967 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda#588486a61153f94c7c13816f7069e440 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda#617f5d608ff8c28ad546e5d9671cbb95 https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-pyhd8ed1ab_2.conda#a7bafc627d25a939bb68206bd7abd483 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda#2841eb5bfc75ce15e9a0054b98dcd64d https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda#669e63af87710f8d52fdec9d4d63b404 +https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-h988505b_2.conda#9dda9667feba914e0e80b95b82f7402b https://conda.anaconda.org/conda-forge/noarch/xlsxwriter-3.2.0-pyhd8ed1ab_1.conda#c57589177253e911e293345226c7eca1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.2.1-hb9d3cd8_1.conda#f35a9a2da717ade815ffa70c0e8bdfbd -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/noarch/xyzservices-2024.9.0-pyhd8ed1ab_1.conda#c79cea50b258f652010cb6c8d81591b5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda#96d57aba173e878a2089d5638016dc5e +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda#279b0de5f6ba95457190a1c459a64e31 +https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.1.0-pyhd8ed1ab_0.conda#fdf07e281a9e5e10fc75b2dd444136e9 https://conda.anaconda.org/conda-forge/noarch/yapf-0.32.0-pyhd8ed1ab_0.tar.bz2#177cba0b4bdfacad5c5fbb0ed31504c4 https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda#3947a35e916fcc6b9825449affbf4214 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda#e52c2ef711ccf31bb7f70ca87d144b9e https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda#74ac5069774cdbc53910ec4d631a3999 https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda#1a3981115a398535dbe3f6d5faae3d36 -https://conda.anaconda.org/conda-forge/linux-64/arpack-3.9.1-nompi_hf03ea27_102.conda#e09af397232ef1070e0b6cbf4c64aacb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.5-hbaf354b_4.conda#2cefeb144de7712995d1b52cc6a3864c +https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.30-hec5e740_0.conda#bc1b9f70ea7fa533aefa6a8b6fbe8da7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.5-h0009854_0.conda#d393d0a6c9b993771fbc67a998fccf6c https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.13.0-h935415a_0.conda#debd1677c2fea41eb2233a260f48a298 https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_1.conda#d48f7e9fdec44baf6d1da416fe402b04 -https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyhd8ed1ab_3.conda#b33551d9bac06d754762e8ccb3c4df03 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda#f0b4c8e370446ef89797608d60a564b3 +https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-h9c3ff4c_0.tar.bz2#c1ac6229d0bfd14f8354ff9ad2a26cad +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda#b34c2833a1f56db610aeb27f206d800d https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.1-hf8ad068_0.conda#1b7a01fd02d11efe0eb5a676842a7b7d https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-pyhd8ed1ab_1.conda#82bea35e4dac4678ba623cf10e95e375 @@ -359,19 +337,21 @@ https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda#55c https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py312h178313f_0.conda#df113f58bdfc79c98f5e07b6bd3eb4c2 https://conda.anaconda.org/conda-forge/linux-64/curl-8.9.1-h18eb788_0.conda#2e7dedf73dfbfcee662e2a0f6175e4bb https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.1-py312h66e93f0_0.conda#6198b134b1c08173f33653896974d477 +https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhd8ed1ab_1.conda#eaef2e94d5bd76f758545d172c1fda67 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_1.conda#af53e838cab8872e7e014a8336aaaffb https://conda.anaconda.org/conda-forge/noarch/docrep-0.3.2-pyh44b312d_0.tar.bz2#235523955bc1bfb019d7ec8a2bb58f9a https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda#c56a7fa5597ad78b62e1f5d21f7f8b8f https://conda.anaconda.org/conda-forge/noarch/fire-0.7.0-pyhd8ed1ab_0.conda#c8eefdf1e822c56a6034602e67bc92a5 https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_1.conda#c43926857c0c7ba1a29c8c4a221a5e78 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py312h178313f_1.conda#bc18c46eda4c2b29431981998507e723 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda#ecb5d11305b8ba1801543002e69d2f2f +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda#40182a8d62a61d147ec7d3e4c5c36ac2 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-he02047a_3.conda#c7f243bbaea97cd6ea1edd693270100e https://conda.anaconda.org/conda-forge/linux-64/git-2.46.0-pl5321hb5640b7_0.conda#825d146359bc8b85083d92259d0a0e1b https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda#7c14f3706e099f8fcd47af2d494616cc -https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de +https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.1.0-h0b3b770_0.conda#ab1d7d56034814f4c3ed9f69f8c68806 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.1-pyha770c72_0.conda#b9f5330c0853ccabc39a9878c6f1a2ab https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 @@ -381,22 +361,27 @@ https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda#bf https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda#0a2980dada0dd7fd0998f0342308b1b1 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda#fd312693df06da3578383232528c468d https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 -https://conda.anaconda.org/conda-forge/linux-64/libcholmod-5.3.0-ss783_h3fa60b6.conda#c832eba46245682fabd96afb3f561601 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d -https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.7-hadbb8c3_0.conda#4a099677417658748239616b6ca96bb6 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/libheif-1.19.5-gpl_hc21c24c_100.conda#3b57852666eaacc13414ac811dde3f8a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 +https://conda.anaconda.org/conda-forge/linux-64/libspex-3.2.1-ss783_h5a7e440.conda#16f6f74255e7dead91a9809386ad531c +https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.5.0-hae8dbeb_0.conda#bb895ca27e7e33ab7a7c2c63529ce1e0 +https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b -https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py312he28fd5a_2.conda#3acf38086326f49afed094df4ba7c9d9 https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.0-pyhd8ed1ab_0.conda#d10024c163a52eeecbb166fdeaef8b12 https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_2.conda#cc2da171723d50bc1a7f8a53a8d0319f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda#ca2de8bbdc871bce41dbf59e51324165 https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h710cb58_1.conda#69a8838436435f59d72ddcb8dfd24a28 +https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.2-h669347b_0.conda#1e6c10f7d749a490612404efeb179eb8 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f https://conda.anaconda.org/conda-forge/noarch/plotly-5.24.1-pyhd8ed1ab_1.conda#71ac632876630091c81c50a05ec5e030 -https://conda.anaconda.org/conda-forge/linux-64/poppler-24.08.0-h47131b8_1.conda#0854b9ff0cc10a1f6f67b0f352b8e75a https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda#a36aa6e0119331d3280f4bba043314c7 https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda#d4582021af437c931d7d77ec39007845 @@ -404,8 +389,9 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#79 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/python-utils-3.9.1-pyhff2d567_1.conda#24ed1dc544b101075fa7462be5c3a5c5 https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda#746ce19f0829ec3e19c93007b1a224d3 -https://conda.anaconda.org/conda-forge/noarch/rdflib-7.1.1-pyhd8ed1ab_1.conda#2405a5561bffdef682167ca6db14683c -https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_1.conda#8c9083612c1bfe6878715ed5732605f8 +https://conda.anaconda.org/conda-forge/noarch/rdflib-7.1.3-pyhd8ed1ab_0.conda#72ec20859c97d33c82edcc8bdb70d536 +https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda +https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.1-pyhd8ed1ab_0.conda#dbb48421efd666ea133c6d5e67291766 https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.3.2-pyhd8ed1ab_1.conda#cc0f2fcfec5e6b67a20cb24f8b9f3c93 https://conda.anaconda.org/conda-forge/noarch/retrying-1.3.3-pyhd8ed1ab_3.conda#1f7482562f2082f1b2abf8a3e2a41b63 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.10-py312h66e93f0_0.conda#5260b7fb19694ee5bc4ed0ee7a2a769f @@ -413,109 +399,108 @@ https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda#9efbfdc37242619130ea42b1cc4ed861 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_1.conda#c7b1961b139c21381764de4704b6bbfb -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.28.1-pyhd8ed1ab_0.conda#680b1c287b10cefc8bda0530b217229f +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.1-pyhd8ed1ab_0.conda#de06336c9833cffd2a4bd6f27c4cf8ea https://conda.anaconda.org/conda-forge/noarch/webob-1.8.9-pyhd8ed1ab_1.conda#293718ddac83a0fbc0f2193ff77d1e1c -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hb9d3cd8_1.conda#f35bec7fface97f67f44ca952fc740b7 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxmu-1.2.1-hb9d3cd8_1.conda#f35a9a2da717ade815ffa70c0e8bdfbd +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/yamale-5.3.0-pyhd8ed1ab_0.conda#d4b5f3a50decd28cd747f4b5f7aea33f https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_1.conda#fe91647002aab05979fee9392d745f96 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h66e93f0_0.conda#91df2efaa08730416bec2a4502309275 https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.11-py312h178313f_0.conda#8219afa093757bbe07b9825eb1973ed9 -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.2-h6c0439f_6.conda#4e472c316d08af60faeb71f86d7563e1 +https://conda.anaconda.org/conda-forge/linux-64/arpack-3.9.1-nompi_hf03ea27_102.conda#e09af397232ef1070e0b6cbf4c64aacb +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.5-hbaf354b_4.conda#2cefeb144de7712995d1b52cc6a3864c https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hd126650_2.conda#36df3cf05459de5d0a41c77c4329634b https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.7.0-h10ac4d7_1.conda#ab6d507ad16dbe2157920451d662e4a1 -https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-hd8ed1ab_3.conda#e250a492fc70bf604737328dbe02846c +https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda#a30e9406c873940383555af4c873220d https://conda.anaconda.org/conda-forge/noarch/cattrs-24.1.2-pyhd8ed1ab_1.conda#53eca64665361194ca4bbaf87c0ded99 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d -https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyhecae5ae_1.conda#04151bb8e351c6209caad045e4b1f4bd -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py312hda17c39_0.conda#50052304026b6f33fdd34563ee4b47b8 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.12.1-pyhd8ed1ab_0.conda#48060c395f1e87a80330c0adaad332f7 -https://conda.anaconda.org/conda-forge/noarch/eofs-2.0.0-pyhff2d567_0.conda#a3cce45423d73c3d4420b71351e71fef +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.1.0-pyhd8ed1ab_0.conda#0abebcf57fa0d8f2f0d92f49c47d3f06 https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-pyhd8ed1ab_1.conda#4f282d2b2904441afca6367764fa718e +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/funcargparse-0.2.5-pyhd8ed1ab_0.tar.bz2#e557b70d736251fa0bbb7c4497852a92 https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-hf7fa9e8_2.conda#1d6bdc6b2c62c8cc90c67b50142d7b7f https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.44-pyhff2d567_0.conda#140a4e944f7488467872e562a2a52789 +https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2#fec079ba39c9cca093bf4c00001825de +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.2.0-h4bba637_0.conda#9e38e86167e8b1ea0094747d12944ce4 https://conda.anaconda.org/conda-forge/linux-64/hdfeos5-5.1.16-h51d0b48_17.conda#21ce981dc10b2d7ec8da29872b6fa96c -https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py312h6d9a048_4.conda#a810fadedc4edc06b4282d1222467837 -https://conda.anaconda.org/conda-forge/noarch/imageio-2.36.1-pyh12aca89_1.conda#84d5a2f075c861a8f98afd2842f7eb6e https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.1-hd8ed1ab_0.conda#d6c936d009aa63e5f82d216c95cdcaee -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda#3b519bc21bc80e60b456f1e62962a766 https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda#4ebae00eae9705b0c3d6d1018a81d047 https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hf8d3e68_2.conda#ffe68c611ae0ccfda4e7a605195e22b3 https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda#d10d9393680734a8febc4b362a4c94f2 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_0.conda#2c51703b4d775f8943c08a361788131b -https://conda.anaconda.org/conda-forge/linux-64/libklu-2.3.5-ss783_hfbdfdfc.conda#9ef3af7a987541ae75e8d3765c6f31a2 +https://conda.anaconda.org/conda-forge/linux-64/libcholmod-5.3.0-ss783_h3fa60b6.conda#c832eba46245682fabd96afb3f561601 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d +https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/libpq-17.2-h04577a9_0.conda#52dd46162c6fb2765b49e6fd06adf8d5 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h15fa968_9.conda#4957a903bd6a68cc2e53e47476f9c6f4 -https://conda.anaconda.org/conda-forge/linux-64/libspqr-4.3.4-ss783_hae1ff0d.conda#04b223bbfa980f40315c3699a0e0ad33 -https://conda.anaconda.org/conda-forge/linux-64/libumfpack-6.3.5-ss783_hd4f9ce1.conda#7196f225e50e2582ea887e12146ddb5f -https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 -https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda#e064ca33edf91ac117236c4b5dee207a -https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.14.1-py312hf9745cd_0.conda#eff78da3a99c42c0950cfd25eb996c20 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py312hfb8ada1_0.conda#d0745ae74c2b26571b692ddde112eebb -https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.0-h861ebed_0.conda#8779ee58be1c8b35e7af464a73674957 -https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d +https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.0-py312he28fd5a_2.conda#3acf38086326f49afed094df4ba7c9d9 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c +https://conda.anaconda.org/conda-forge/linux-64/poppler-24.08.0-h47131b8_1.conda#0854b9ff0cc10a1f6f67b0f352b8e75a https://conda.anaconda.org/conda-forge/noarch/progressbar2-4.5.0-pyhd8ed1ab_1.conda#e557abf678a0bf100fe7cf9d2b4f4a72 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_3.conda#556a52a96313364aa79990ed1337b9a5 https://conda.anaconda.org/conda-forge/noarch/pylint-3.3.3-pyhd8ed1ab_0.conda#5842a1fa3b9b4f9fe7069b9ca5ed068d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h9211aeb_9.conda#173afeb0d112c854fd1a9fcac4b5cce3 -https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py312hfb10629_0.conda#325cc5f0e0dc36562f3de2a4dbded572 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.5-pyhd8ed1ab_1.conda#b92ee0cf3b26087455244248b1a04e0a https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.1.1-pyhd8ed1ab_1.conda#c4b7295798eff80144dc4ca4551efa80 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_1.conda#59aad4fb37cabc0bacc73cf344612ddd https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.2.post1-pyhff2d567_1.conda#0903621fe8a9f37286596529528f4f74 -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.8.0-py312hc0a28a1_0.conda#3f62987017ad18e9e7dadce9899de9ef -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.0-py312h180e4f1_1.conda#401e9d25f6ed7d9d9a06da0dca473c3e -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.conda#5be02e05e1adaa42826cc6800ce399bc -https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda#9aa358575bbd4be126eaa5e0039f835c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.16-hb9d3cd8_0.conda#7c0a9bf62d573409d12ad14b362a96e5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxpm-3.5.17-hb9d3cd8_1.conda#f35bec7fface97f67f44ca952fc740b7 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.379-h5a9005d_9.conda#5dc18b385893b7991a3bbeb135ad7c3e +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.2-h6c0439f_6.conda#4e472c316d08af60faeb71f86d7563e1 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.12.0-hd2e3451_0.conda#61f1c193452f0daa582f39634627ea33 -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.6.2-pyhd8ed1ab_1.conda#976ff24762f1f991b08f7a7a41875086 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-h8bb6dbc_1.conda#87c13b15a9f3ec25cd3c9d8f2e33fe0b -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h8ee276e_7.conda#28a9681054948a7d7e96a7b8fe9b604e -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda#c1b0f663ff141265d1be1242259063f0 -https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_1.conda#d733874844f9808ed46a93362f89bc2d +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d +https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyhecae5ae_1.conda#04151bb8e351c6209caad045e4b1f4bd +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a +https://conda.anaconda.org/conda-forge/noarch/eofs-2.0.0-pyhff2d567_0.conda#a3cce45423d73c3d4420b71351e71fef +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.6-pyhd8ed1ab_0.conda#d751c3b4a973ed15b57be90d68c716d1 +https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py312h6d9a048_4.conda#a810fadedc4edc06b4282d1222467837 +https://conda.anaconda.org/conda-forge/noarch/imageio-2.36.1-pyh12aca89_1.conda#84d5a2f075c861a8f98afd2842f7eb6e +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda#a3cead9264b331b32fe8f0aabc967522 https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_2.conda#bb0230917e2473c77d615104dbe8a49d https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.9.2-h353785f_1.conda#c363d0b330b4b21b4c1b10e0981d3a99 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda#9e7960f0b9ab3895ef73d92477c47dae -https://conda.anaconda.org/conda-forge/linux-64/libparu-1.0.0-ss783_h8814b27.conda#707eb61a0c3b223702ac326c04546b50 -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-h49af25d_2.conda#b9846db0abffb09847e2cb0fec4b4db6 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda#c27a17a8c54c0d35cf83bbc0de8f7f77 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_0.conda#2c51703b4d775f8943c08a361788131b +https://conda.anaconda.org/conda-forge/linux-64/libklu-2.3.5-ss783_hfbdfdfc.conda#9ef3af7a987541ae75e8d3765c6f31a2 +https://conda.anaconda.org/conda-forge/linux-64/libspqr-4.3.4-ss783_hae1ff0d.conda#04b223bbfa980f40315c3699a0e0ad33 +https://conda.anaconda.org/conda-forge/linux-64/libumfpack-6.3.5-ss783_hd4f9ce1.conda#7196f225e50e2582ea887e12146ddb5f +https://conda.anaconda.org/conda-forge/noarch/magics-python-1.5.8-pyhd8ed1ab_1.conda#3fd7e3db129f12362642108f23fde521 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h22f9119_108.conda#0967d692b1dd33e7d809cfa355090e4b -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h21d6d8e_101.conda#0cabc6745882859ec7be35433c7b8f24 +https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda#e064ca33edf91ac117236c4b5dee207a +https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.15.0-py312hf9745cd_0.conda#639af8e91d06907903b8686cc7d6a509 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py312hfb8ada1_0.conda#d0745ae74c2b26571b692ddde112eebb +https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.0-h861ebed_0.conda#8779ee58be1c8b35e7af464a73674957 +https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda#ee23fabfd0a8c6b8d6f3729b47b2859d https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d https://conda.anaconda.org/conda-forge/linux-64/postgresql-17.2-h1122569_0.conda#848402b976b31bfecb3e476ea85cb285 https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.8.2-pyhd8ed1ab_1.conda#7bfe485a0e86e9e4b7111357765c73dc -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.3.0-pyhd8ed1ab_0.conda#269109707b3810adce78b6afb2a82c80 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-25.0.0-pyhd8ed1ab_0.conda#195fbabc5cc805f2cc10cb881a19cf8b +https://conda.anaconda.org/conda-forge/linux-64/pys2index-0.1.5-py312hfb10629_0.conda#325cc5f0e0dc36562f3de2a4dbded572 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_1.conda#010e50e74c467db278f1398a74106a04 https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py312hc0a28a1_3.conda#81bbcb20ea4a53b05a8cf51f31496038 -https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h32f4cee_16.conda#feee98a221344be7a447b80b410df867 -https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py312h7a48858_0.conda#102727f71df02a51e9e173f2e6f87d57 -https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_1.conda#3917cd49c30278aad07536ee77084eb0 -https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.4-pyh267e887_1.conda#40d80cd9fa4cc759c6dba19ea96642db -https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda#97dc960f3d9911964d73c2cf240baea5 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.8.0-py312hc0a28a1_0.conda#3f62987017ad18e9e7dadce9899de9ef +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py312h180e4f1_0.conda#355bcf0f629159c9bd10a406cd8b6c3a +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.conda#5be02e05e1adaa42826cc6800ce399bc +https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda#9aa358575bbd4be126eaa5e0039f835c https://conda.anaconda.org/conda-forge/linux-64/tempest-remap-2.2.0-heeae502_5.conda#2977d5268a6050196c42f03fd2a70020 -https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.12.12-pyhd8ed1ab_0.conda#59d646aa704b6024cb965be43493ed45 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/noarch/xarray-2025.1.1-pyhd8ed1ab_0.conda#81db80ba986122da460800a67bf8ac7f -https://conda.anaconda.org/conda-forge/noarch/zarr-3.0.0-pyhd8ed1ab_0.conda#5b82afdd503bec6825b274e7d6f425eb +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxaw-1.0.16-hb9d3cd8_0.conda#7c0a9bf62d573409d12ad14b362a96e5 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.379-h5a9005d_9.conda#5dc18b385893b7991a3bbeb135ad7c3e https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.11.0-h325d260_1.conda#11d926d1f4a75a1b03d1c053ca20424b -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.10.0-pyhd8ed1ab_2.conda#ed15dcf944706ae6ea54968dfa4a06a5 -https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_1.conda#dd71e4ec2fbffe38c0359976505f816e -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.12.1-pyhd8ed1ab_0.conda#58df114d7649ddb3f68c9b9adc6fbabe +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.6.2-pyhd8ed1ab_1.conda#976ff24762f1f991b08f7a7a41875086 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 +https://conda.anaconda.org/conda-forge/noarch/distributed-2025.1.0-pyhd8ed1ab_0.conda#5ec97e707606eaa891eedb406eba507b +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-h8bb6dbc_1.conda#87c13b15a9f3ec25cd3c9d8f2e33fe0b https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h9e768e6_3.conda#c330e87e698bae8e7381c0315cf25dd0 https://conda.anaconda.org/conda-forge/linux-64/gdal-3.9.2-py312h1299960_7.conda#9cf27e3f9d97ea13f250db9253a25dc8 -https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda#953e31ea00d46beb7e64a79fc291ec44 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h8ee276e_7.conda#28a9681054948a7d7e96a7b8fe9b604e +https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_1.conda#d733874844f9808ed46a93362f89bc2d https://conda.anaconda.org/conda-forge/linux-64/libgdal-fits-3.9.2-h2db6552_7.conda#524e64f1aa0ebc87230109e684f392f4 https://conda.anaconda.org/conda-forge/linux-64/libgdal-grib-3.9.2-hc3b29a1_7.conda#56a7436a66a1a4636001ce4b621a3a33 https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf4-3.9.2-hd5ecb85_7.conda#9c8431dc0b83d5fe9c12a2c0b6861a72 @@ -525,16 +510,46 @@ https://conda.anaconda.org/conda-forge/linux-64/libgdal-pdf-3.9.2-h600f43f_7.con https://conda.anaconda.org/conda-forge/linux-64/libgdal-pg-3.9.2-h5e77dd0_7.conda#e86b26f53ae868565e95fde5b10753d3 https://conda.anaconda.org/conda-forge/linux-64/libgdal-postgisraster-3.9.2-h5e77dd0_7.conda#3392965ffc4e8b7c66a532750ce0e91f https://conda.anaconda.org/conda-forge/linux-64/libgdal-xls-3.9.2-h03c987c_7.conda#165f12373452e8d17889e9c877431acf -https://conda.anaconda.org/conda-forge/linux-64/magics-4.15.4-h24e9adf_1.conda#9731bb0d2a3917cab718fd7c90dea857 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda#9e7960f0b9ab3895ef73d92477c47dae +https://conda.anaconda.org/conda-forge/linux-64/libparu-1.0.0-ss783_h8814b27.conda#707eb61a0c3b223702ac326c04546b50 +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-h49af25d_2.conda#b9846db0abffb09847e2cb0fec4b4db6 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda#c27a17a8c54c0d35cf83bbc0de8f7f77 https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_1.conda#1efb1227abaf20324ceb7ac9c06bb86d https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda#bbe1963f1e47f594070ffe87cdf612ea -https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_1.conda#9a2be7d0089f5934b550933ca0d9fe85 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 -https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py312h7900ff3_1.conda#f110e71421e5c86e50232cc027c6d85c -https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.3-cuda118_pyh0cc23a4_0.conda#44e85f4f035efbdb185400a3c35d11c8 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h21d6d8e_101.conda#0cabc6745882859ec7be35433c7b8f24 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.6.1-pyhd8ed1ab_1.conda#8f854db1ce53e64891f718db849adbb0 https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b +https://conda.anaconda.org/conda-forge/linux-64/r-base-4.2.3-h32f4cee_16.conda#feee98a221344be7a447b80b410df867 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py312h7a48858_0.conda#102727f71df02a51e9e173f2e6f87d57 +https://conda.anaconda.org/conda-forge/noarch/seawater-3.3.5-pyhd8ed1ab_1.conda#3917cd49c30278aad07536ee77084eb0 +https://conda.anaconda.org/conda-forge/noarch/sparse-0.15.5-pyh72ffeb9_0.conda#e640762c293807bbd75c003e18d8ff0c +https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda#97dc960f3d9911964d73c2cf240baea5 +https://conda.anaconda.org/conda-forge/noarch/tifffile-2024.12.12-pyhd8ed1ab_0.conda#59d646aa704b6024cb965be43493ed45 +https://conda.anaconda.org/conda-forge/noarch/xarray-2025.1.1-pyhd8ed1ab_0.conda#81db80ba986122da460800a67bf8ac7f +https://conda.anaconda.org/conda-forge/noarch/zarr-3.0.1-pyhd8ed1ab_0.conda#66820cb25ad3c48f9ee46a48289b3454 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.10.0-pyhd8ed1ab_2.conda#ed15dcf944706ae6ea54968dfa4a06a5 +https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyhd8ed1ab_1.conda#a8dc13f40343dd9706cab9b9cbc49099 +https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_1.conda#dd71e4ec2fbffe38c0359976505f816e +https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda#a201de7d36907f2355426e019168d337 +https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 +https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda#953e31ea00d46beb7e64a79fc291ec44 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h8d2e343_13_cpu.conda#dc379f362829d5df5ce6722565110029 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-kea-3.9.2-h1df15e4_7.conda#c693e703649051ee9db0fabd4fcd0483 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.9.2-hf2d2f32_7.conda#4015ef020928219acc0b5c9edbce8d30 +https://conda.anaconda.org/conda-forge/linux-64/magics-4.15.4-h24e9adf_1.conda#9731bb0d2a3917cab718fd7c90dea857 +https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.3-pyhd8ed1ab_1.conda#b7ad70c100bced5b6bc2d479c473d2a7 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c +https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_1.conda#9a2be7d0089f5934b550933ca0d9fe85 +https://conda.anaconda.org/conda-forge/linux-64/nco-5.3.1-hf7c1f58_0.conda#3f7887fed8b12d3e29dd15eb82cbc5b0 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda#b3e783e8e8ed7577cf0b6dee37d1fbac +https://conda.anaconda.org/conda-forge/noarch/prospector-1.13.3-pyhd8ed1ab_1.conda#0d6d32575a276ff0a1e612220d435b4a +https://conda.anaconda.org/conda-forge/linux-64/psyplot-1.5.1-py312h7900ff3_1.conda#f110e71421e5c86e50232cc027c6d85c +https://conda.anaconda.org/conda-forge/noarch/py-xgboost-2.1.3-cuda118_pyh0cc23a4_0.conda#44e85f4f035efbdb185400a3c35d11c8 +https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r42hc72bb7e_1005.conda#f2744985b083b1bbffd4df19437cf1e8 https://conda.anaconda.org/conda-forge/linux-64/r-backports-1.5.0-r42hb1dbf0f_0.conda#d879e1fbd80113312364a5db3682c789 @@ -592,32 +607,28 @@ https://conda.anaconda.org/conda-forge/noarch/r-withr-3.0.0-r42hc72bb7e_0.conda# https://conda.anaconda.org/conda-forge/linux-64/r-xfun-0.45-r42ha18555a_0.conda#9e13c392bfcee4a261e4b513d6d862e7 https://conda.anaconda.org/conda-forge/noarch/r-xmlparsedata-1.0.5-r42hc72bb7e_2.conda#2f3614450b54f222c1eff786ec2a45ec https://conda.anaconda.org/conda-forge/linux-64/r-yaml-2.3.8-r42h57805ef_0.conda#97f60a93ca12f4fdd5f44049dcee4345 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_1.conda#584e6aab3a5cffde537c575ad6a673ff https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.0-py312hf9745cd_1.conda#7494c06b01edc857a4f7910946c408ab https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda#fd96da444e81f9e6fcaac38590f3dd42 https://conda.anaconda.org/conda-forge/linux-64/suitesparse-7.8.3-ss783_h36e971b.conda#64c7f927c297e2e3b94c4330e3d9db18 https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.26.0-h86fa3b2_0.conda#061175d9d4c046a1cf8bffe95a359fab https://conda.anaconda.org/conda-forge/linux-64/cdo-2.4.1-h9fe33b1_1.conda#a326dab3d2a1a8e32c2a6f792fac3161 https://conda.anaconda.org/conda-forge/noarch/cfgrib-0.9.15.0-pyhd8ed1ab_0.conda#211303621409d703235598be8c378b3c -https://conda.anaconda.org/conda-forge/noarch/chart-studio-1.1.0-pyhd8ed1ab_1.conda#a8dc13f40343dd9706cab9b9cbc49099 -https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.9.0-pyhd8ed1ab_0.conda#a201de7d36907f2355426e019168d337 -https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 +https://conda.anaconda.org/conda-forge/noarch/datapi-0.1.2-pyhd8ed1ab_0.conda#9f2f0d8106777cdcd4f2eac665065091 +https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhd8ed1ab_5.conda#6779887899e0b0b6fb316253eb0f5c64 https://conda.anaconda.org/conda-forge/linux-64/imagemagick-7.1.1_43-imagemagick_hf2058d9_2.conda#d656f8b4405fb5f1821f3ebba98e5e10 https://conda.anaconda.org/conda-forge/noarch/iris-3.11.0-pyha770c72_0.conda#a5e36260789ce92074c3736533ecdd61 https://conda.anaconda.org/conda-forge/linux-64/julia-1.10.4-hf18f99d_1.conda#cc0ef9c191bab16211970a29b6787d69 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-17.0.0-h8d2e343_13_cpu.conda#dc379f362829d5df5ce6722565110029 -https://conda.anaconda.org/conda-forge/linux-64/libgdal-kea-3.9.2-h1df15e4_7.conda#c693e703649051ee9db0fabd4fcd0483 -https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.9.2-hf2d2f32_7.conda#4015ef020928219acc0b5c9edbce8d30 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-h5888daf_13_cpu.conda#b654d072b8d5da807495e49b28a0b884 https://conda.anaconda.org/conda-forge/linux-64/libgdal-tiledb-3.9.2-h4a3bace_2.conda#c3fac34ecba2fcf9d5d31a03b975d5a1 +https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h39682fd_13_cpu.conda#49c60a8dc089d8127b9368e9eb6c1a77 https://conda.anaconda.org/conda-forge/noarch/lime-0.2.0.1-pyhd8ed1ab_2.conda#7807e1b976aaab2b457002abffdf5e1c -https://conda.anaconda.org/conda-forge/noarch/multiurl-0.3.3-pyhd8ed1ab_1.conda#b7ad70c100bced5b6bc2d479c473d2a7 -https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda#6bb0d77277061742744176ab555b723c -https://conda.anaconda.org/conda-forge/linux-64/nco-5.3.0-hf7c1f58_0.conda#1bc175c5bab6f9c78326ac162859b897 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda#b3e783e8e8ed7577cf0b6dee37d1fbac -https://conda.anaconda.org/conda-forge/noarch/prospector-1.13.3-pyhd8ed1ab_1.conda#0d6d32575a276ff0a1e612220d435b4a +https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.5-pyhd8ed1ab_1.conda#dd50a122c5b9782b1e9b2695473bfd95 https://conda.anaconda.org/conda-forge/linux-64/psy-simple-1.5.1-py312h7900ff3_0.conda#683ec8787a523de54b02c885e2c2aefa -https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.3-py312h7900ff3_0.conda#16e30aaadf0c1f957d4d42553c9403ac -https://conda.anaconda.org/conda-forge/noarch/pyroma-4.2-pyhd8ed1ab_0.conda#fe2aca9a5d4cb08105aefc451ef96950 +https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.9.0-pyhd8ed1ab_1.conda#53912b9ade4f2ea4dd1d5d6d3de7df70 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h01725c0_2_cpu.conda#add603bfa43d9bf3f06783f780e1a817 +https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.4-py312h7900ff3_0.conda#331fc9a56a16f02592f193c8109e4543 https://conda.anaconda.org/conda-forge/linux-64/r-bigmemory-4.6.4-r42ha503ecb_0.conda#12b6fa8fe80a6494a948c6ea2f34340d https://conda.anaconda.org/conda-forge/linux-64/r-checkmate-2.3.1-r42h57805ef_0.conda#9febce7369c72d991e2399d7d28f3390 https://conda.anaconda.org/conda-forge/linux-64/r-climdex.pcic-1.1_11-r42ha503ecb_2.conda#cff1d95fe315f109a1f01a7ef112fdd6 @@ -642,21 +653,16 @@ https://conda.anaconda.org/conda-forge/linux-64/r-spam-2.10_0-r42h9f9f741_0.cond https://conda.anaconda.org/conda-forge/linux-64/r-timechange-0.3.0-r42ha503ecb_0.conda#3d62906e9c1fecf61370a3ad6e808e5e https://conda.anaconda.org/conda-forge/linux-64/r-xml2-1.3.6-r42hbfba7a4_1.conda#5c3d7a89a2d5e1c0885f92d1aa6fde30 https://conda.anaconda.org/conda-forge/linux-64/r-zoo-1.8_12-r42h57805ef_1.conda#5367d265c0c9c151dea85f1ccb515ec1 -https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_1.conda#584e6aab3a5cffde537c575ad6a673ff https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda#62afb877ca2c2b4b6f9ecb37320085b6 +https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c https://conda.anaconda.org/conda-forge/noarch/xgboost-2.1.3-cuda118_pyh256f914_0.conda#cfb6634184cb3d62af351ce8e5be72c3 -https://conda.anaconda.org/conda-forge/noarch/datapi-0.1.2-pyhd8ed1ab_0.conda#9f2f0d8106777cdcd4f2eac665065091 -https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhd8ed1ab_5.conda#6779887899e0b0b6fb316253eb0f5c64 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-17.0.0-h5888daf_13_cpu.conda#b654d072b8d5da807495e49b28a0b884 +https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.5-pyhd8ed1ab_1.conda#b53d59d2abbc0b383d8a1bc0f06ed2d6 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-h5888daf_13_cpu.conda#cd2c36e8865b158b82f61c6aac28b7e1 https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.9.2-ha770c72_7.conda#63779711c7afd4fcf9cea67538baa67a -https://conda.anaconda.org/conda-forge/linux-64/libparquet-17.0.0-h39682fd_13_cpu.conda#49c60a8dc089d8127b9368e9eb6c1a77 -https://conda.anaconda.org/conda-forge/noarch/mapgenerator-1.0.7-pyhd8ed1ab_0.conda#d18db96ef2a920b0ecefe30282b0aecf -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.5-pyhd8ed1ab_1.conda#dd50a122c5b9782b1e9b2695473bfd95 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.5-hd8ed1ab_1.conda#593a8fd80968f14f8a7b3a685ddc455e https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/linux-64/psy-maps-1.5.0-py312h7900ff3_1.conda#080bc8f34a9cb0ab81ae0369fd43b7ab https://conda.anaconda.org/conda-forge/linux-64/psy-reg-1.5.0-py312h7900ff3_1.conda#ea719cfcc2e5b815b137b7082ece8aeb -https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.9.0-pyhd8ed1ab_1.conda#53912b9ade4f2ea4dd1d5d6d3de7df70 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-17.0.0-py312h01725c0_2_cpu.conda#add603bfa43d9bf3f06783f780e1a817 https://conda.anaconda.org/conda-forge/noarch/python-cdo-1.6.0-pyhff2d567_1.conda#61f71e3d4df9dbe55340c129f96cb8ee https://conda.anaconda.org/conda-forge/linux-64/r-akima-0.6_3.4-r42h61816a4_2.conda#8536251313f441c4d70ff11ad976d294 https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.6-r42hc72bb7e_0.conda#4fb1765d6dc531936db81af3f6be316a @@ -673,11 +679,9 @@ https://conda.anaconda.org/conda-forge/noarch/r-scales-1.3.0-r42hc72bb7e_0.conda https://conda.anaconda.org/conda-forge/linux-64/r-specsverification-0.5_3-r42h7525677_2.tar.bz2#1521b8a303852af0496245e368d3c61c https://conda.anaconda.org/conda-forge/linux-64/r-splancs-2.01_45-r42hbcb9c34_0.conda#bcd96dc088f54514a54d57e6b8ed51b6 https://conda.anaconda.org/conda-forge/linux-64/r-vctrs-0.6.5-r42ha503ecb_0.conda#5689030c60302fb5bb7a48b54c11dbe8 -https://conda.anaconda.org/conda-forge/noarch/xesmf-0.8.7-pyhd8ed1ab_0.conda#42301f78a4c6d2500f891b9723160d5c -https://conda.anaconda.org/conda-forge/noarch/cdsapi-0.7.5-pyhd8ed1ab_1.conda#b53d59d2abbc0b383d8a1bc0f06ed2d6 https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py312h5aa26c2_1.conda#4a30f4277a1894928a7057d0e14c1c95 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-17.0.0-h5888daf_13_cpu.conda#cd2c36e8865b158b82f61c6aac28b7e1 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.5-hd8ed1ab_1.conda#593a8fd80968f14f8a7b3a685ddc455e +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-17.0.0-hf54134d_13_cpu.conda#46f41533959eee8826c09e55976b8c06 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.5-hd8ed1ab_1.conda#82ffc2974cd09b45182f018b5af731c8 https://conda.anaconda.org/conda-forge/linux-64/ncl-6.6.2-h7cb714c_54.conda#7363202c15302898deb49e82ca3e5f58 https://conda.anaconda.org/conda-forge/noarch/r-cyclocomp-1.1.1-r42hc72bb7e_0.conda#6bd41a85dc43541400311eca03d4e2d4 https://conda.anaconda.org/conda-forge/noarch/r-gridextra-2.3-r42hc72bb7e_1005.conda#da116b29105a8d48571975a185e9bb94 @@ -687,24 +691,21 @@ https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.9.0-r42hc72bb7e_1.conda https://conda.anaconda.org/conda-forge/linux-64/r-purrr-1.0.2-r42h57805ef_0.conda#7985dada48799b7814ca069794d0b1a3 https://conda.anaconda.org/conda-forge/noarch/r-r.cache-0.16.0-r42hc72bb7e_2.conda#34daac4e8faee056f15abdee858fc721 https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.11-py312hd177ed6_1.conda#246c5f31c607ecfe1ece1e8cc6ecc9c5 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-17.0.0-hf54134d_13_cpu.conda#46f41533959eee8826c09e55976b8c06 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.5-hd8ed1ab_1.conda#82ffc2974cd09b45182f018b5af731c8 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_2.conda#5f7d505626cb057e1320bbd46dd02ef2 https://conda.anaconda.org/conda-forge/noarch/r-climprojdiags-0.3.3-r42hc72bb7e_0.conda#f34d40a3f0f9160fdd2bccaae8e185d1 https://conda.anaconda.org/conda-forge/noarch/r-lintr-3.1.2-r42hc72bb7e_0.conda#ef49cc606b94a9d5f30b9c48f5f68848 https://conda.anaconda.org/conda-forge/linux-64/r-tibble-3.2.1-r42h57805ef_2.conda#b1278a5148c9e52679bb72112770cdc3 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-17.0.0-py312h9cebb41_2.conda#5f7d505626cb057e1320bbd46dd02ef2 +https://conda.anaconda.org/conda-forge/noarch/dask-2025.1.0-pyhd8ed1ab_0.conda#a5f91379331b61157c203ca69da6331b https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-3.5.1-r42hc72bb7e_0.conda#77cc0254e0dc92e5e7791ce20a170f74 https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r42hc72bb7e_3.conda#5ccfee6f3b94e6b247c7e1929b24f1cc -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.21-pyhd8ed1ab_0.conda#e72a014dbbd35545dcfba4de9c92fb1d +https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_1.conda#86286b197e33e3b034416c18ba0f574c https://conda.anaconda.org/conda-forge/noarch/r-styler-1.10.3-r42hc72bb7e_0.conda#1b2b8fa85a9d0556773abac4763d8ef9 https://conda.anaconda.org/conda-forge/linux-64/r-tlmoments-0.7.5.3-r42ha503ecb_1.conda#6aa1414e06dfffc39d3b5ca78b60b377 https://conda.anaconda.org/conda-forge/noarch/r-viridis-0.6.5-r42hc72bb7e_0.conda#959f69b6dfd4b620a15489975fa27670 -https://conda.anaconda.org/conda-forge/noarch/dask-2024.12.1-pyhd8ed1ab_0.conda#f3134df9565c4d4415ff0e61f3aa28d0 +https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.11.1-pyhd8ed1ab_0.conda#54cad67b1fb303d452019c45e4fea1bc https://conda.anaconda.org/conda-forge/linux-64/r-fields-15.2-r42h61816a4_0.conda#d84fe2f9e893e92089370b195e2263a0 https://conda.anaconda.org/conda-forge/noarch/r-spei-1.8.1-r42hc72bb7e_1.conda#7fe060235dac0fc0b3d387f98e79d128 -https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.11.0-pyhd8ed1ab_1.conda#86286b197e33e3b034416c18ba0f574c https://conda.anaconda.org/conda-forge/linux-64/r-geomap-2.5_0-r42h57805ef_2.conda#020534c6abdee4f1253c221e926a5341 -https://conda.anaconda.org/conda-forge/noarch/esmvalcore-2.11.1-pyhd8ed1ab_0.conda#54cad67b1fb303d452019c45e4fea1bc https://conda.anaconda.org/conda-forge/noarch/r-s2dverification-2.10.3-r42hc72bb7e_2.conda#8079a86a913155fe2589ec0b76dc9f5e https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.14-pyhd8ed1ab_0.conda#351a11ac1215eb4f6c5b82e30070277a https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.6-pyhd8ed1ab_0.conda#2e4c30e09d50d025836279d80140d0a4 From 5a3d3e7fea5a47c4463764f5851da319edb72c48 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Wed, 22 Jan 2025 17:36:10 +0100 Subject: [PATCH 84/87] Add an option to disable using the distributed scheduler from the diagnostic script (#3787) --- esmvaltool/diag_scripts/shared/_base.py | 25 ++++++++------ .../recipes/recipe_eady_growth_rate.yml | 3 ++ tests/unit/diag_scripts/shared/test_base.py | 34 +++++++++++++++++++ 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/esmvaltool/diag_scripts/shared/_base.py b/esmvaltool/diag_scripts/shared/_base.py index 1789909130..cbc826ae2e 100644 --- a/esmvaltool/diag_scripts/shared/_base.py +++ b/esmvaltool/diag_scripts/shared/_base.py @@ -181,7 +181,7 @@ def __init__(self, cfg): if not os.path.exists(self._log_file): self.table = {} else: - with open(self._log_file, 'r') as file: + with open(self._log_file, 'r', encoding='utf-8') as file: self.table = yaml.safe_load(file) def log(self, filename, record): @@ -212,8 +212,8 @@ def log(self, filename, record): if isinstance(filename, Path): filename = str(filename) if filename in self.table: - raise KeyError( - "Provenance record for {} already exists.".format(filename)) + msg = f"Provenance record for {filename} already exists." + raise KeyError(msg) self.table[filename] = record @@ -222,7 +222,7 @@ def _save(self): dirname = os.path.dirname(self._log_file) if not os.path.exists(dirname): os.makedirs(dirname) - with open(self._log_file, 'w') as file: + with open(self._log_file, 'w', encoding='utf-8') as file: yaml.safe_dump(self.table, file) def __enter__(self): @@ -253,9 +253,8 @@ def select_metadata(metadata, **attributes): """ selection = [] for attribs in metadata: - if all(a in attribs and ( - attribs[a] == attributes[a] or attributes[a] == '*') - for a in attributes): + if all(a in attribs and v in (attribs[a], '*') + for a, v in attributes.items()): selection.append(attribs) return selection @@ -424,7 +423,7 @@ def get_cfg(filename=None): """Read diagnostic script configuration from settings.yml.""" if filename is None: filename = sys.argv[1] - with open(filename) as file: + with open(filename, encoding='utf-8') as file: cfg = yaml.safe_load(file) return cfg @@ -441,7 +440,7 @@ def _get_input_data_files(cfg): input_files = {} for filename in metadata_files: - with open(filename) as file: + with open(filename, encoding='utf-8') as file: metadata = yaml.safe_load(file) input_files.update(metadata) @@ -469,6 +468,10 @@ def main(cfg): with run_diagnostic() as cfg: main(cfg) + To prevent the diagnostic script from using the Dask Distributed scheduler, + set ``no_distributed: true`` in the diagnostic script definition in the + recipe or in the resulting settings.yml file. + The `cfg` dict passed to `main` contains the script configuration that can be used with the other functions in this module. """ @@ -568,7 +571,9 @@ def main(cfg): logger.info("Removing %s from previous run.", provenance_file) os.remove(provenance_file) - if not args.no_distributed and 'scheduler_address' in cfg: + use_distributed = not (args.no_distributed + or cfg.get('no_distributed', False)) + if use_distributed and 'scheduler_address' in cfg: try: client = distributed.Client(cfg['scheduler_address']) except OSError as exc: diff --git a/esmvaltool/recipes/recipe_eady_growth_rate.yml b/esmvaltool/recipes/recipe_eady_growth_rate.yml index b0eea7f708..d05020d06d 100644 --- a/esmvaltool/recipes/recipe_eady_growth_rate.yml +++ b/esmvaltool/recipes/recipe_eady_growth_rate.yml @@ -49,6 +49,7 @@ diagnostics: scripts: annual_eady_growth_rate: script: primavera/eady_growth_rate/eady_growth_rate.py + no_distributed: true time_statistic: 'annual_mean' @@ -63,6 +64,7 @@ diagnostics: scripts: summer_eady_growth_rate: script: primavera/eady_growth_rate/eady_growth_rate.py + no_distributed: true time_statistic: 'seasonal_mean' winter_egr: @@ -76,5 +78,6 @@ diagnostics: scripts: winter_eady_growth_rate: script: primavera/eady_growth_rate/eady_growth_rate.py + no_distributed: true time_statistic: 'seasonal_mean' plot_levels: [70000] diff --git a/tests/unit/diag_scripts/shared/test_base.py b/tests/unit/diag_scripts/shared/test_base.py index ac03435a8c..d59dff9379 100644 --- a/tests/unit/diag_scripts/shared/test_base.py +++ b/tests/unit/diag_scripts/shared/test_base.py @@ -367,6 +367,40 @@ def test_run_diagnostic(tmp_path, monkeypatch): assert 'example_setting' in cfg +@pytest.mark.parametrize("no_distributed", [False, True]) +def test_run_diagnostic_configures_dask( + tmp_path, + monkeypatch, + mocker, + no_distributed, +): + + settings = create_settings(tmp_path) + scheduler_address = "tcp://127.0.0.1:38789" + settings["scheduler_address"] = scheduler_address + if no_distributed: + settings["no_distributed"] = True + settings_file = write_settings(settings) + + monkeypatch.setattr(sys, 'argv', ['', settings_file]) + + # Create files created by ESMValCore + for filename in ('log.txt', 'profile.bin', 'resource_usage.txt'): + file = Path(settings['run_dir']) / filename + file.touch() + + mocker.patch.object(shared._base.distributed, "Client") + + with shared.run_diagnostic() as cfg: + assert 'example_setting' in cfg + + if no_distributed: + shared._base.distributed.Client.assert_not_called() + else: + shared._base.distributed.Client.assert_called_once_with( + scheduler_address) + + @pytest.mark.parametrize('flag', ['-l', '--log-level']) def test_run_diagnostic_log_level(tmp_path, monkeypatch, flag): """Test if setting the log level from the command line works.""" From 425e23396824d7d0c03bfa09d0e278a42757d776 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 22 Jan 2025 17:48:49 +0100 Subject: [PATCH 85/87] Added Python portrait plot diagnostic (#3551) Co-authored-by: Diego Cammarano Co-authored-by: Bettina Gier Co-authored-by: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Co-authored-by: Bouwe Andela Co-authored-by: Manuel Schlund --- .../esmvaltool.diag_scripts.portrait_plot.rst | 11 + doc/sphinx/source/api/esmvaltool.rst | 1 + .../figures/portrait/portrait_plot.png | Bin 0 -> 228922 bytes doc/sphinx/source/recipes/index.rst | 1 + .../source/recipes/recipe_perfmetrics.rst | 93 +++- doc/sphinx/source/recipes/recipe_portrait.rst | 95 ++++ esmvaltool/config-references.yml | 8 +- esmvaltool/diag_scripts/portrait_plot.py | 519 ++++++++++++++++++ esmvaltool/recipes/recipe_portrait_CMIP.yml | 213 +++++++ .../testing/recipe_portrait_CMIP_fast.yml | 160 ++++++ 10 files changed, 1079 insertions(+), 22 deletions(-) create mode 100644 doc/sphinx/source/api/esmvaltool.diag_scripts.portrait_plot.rst create mode 100644 doc/sphinx/source/recipes/figures/portrait/portrait_plot.png create mode 100644 doc/sphinx/source/recipes/recipe_portrait.rst create mode 100644 esmvaltool/diag_scripts/portrait_plot.py create mode 100644 esmvaltool/recipes/recipe_portrait_CMIP.yml create mode 100644 esmvaltool/recipes/testing/recipe_portrait_CMIP_fast.yml diff --git a/doc/sphinx/source/api/esmvaltool.diag_scripts.portrait_plot.rst b/doc/sphinx/source/api/esmvaltool.diag_scripts.portrait_plot.rst new file mode 100644 index 0000000000..68e18613db --- /dev/null +++ b/doc/sphinx/source/api/esmvaltool.diag_scripts.portrait_plot.rst @@ -0,0 +1,11 @@ + +.. _api.esmvaltool.diag_scripts.portrait_plot: + +Portrait Plot +============= + + +.. automodule:: esmvaltool.diag_scripts.portrait_plot + :no-members: + :no-inherited-members: + :no-show-inheritance: diff --git a/doc/sphinx/source/api/esmvaltool.rst b/doc/sphinx/source/api/esmvaltool.rst index b080b81ac8..6eda5f5912 100644 --- a/doc/sphinx/source/api/esmvaltool.rst +++ b/doc/sphinx/source/api/esmvaltool.rst @@ -29,3 +29,4 @@ Diagnostic Scripts esmvaltool.diag_scripts.ocean esmvaltool.diag_scripts.psyplot_diag esmvaltool.diag_scripts.seaborn_diag + esmvaltool.diag_scripts.portrait_plot diff --git a/doc/sphinx/source/recipes/figures/portrait/portrait_plot.png b/doc/sphinx/source/recipes/figures/portrait/portrait_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..a6020c2d3736efb6bca7d25dc81ef69a9a4f90bf GIT binary patch literal 228922 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 biSjf+q>>pyBIRRIAsG_C>9(k|; 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 z�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 L_)pSai!1*F%rN`_) and in +different regions. As an additional reference, we consider +`Righi et al. (2015) `_. -The recipe can be used to calculate performance metrics at different vertical levels (e.g., 5, 30, 200, 850 hPa as in `Gleckler et al. (2008) `_ and in different regions. As an additional reference, we consider `Righi et al. (2015) `_. Available recipes and diagnostics ----------------------------------- @@ -21,12 +36,19 @@ Recipes are stored in recipes/ Diagnostics are stored in diag_scripts/perfmetrics/ -* main.ncl: calculates and (optionally) plots annual/seasonal cycles, zonal means, lat-lon fields and time-lat-lon fields. The calculated fields can also be plotted as difference w.r.t. a given reference dataset. main.ncl also calculates RMSD, bias and taylor metrics. Input data have to be regridded to a common grid in the preprocessor. Each plot type is created by a separated routine, as detailed below. +* main.ncl: calculates and (optionally) plots annual/seasonal cycles, zonal + means, lat-lon fields and time-lat-lon fields. The calculated fields can also + be plotted as difference w.r.t. a given reference dataset. main.ncl also + calculates RMSD, bias and taylor metrics. Input data have to be regridded to + a common grid in the preprocessor. Each plot type is created by a separated + routine, as detailed below. * cycle.ncl: creates an annual/seasonal cycle plot. * zonal.ncl: creates a zonal (lat-pressure) plot. * latlon.ncl: creates a lat-lon plot. -* cycle_latlon.ncl: precalculates the metrics for a time-lat-lon field, with different options for normalization. -* collect.ncl: collects and plots the metrics previously calculated by cycle_latlon.ncl. +* cycle_latlon.ncl: precalculates the metrics for a time-lat-lon field, with + different options for normalization. +* collect.ncl: collects and plots the metrics previously calculated by + cycle_latlon.ncl. User settings in recipe ----------------------- @@ -37,9 +59,12 @@ User settings in recipe *Required settings (scripts)* - * plot_type: cycle (time), zonal (plev, lat), latlon (lat, lon), cycle_latlon (time, lat, lon), cycle_zonal (time, plev, lat) + * plot_type: cycle (time), zonal (plev, lat), latlon (lat, lon), cycle_latlon + (time, lat, lon), cycle_zonal (time, plev, lat) * time_avg: type of time average (monthlyclim, seasonalclim, annualclim) - * region: selected region (global, trop, nhext, shext, nhtrop, shtrop, nh, sh, nhmidlat, shmidlat, nhpolar, shpolar, eq) + * region: selected region (global, trop, nhext, shext, nhtrop, shtrop, nh, + sh, nhmidlat, shmidlat, nhpolar, shpolar, eq) + *Optional settings (scripts)* @@ -51,9 +76,12 @@ User settings in recipe * projection: map projection for plot_type latlon (default: CylindricalEquidistant) * plot_diff: draws difference plots (default: False) * calc_grading: calculates grading metrics (default: False) - * stippling: uses stippling to mark statistically significant differences (default: False = mask out non-significant differences in gray) - * show_global_avg: diplays the global avaerage of the input field as string at the top-right of lat-lon plots (default: False) - * annots: choose the annotation style, e.g. ```alias``` which would display the alias of the dataset as title (applies to plot_type zonal and cycle_zonal) + * stippling: uses stippling to mark statistically significant differences + (default: False = mask out non-significant differences in gray) + * show_global_avg: displays the global avaerage of the input field as string + at the top-right of lat-lon plots (default: False) + * annots: choose the annotation style, e.g. ```alias``` which would display + the alias of the dataset as title (applies to plot_type zonal and cycle_zonal) * metric: chosen grading metric(s) (if calc_grading is True) * normalization: metric normalization (for RMSD and BIAS metrics only) * abs_levs: list of contour levels for absolute plot @@ -114,8 +142,8 @@ User settings in recipe *Optional settings (scripts)* - * label_lo: adds lower triange for values outside range - * label_hi: adds upper triange for values outside range + * label_lo: adds lower triangle for values outside range + * label_hi: adds upper triangle for values outside range * cm_interval: min and max color of the color table * cm_reverse: reverses the color table * sort: sorts datasets in alphabetic order (excluding MMM) @@ -157,14 +185,21 @@ Variables Observations and reformat scripts --------------------------------- -The following list shows the currently used observational data sets for this recipe with their variable names and the reference to their respective reformat scripts in parentheses. Please note that obs4MIPs data can be used directly without any reformating. For non-obs4MIPs data use `esmvaltool data info DATASET` or see headers of cmorization scripts (in `/esmvaltool/cmorizers/data/formatters/datasets/ -`_) for downloading and processing instructions. +The following list shows the currently used observational data sets for this +recipe with their variable names and the reference to their respective reformat +scripts in parentheses. Please note that obs4MIPs data can be used directly +without any reformatitng. For non-obs4MIPs data use `esmvaltool data info DATASET` +or see headers of cmorization scripts (in `/esmvaltool/cmorizers/data/formatters/datasets/ +`_) +for downloading and processing instructions. + #. recipe_perfmetrics_CMIP5.yml * AIRS (hus - obs4MIPs) * CERES-EBAF (rlut, rlutcs, rsut, rsutcs - obs4MIPs) * ERA-Interim (tas, ta, ua, va, zg, hus - esmvaltool/cmorizers/data/formatters/datasets/era-interim.py) - * ESACCI-AEROSOL (od550aer, od870aer, od550abs, od550lt1aer - esmvaltool/cmorizers/data/formatters/datasets/esacci-aerosol.ncl) + * ESACCI-AEROSOL (od550aer, od870aer, od550abs, od550lt1aer - + esmvaltool/cmorizers/data/formatters/datasets/esacci-aerosol.ncl) * ESACCI-CLOUD (clt - esmvaltool/cmorizers/data/formatters/datasets/esacci-cloud.ncl) * ESACCI-OZONE (toz - esmvaltool/cmorizers/data/formatters/datasets/esacci-ozone.ncl) * ESACCI-SOILMOISTURE (sm - esmvaltool/cmorizers/data/formatters/datasets/esacci_soilmoisture.ncl) @@ -190,9 +225,13 @@ The following list shows the currently used observational data sets for this rec References ---------- -* Gleckler, P. J., K. E. Taylor, and C. Doutriaux, Performance metrics for climate models, J. Geophys. Res., 113, D06104, doi: 10.1029/2007JD008972 (2008). +* Gleckler, P. J., K. E. Taylor, and C. Doutriaux, Performance metrics for climate models, J. + Geophys. Res., 113, D06104, doi: 10.1029/2007JD008972 (2008). + +* Righi, M., Eyring, V., Klinger, C., Frank, F., Gottschaldt, K.-D., Jöckel, P., + and Cionni, I.: Quantitative evaluation of ozone and selected climate parameters in a set of EMAC simulations, + Geosci. Model Dev., 8, 733, doi: 10.5194/gmd-8-733-2015 (2015). -* Righi, M., Eyring, V., Klinger, C., Frank, F., Gottschaldt, K.-D., Jöckel, P., and Cionni, I.: Quantitative evaluation of oone and selected climate parameters in a set of EMAC simulations, Geosci. Model Dev., 8, 733, doi: 10.5194/gmd-8-733-2015 (2015). Example plots ------------- @@ -200,17 +239,24 @@ Example plots .. figure:: /recipes/figures/perfmetrics/perfmetrics_fig_1.png :width: 90% - Annual cycle of globally averaged temperature at 850 hPa (time period 1980-2005) for different CMIP5 models (historical simulation) (thin colored lines) in comparison to ERA-Interim (thick yellow line) and NCEP-NCAR-R1 (thick black dashed line) reanalysis data. + Annual cycle of globally averaged temperature at 850 hPa (time period 1980-2005) + for different CMIP5 models (historical simulation) (thin colored lines) in comparison to + ERA-Interim (thick yellow line) and NCEP-NCAR-R1 (thick black dashed line) reanalysis data. .. figure:: /recipes/figures/perfmetrics/perfmetrics_fig_2.png :width: 90% - Taylor diagram of globally averaged temperature at 850 hPa (ta) and longwave cloud radiative effect (lwcre) for different CMIP5 models (historical simulation, 1980-2005). Reference data (REF) are ERA-Interim for temperature (1980-2005) and CERES-EBAF (2001-2012) for longwave cloud radiative effect. + Taylor diagram of globally averaged temperature at 850 hPa (ta) and longwave cloud + radiative effect (lwcre) for different CMIP5 models (historical simulation, 1980-2005). + Reference data (REF) are ERA-Interim for temperature (1980-2005) and CERES-EBAF (2001-2012) + for longwave cloud radiative effect. .. figure:: /recipes/figures/perfmetrics/perfmetrics_fig_3.png :width: 90% - Difference in annual mean of zonally averaged temperature (time period 1980-2005) between the CMIP5 model MPI-ESM-MR (historical simulation) and ERA-Interim. Stippled areas indicdate differences that are statistically significant at a 95% confidence level. + Difference in annual mean of zonally averaged temperature (time period 1980-2005) between the + CMIP5 model MPI-ESM-MR (historical simulation) and ERA-Interim. Stippled areas indicdate + differences that are statistically significant at a 95% confidence level. .. figure:: /recipes/figures/perfmetrics/perfmetrics_fig_4.png :width: 90% @@ -221,4 +267,9 @@ Example plots :width: 90% :align: center - Relative space-time root-mean-square deviation (RMSD) calculated from the climatological seasonal cycle of CMIP5 simulations. A relative performance is displayed, with blue shading indicating better and red shading indicating worse performance than the median of all model results. A diagonal split of a grid square shows the relative error with respect to the reference data set (lower right triangle) and the alternative data set (upper left triangle). White boxes are used when data are not available for a given model and variable. + Relative space-time root-mean-square deviation (RMSD) calculated from the climatological + seasonal cycle of CMIP5 simulations. A relative performance is displayed, with blue shading + indicating better and red shading indicating worse performance than the median of all model results. + A diagonal split of a grid square shows the relative error with respect to the reference data set + (lower right triangle) and the alternative data set (upper left triangle). + White boxes are used when data are not available for a given model and variable. diff --git a/doc/sphinx/source/recipes/recipe_portrait.rst b/doc/sphinx/source/recipes/recipe_portrait.rst new file mode 100644 index 0000000000..38fb5b4489 --- /dev/null +++ b/doc/sphinx/source/recipes/recipe_portrait.rst @@ -0,0 +1,95 @@ +.. _recipe_portrait: + +Portrait plot +============= + + +Overview +-------- +Portrait plots are a flexible way to visualize performance metrics for multiple +datasets and up to four references. In this recipe ``recipe_portrait_CMIP.yml`` +the normalized Root Mean Squared Deviation (RMSD) of global mean seasonal +climatologies is calculated for a selection of CMIP models. +In the example recipe, for each variable up to two observation based datasets +are used as reference. +See :ref:`variables` for complete list of references. +The recipe uses preprocessor functions (distance metrics, global mean, +climate statistics) to calculate a scalar metric for each combination of +dataset, variable and reference, which is plotted by the ``portrait_plot.py`` +diagnostic script. + + +User settings in recipe +----------------------- + +By default cells are plotted for combinations of ``short_name``, +``dataset``, ``project`` and ``split``, +where ``split`` is an optional extra_facet for variables. +However, this can be customized using the ``x_by``, +``y_by``, ``group_by`` and ``split_by`` script settings. +For a complete and detailed list of settings, see the +:doc:`diagnostic documentation `. +While this allows very flexible use for any kind of data, there are some +limitations as well: The grouping (subplots) and normalization is always +applied along the x-axis. +With default settings this means normalizing all metrics for each variable +and grouping all datasets by project. + +To plot distance metrics like RMSE, pearson R, bias etc. the +:func:`distance_metric ` preprocessor +or custom diagnostics can be used. + + + +.. _variables: + +Variables and Datasets +------------------------ + +.. note:: + + The recipe generally works for any variable that is preprocessed correctly. + To use different preprocessors or reference datasets it could be useful + to create different variable groups and link them with the same extra_facet + like ``variable_name``. See recipe for examples. Listed below are the variables + used to produce the example figure. + + +The following list shows which observational dataset is used as reference for +each variable in this recipe. All variables are atmospheric monthly means. +For 3D variables the selected pressure level is specified in parentheses. + +* clt (Ref1: ESACCI-CLOUD, Ref2: PATMOS-x) +* pr (Ref1: GPCP-V2.2) +* rlut, rsut (Ref1: CERES-EBAF) +* tas (Ref1: ERA-Interim, Ref2: NCEP-NCAR-R1) +* ts (Ref1: ESACCI-SST, Ref2: HadISST) +* ua (200 hPa, Ref1: ERA-Interim, Ref2: NCEP-NCAR-R1) +* zg (500 hPa, Ref1: ERA-Interim, Ref2: NCEP-NCAR-R1) + + +References +---------- + +* Gleckler, P. J., K. E. Taylor, and C. Doutriaux, Performance metrics for climate models, J. + Geophys. Res., 113, D06104, doi: 10.1029/2007JD008972 (2008). + +* Righi, M., Eyring, V., Klinger, C., Frank, F., Gottschaldt, K.-D., Jöckel, P., + and Cionni, I.: Quantitative evaluation of ozone and selected climate parameters in a set of EMAC simulations, + Geosci. Model Dev., 8, 733, doi: 10.5194/gmd-8-733-2015 (2015). + + +Example plots +------------- + +.. _fig_portrait_plot: + +.. figure:: /recipes/figures/portrait/portrait_plot.png + :width: 90% + :align: center + + + Relative space-time root-mean-square deviation (RMSD) calculated from the climatological + seasonal cycle of CMIP5 and CMIP6 simulations. A relative performance is displayed, with blue shading + indicating better and red shading indicating worse performance than the median of all model results. + A diagonal split of a grid square shows the relative error with respect to the reference data set. diff --git a/esmvaltool/config-references.yml b/esmvaltool/config-references.yml index 114ffea267..1ece453343 100644 --- a/esmvaltool/config-references.yml +++ b/esmvaltool/config-references.yml @@ -24,6 +24,12 @@ authors: institute: DLR, Germany email: bjoern.broetz@dlr.de orcid: + cammarano_diego: + name: Cammarano, Diego + institute: DLR, Germany + email: diego.cammarano@dlr.de + github: diegokam + orcid: debeire_kevin: name: Debeire, Kevin institute: DLR, Germany @@ -241,7 +247,7 @@ authors: name: Gillett, Nathan institute: CCCma, ECCC, Canada orcid: https://orcid.org/0000-0002-2957-0002 - github: npgillett + github: npgillett gonzalez-reviriego_nube: name: Gonzalez-Reviriego, Nube institute: BSC, Spain diff --git a/esmvaltool/diag_scripts/portrait_plot.py b/esmvaltool/diag_scripts/portrait_plot.py new file mode 100644 index 0000000000..d8a19b52a9 --- /dev/null +++ b/esmvaltool/diag_scripts/portrait_plot.py @@ -0,0 +1,519 @@ +"""Portrait Plot Diagnostic. + +Plot performance metrics of multiple datasets vs up to four references +A :doc:`documented example recipe ` to use this +diagnostic is provided as ``recipes/recipe_portrait_CMIP.yml``. + +Description +----------- +This diagnostic provides plot functionalities for performance metrics, +and is written to be as flexible as possible to be adaptable to further use +cases. X and Y axis, grouping parameter and splits for each rectangle can be +configured in the recipe. All ``*_by`` parameters can be set to any metadata +key. To split by 'reference' this key needs to be set as extra_facet in recipe. + +Authors +------- +- Lukas Lindenlaub (Universität Bremen, Germany) +- Diego Cammarano + +Configuration parameters through recipe: +---------------------------------------- +axes_properties: dict, optional + Dictionary that gets passed to :meth:`matplotlib.axes.Axes.set`. + Subplots can be widely customized. + E.g. xlabel, ylabel, yticklabels, xmargin... + By default {}. +cbar_kwargs: dict, optional + Dictionary that gets passed to :meth:`matplotlib.pyplot.colorbar`. + E.g. label, ticks... + By default {}. +default_split: str, optional + Data labeled with this string, will be used as main rectangles. All other + splits will be plotted as overlays. This can be used to choose the base + reference, while all references are labeled for the legend. If None, the + first split will be used as default. + By default None. +dpi: int, optional + Dots per inch for the figure. By default 300. +domain: str, optional + Domain for provenance. By default 'global'. +figsize: tuple of float, optional + [width, height] of the figure in inches. The final figure will be saved + with bbox_inches="tight", which can change the resulting aspect ratio. + By default [7.5, 3.5]. +group_by: str, optional + Split portrait groups into multiple groups (one matrix per group). + By default 'project'. +legend: dict, optional + Customize, if, how and where the legend is plotted. The 'best' position + and size of the legend depends on multiple parameters of the figure + (i.e. lengths of labels, aspect ratio of the plots...). Might require + manual adjustment of ``x``, ``y`` and ``size`` to fit the figure layout. + Keys (each optional) that will be handled are: + + position: str or None, optional + Position of the legend. Can be 'right' or 'left'. + Or set to None to disable plotting the legend. By default 'right'. + size: float, optional + Size of the legend in Inches. By default 0.3. + x_offset: float, optional + Manually adjust horizontal position to save space or fix overlap. + Number given in Inches. By default 0. + y_offset: float, optional + Manually adjust vertical position to save space or fix overlap. + Number given in Inches. By default 0. + +matplotlib_rc_params: dict, optional + Optional :class:`matplotlib.RcParams` used to customize matplotlib plots. + Options given here will be passed to :func:`matplotlib.rc_context` and used + for all plots produced with this diagnostic. Note: fontsizes specified here + might be overwritten by the plot-type-specific option ``fontsize`` (see + below). +nan_color: str or None, optional + Matplotlib named color or hexcode for NaN values. If set to None, + no triangles are plotted for NaN values. + By default 'white'. +normalize: str or None, optional + ('mean', 'median', 'centered_mean', 'centered_median', None). + Divide by median or mean if not None. Subtract median/mean afterwards if + centered. + By default 'centered_median'. +plot_kwargs: dict, optional + Dictionary that gets passed as kwargs to + :meth:`matplotlib.axes.Axes.imshow`. Colormaps will be converted to 11 + discrete steps automatically. + Default colormap is ``cmap='RdYlBu_r'`` with limits ``vmin=-0.5`` and + ``vmax=0.5``. +plot_legend: bool, optional + If True, a legend is plotted, when multiple splits are given. + By default True. +split_by: str, optional + The rectangles can be split into 2-4 triangles. This is used to show + metrics for different references. For this case there is no need to change + this parameter. Multiple variables can be set in the recipe with ``split`` + assigned as extra_facet to label the different references. Data without + a split assigned will be plotted as main rectangles, this can be changed + by setting default_split parameter. + By default 'split'. +x_by: str, optional + Metadata key for x coordinate. + By default 'alias'. +y_by: str, optional + Metadata key for y coordinate. + By default 'variable_group'. + +""" + +import itertools +import logging + +import matplotlib as mpl +import matplotlib.pyplot as plt +import numpy as np +import xarray as xr +from matplotlib import patches +from mpl_toolkits.axes_grid1 import ImageGrid + +from esmvaltool.diag_scripts.shared import ( + ProvenanceLogger, + get_diagnostic_filename, + get_plot_filename, + group_metadata, + run_diagnostic, + select_metadata, +) + +log = logging.getLogger(__name__) + + +def get_provenance(cfg): + """Return provenance for this diagnostic.""" + return { + 'ancestors': list(cfg["input_data"].keys()), + 'authors': ["lindenlaub_lukas", "cammarano_diego"], + 'caption': 'RMSE performance metric', + 'domains': [cfg["domain"]], + 'plot_types': ['portrait'], + 'references': [ + 'gleckler08jgr', + ], + 'statistics': ['rmsd'], + } + + +def unify_limits(grid): + """Ensure same limits for all subplots.""" + vmin, vmax = np.inf, -np.inf + images = [ax.get_images()[0] for ax in grid] + for img in images: + vmin = min(vmin, img.get_clim()[0]) + vmax = max(vmax, img.get_clim()[1]) + for img in images: + img.set_clim(vmin, vmax) + + +def plot_matrix(data, row_labels, col_labels, axe, plot_kwargs): + """Create an image for given data.""" + img = axe.imshow(data, **plot_kwargs) + # Show all ticks and label them with the respective list entries. + axe.set_xticks(np.arange(data.shape[1]), labels=col_labels) + axe.set_yticks(np.arange(data.shape[0]), labels=row_labels) + # Rotate the tick labels and set their alignment. + plt.setp( + axe.get_xticklabels(), + rotation=90, + ha="right", + va="center", + rotation_mode="anchor", + ) + axe.set_xticks(np.arange(data.shape[1] + 1) - 0.5, minor=True) + axe.set_yticks(np.arange(data.shape[0] + 1) - 0.5, minor=True) + axe.grid(which="minor", color="black", linestyle="-", linewidth=0.8) + axe.tick_params(which="both", bottom=False, left=False) + return img + + +def remove_reference(metas): + """Remove reference for metric from list of metadata.""" + for meta in list(metas): # list() creates a copy to allow remove in place + if meta.get("reference_for_metric", False): + metas.remove(meta) + + +def add_missing_facets(cfg, metas): + """Ensure that all facets are present in metadata.""" + for meta in metas: + facet_config = ["x_by", "y_by", "group_by", "split_by"] + facets = [cfg[key] for key in facet_config] + for facet in facets: + meta.setdefault(facet, "unknown") + + +def open_file(metadata, **selection): + """Try to find a single file for selection and return data. + + If multiple files are found, raise an error. If no file is found, + return np.nan. + """ + metas = select_metadata(metadata, **selection) + if len(metas) > 1: + raise ValueError(f"Multiple files found for {selection}") + if len(metas) < 1: + log.debug("No files found for %s", selection) + return np.nan + log.debug("File found for %s", selection) + das = xr.open_dataset(metas[0]["filename"]) + varname = list(das.data_vars.keys())[0] + try: + return das[varname].values.item() + except ValueError as exc: + msg = f"Expected scalar in input file {metas[0]['filename']}." + raise ValueError(msg) from exc + + +def load_data(cfg, metas): + """Load all netcdf files from metadata into xarray dataset. + + The dataset contains all relevant information for the plot. Coord + names are metadata keys, ordered as x, y, group, split. The default + reference is None, or if all references are named the first from the + list. + """ + coords = { # order matters: x, y, group, split + cfg["x_by"]: list(group_metadata(metas, cfg["x_by"]).keys()), + cfg["y_by"]: list(group_metadata(metas, cfg["y_by"]).keys()), + cfg["group_by"]: list(group_metadata(metas, cfg["group_by"]).keys()), + cfg["split_by"]: list(group_metadata(metas, cfg["split_by"]).keys()), + } + shape = [len(coord) for coord in coords.values()] + var_data = xr.DataArray(np.full(shape, np.nan), dims=list(coords.keys())) + data = xr.Dataset({"var": var_data}, coords=coords) + # loop over each cell (coord combination) and load data if existing + for coord_tuple in itertools.product(*coords.values()): + selection = dict(zip(coords.keys(), coord_tuple)) + data['var'].loc[selection] = open_file(metas, **selection) + if cfg["default_split"] is None: + cfg["default_split"] = data.coords[cfg["split_by"]].values[0] + log.debug("Using %s as default split", cfg["default_split"]) + log.debug("Loaded Data: %s", data) + return data + + +def split_legend(cfg, grid, data): + """Create legend for references, based on split coordinate in the dataset. + + Mpl handles axes positions in relative figure coordinates. To anchor the + legend to the origin of the first graph (bottom left) with fixed size, + without messing up the layout for changing figure sizes, a few extra steps + are required. + NOTE: maybe ``mpl_toolkits.axes_grid1.axes_divider.AxesDivider`` simplifies + this a bit by using ``append_axes``. + """ + grid[0].get_figure().canvas.draw() # set axes position in figure + size = cfg["legend"]["size"] # rect width in physical size (inch) + fig_size = grid[0].get_figure().get_size_inches() # physical figure size + ax_size = (size / fig_size[0], size / fig_size[1]) # legend (fig coords) + gaps = [0.3 / fig_size[0], 0.3 / fig_size[1]] # margins (fig coords) + # anchor legend on origin of first plot or colorbar + anchor = grid[0].get_position().bounds # relative figure coordinates + if cfg["legend"]["position"] == "right": + cbar_x = grid.cbar_axes[0].get_position().bounds[0] + gaps[0] *= 0.8 # compensate colorbar padding + anchor = (cbar_x + gaps[0] + cfg["legend"]["x_offset"], + anchor[1] - gaps[1] - ax_size[1] + cfg["legend"]["y_offset"]) + else: + anchor = (anchor[0] - gaps[0] - ax_size[0] + cfg["legend"]["x_offset"], + anchor[1] - gaps[1] - ax_size[1] + cfg["legend"]["y_offset"]) + # create legend as empty imshow like axes in figure coordinates + axes = {"main": grid[0].get_figure().add_axes([*anchor, *ax_size])} + axes["main"].imshow(np.zeros((1, 1))) # same axes properties as main plot + axes["main"].set_xticks([]) + axes["main"].set_yticks([]) + axes["twiny"], axes["twinx"] = [axes["main"].twiny(), axes["main"].twinx()] + axes["twinx"].set_yticks([]) + axes["twiny"].set_xticks([]) + label_at = [ # order matches get_triangle_nodes (halves and quarters) + axes["main"].set_ylabel, # left + axes["twinx"].set_ylabel, # right + axes["main"].set_xlabel, # bottom + axes["twiny"].set_xlabel, # top + ] + for i, label in enumerate(data.coords[cfg["split_by"]].values): + nodes = get_triangle_nodes(i, len(data.coords[cfg["split_by"]].values)) + axes["main"].add_patch( + patches.Polygon(nodes, + closed=True, + facecolor=["#bbb", "#ccc", "#ddd", "#eee"][i], + edgecolor="black", + linewidth=0.5, + fill=True)) + label_at[i](label) + + +def overlay_reference(cfg, axe, data, triangle): + """Create triangular overlays for given data and axes.""" + # use same colors as in main plot + cmap = axe.get_images()[0].get_cmap() + norm = axe.get_images()[0].norm + if cfg["nan_color"] is not None: + cmap.set_bad(cfg["nan_color"]) + for i, j in itertools.product(*map(range, data.shape)): + if np.isnan(data[i, j]) and cfg["nan_color"] is None: + continue + color = cmap(norm(data[i, j])) + edges = [(e[0] + j, e[1] + i) for e in triangle] + patch = patches.Polygon( + edges, + closed=True, + facecolor=color, + edgecolor="black", + linewidth=0.5, + fill=True, + ) + axe.add_patch(patch) + + +def plot_group(cfg, axe, data, title=None): + """Create matrix for one subplot in ax using plt.imshow. + + By default split None is used, if all splits are named the first is + used. Other splits will be added by overlaying triangles. + """ + split = data.sel({cfg["split_by"]: cfg["default_split"]}) + plot_matrix( + split.values.T, # 2d numpy array + split.coords[cfg["y_by"]].values, # y_labels + split.coords[cfg["x_by"]].values, # x_labels + axe, + cfg["plot_kwargs"], + ) + if title is not None: + axe.set_title(title) + axe.set(**cfg["axes_properties"]) + + +def get_triangle_nodes(position, total_count=2): + """Return list of nodes with relative x, y coordinates. + + The nodes of the triangle are given as list of three tuples. Each tuple + contains relative coordinates (-0.5 to +0.5). For total of <= 2 a top left + (position=0) and bottom right (position=1) rectangle is returned. + For higher counts (3 or 4) one quartile is returned for each position. + NOTE: Order matters. Ensure axis labels for the legend match when changing. + """ + if total_count < 3: + halves = [ + [(0.5, -0.5), (-0.5, -0.5), (-0.5, 0.5)], # top left + [(0.5, -0.5), (0.5, 0.5), (-0.5, 0.5)], # bottom right + ] + return halves[position] + quarters = [ + [(-0.5, -0.5), (0, 0), (-0.5, 0.5)], # left + [(0.5, -0.5), (0, 0), (0.5, 0.5)], # right + [(-0.5, 0.5), (0, 0), (0.5, 0.5)], # bottom + [(-0.5, -0.5), (0, 0), (0.5, -0.5)], # top + ] + return quarters[position] + + +def plot_overlays(cfg, grid, data): + """Call overlay_reference for each split in data and each group in grid.""" + split_count = data.shape[3] + group_count = data.shape[2] + for i in range(group_count): + if split_count < 2: + log.debug("No additional splits for overlay.") + break + if split_count > 4: + log.warning("Too many splits for overlay, only 3 will be plotted.") + group_data = data.isel({cfg["group_by"]: i}) + group_data = group_data.dropna(cfg["x_by"], how="all") + for sss in range(split_count): + split = group_data.isel({cfg["split_by"]: sss}) + split_label = split.coords[cfg["split_by"]].values.item() + if split_label == cfg["default_split"]: + log.debug("Skipping default split for overlay.") + continue + nodes = get_triangle_nodes(sss, split_count) + overlay_reference(cfg, grid[i], split.values.T, nodes) + + +def plot(cfg, data): + """Create figure with subplots for each group and save to NetCDF. + + Sets same color range and overlays additional references based on + the content of data (xr.DataArray). + """ + fig = plt.figure(1, cfg["figsize"]) + group_count = len(data.coords[cfg["group_by"]]) + grid = ImageGrid( + fig, + 111, # similar to subplot(111) + cbar_mode="single", + cbar_location="right", + cbar_pad=0.1, + cbar_size=0.2, + nrows_ncols=(1, group_count), + axes_pad=0.1, + ) + # remap colorbar to 10 discrete steps + cmap = mpl.cm.get_cmap(cfg["plot_kwargs"]["cmap"], 10) + cfg["plot_kwargs"]["cmap"] = cmap + for i in range(group_count): + group = data.isel({cfg["group_by"]: i}) + group = group.dropna(cfg["x_by"], how="all") + title = None + if group_count > 1: + title = group.coords[cfg["group_by"]].values.item() + plot_group(cfg, grid[i], group, title=title) + # use same colorrange and colorbar for all subplots: + unify_limits(grid) + # set cb of first image as single cb for the figure + grid.cbar_axes[0].colorbar(grid[0].get_images()[0], **cfg["cbar_kwargs"]) + if data.shape[3] > 1: + plot_overlays(cfg, grid, data) + if cfg["plot_legend"] and data.shape[3] > 1: + split_legend(cfg, grid, data) + basename = "portrait_plot" + fname = get_plot_filename(basename, cfg) + plt.savefig(fname, bbox_inches="tight", dpi=cfg["dpi"]) + with ProvenanceLogger(cfg) as prov_logger: + prov_logger.log(fname, get_provenance(cfg)) + log.info("Figure saved:") + log.info(fname) + + +def normalize(array, method, dims): + """Divide and shift values along dims depending on method.""" + shift = 0 + norm = 1 + if "mean" in method: + norm = array.mean(dim=dims) + elif "median" in method: + norm = array.median(dim=dims) + if "centered" in method: + shift = norm + normalized = (array - shift) / norm + return normalized + + +def set_defaults(cfg): + """Set default values for most important config parameters.""" + cfg.setdefault("axes_properties", {}) + cfg.setdefault("cbar_kwargs", {}) + cfg.setdefault("default_split", None) + cfg.setdefault("dpi", 300) + cfg.setdefault("domain", "global") + cfg.setdefault("figsize", (7.5, 3.5)) + cfg.setdefault("group_by", "project") + cfg.setdefault("legend", {}) + cfg["legend"].setdefault("position", "right") + cfg["legend"].setdefault("size", 0.3) + cfg["legend"].setdefault("x_offset", 0) + cfg["legend"].setdefault("y_offset", 0) + cfg.setdefault("matplotlib_rc_params", {}) + cfg.setdefault("nan_color", 'white') + cfg.setdefault("normalize", "centered_median") + cfg.setdefault("plot_kwargs", {}) + cfg["plot_kwargs"].setdefault("cmap", "RdYlBu_r") + cfg["plot_kwargs"].setdefault("vmin", -0.5) + cfg["plot_kwargs"].setdefault("vmax", 0.5) + cfg.setdefault("plot_legend", True) + cfg.setdefault("split_by", "split") # extra facet + cfg.setdefault("x_by", "alias") + cfg.setdefault("y_by", "variable_group") + + +def sort_data(cfg, dataset): + """Sort the dataset along by custom or alphabetical order.""" + dataset = dataset.sortby([ + dataset[cfg["x_by"]].str.lower(), dataset[cfg["y_by"]].str.lower(), + dataset[cfg["group_by"]].str.lower(), + dataset[cfg["split_by"]].str.lower() + ]) + if cfg["x_by"] in ["alias", "dataset"]: + # NOTE: not clean, but it works for many cases + mm_stats = [ + v for v in dataset[cfg["x_by"]].values + if "Mean" in v or "Median" in v or "Percentile" in v + ] + others = [ + v for v in dataset[cfg["x_by"]].values + if "Mean" not in v and "Median" not in v and "Percentile" not in v + ] + new_order = mm_stats + others + dataset = dataset.reindex({cfg["x_by"]: new_order}) + return dataset + + +def save_to_netcdf(cfg, data): + """Save the final dataset to a NetCDF file.""" + basename = "portrait" + fname = get_diagnostic_filename(basename, cfg, extension='nc') + data.to_netcdf(fname) + log.info("NetCDF file saved:") + log.info(fname) + with ProvenanceLogger(cfg) as prov_logger: + prov_logger.log(fname, get_provenance(cfg)) + + +def main(cfg): + """Run the diagnostic.""" + set_defaults(cfg) + metas = list(cfg["input_data"].values()) + remove_reference(metas) + add_missing_facets(cfg, metas) + dataset = load_data(cfg, metas) + dataset = sort_data(cfg, dataset) + if cfg["normalize"] is not None: + dataset["var"] = normalize(dataset["var"], cfg["normalize"], + [cfg["x_by"], cfg["group_by"]]) + with mpl.rc_context(cfg['matplotlib_rc_params']): + plot(cfg, dataset["var"]) + save_to_netcdf(cfg, dataset["var"]) + + +if __name__ == '__main__': + with run_diagnostic() as config: + main(config) diff --git a/esmvaltool/recipes/recipe_portrait_CMIP.yml b/esmvaltool/recipes/recipe_portrait_CMIP.yml new file mode 100644 index 0000000000..b09eb1ec72 --- /dev/null +++ b/esmvaltool/recipes/recipe_portrait_CMIP.yml @@ -0,0 +1,213 @@ +# ESMValTool +--- +documentation: + title: Performance metrics plots. + description: > + Compare performance of CMIP simulations to a reference dataset. + authors: + - cammarano_diego + - lindenlaub_lukas + maintainer: + - lindenlaub_lukas + references: + - eyring21ipcc + - gleckler08jgr + +cmip5: &CMIP5 + project: CMIP5 + ensemble: r1i1p1 + +datasets: + # cmip5 + - {<<: *CMIP5, dataset: ACCESS1-0} + - {<<: *CMIP5, dataset: CESM1-BGC} + - {<<: *CMIP5, dataset: CNRM-CM5} + - {<<: *CMIP5, dataset: GFDL-ESM2M} + - {<<: *CMIP5, dataset: HadGEM2-CC} + - {<<: *CMIP5, dataset: IPSL-CM5B-LR} + - {<<: *CMIP5, dataset: MIROC-ESM} + - {<<: *CMIP5, dataset: MPI-ESM-LR} + - {<<: *CMIP5, dataset: MRI-CGCM3} + # cmip6 + - {dataset: ACCESS-ESM1-5, institute: CSIRO} + - {dataset: CESM2, institute: NCAR} + - {dataset: CNRM-CM6-1, ensemble: r1i1p1f2, grid: gr} + - {dataset: GFDL-CM4, grid: gr1} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2} + - {dataset: MPI-ESM1-2-LR} + - {dataset: MRI-ESM2-0} + - {dataset: UKESM1-0-LL, ensemble: r1i1p1f2} + +preprocessors: + default: &default # common preprocessor settings + regrid: + target_grid: 3x3 + scheme: linear + distance_metric: + metric: weighted_rmse + climate_statistics: + operator: mean + period: month + mask_fillvalues: + threshold_fraction: 0.95 + multi_model_statistics: + span: overlap + statistics: + - operator: mean + - operator: percentile + percent: 50 + groupby: ['project'] + # exclude all possible reference datasets + exclude: [ + AIRS-2-1, + CERES-EBAF, + ERA-Interim, + ESACCI-AEROSOL, + ESACCI-CLOUD, + ESACCI-OZONE, + ESACCI-SOILMOISTURE, + ESACCI-SST, + GPCP-SG, + HadISST, + NCEP-NCAR-R1, + MODIS, + NIWA-BS, + PATMOS-x] + pp200: # only add/overwrite var specific settings + <<: *default + extract_levels: + levels: 20000 + scheme: linear + coordinate: air_pressure + pp500: # only add/overwrite var specific settings + <<: *default + extract_levels: + levels: 50000 + scheme: linear + coordinate: air_pressure + thr10: # only add/overwrite var specific settings + <<: *default + mask_fillvalues: + threshold_fraction: 0.10 + +var_default: &var_default + mip: Amon + project: CMIP6 + exp: historical + ensemble: r1i1p1f1 + preprocessor: default + grid: gn + start_year: 2000 + end_year: 2002 + split: Ref1 # first triangle + +diagnostics: + portrait_rmse: + themes: [aerosols, phys, clouds, atmDyn, chem, ghg] + realms: [atmos, land, atmosChem, ocean] + variables: + zg: &zg + <<: *var_default + short_name: zg + variable: zg500 + preprocessor: pp500 + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, + version: 1, tier: 3, reference_for_metric: true} + zg_2: + <<: *zg + split: Ref2 + additional_datasets: + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2, reference_for_metric: true} + clt: &clt + <<: *var_default + short_name: clt + variable: clt + additional_datasets: + - {dataset: ESACCI-CLOUD, project: OBS, type: sat, + version: AVHRR-AMPM-fv3.0, tier: 2, reference_for_metric: true} + clt_2: + <<: *clt + split: Ref2 + additional_datasets: + - {dataset: PATMOS-x, project: OBS, type: sat, version: NOAA, tier: 2, reference_for_metric: true} + ts: &ts + <<: *var_default + short_name: ts + variable: ts + preprocessor: default + additional_datasets: + - {dataset: ESACCI-SST, project: OBS, type: sat, version: 2.2, tier: 2, reference_for_metric: true} + ts_2: + <<: *ts + split: Ref2 + additional_datasets: + - {dataset: HadISST, project: OBS, type: reanaly, version: 1, tier: 2, reference_for_metric: true} + tas: &tas + <<: *var_default + short_name: tas + variable: tas + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, + version: 1, tier: 3, reference_for_metric: true} + tas_2: + <<: *tas + split: Ref2 + additional_datasets: + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2, reference_for_metric: true} + pr: + <<: *var_default + variable: pr + split: Ref1 + additional_datasets: + - {dataset: GPCP-SG, project: OBS, type: atmos, + version: 2.3, tier: 2, reference_for_metric: true} + rlut: + <<: *var_default + variable: rlut + start_year: 2001 + end_year: 2003 + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, reference_for_metric: true} + rsut: + <<: *var_default + variable: rsut + start_year: 2001 + end_year: 2003 + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, reference_for_metric: true} + ua200: &ua200 + <<: *var_default + variable: ua200 + short_name: ua + preprocessor: pp200 + split: Ref1 + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, + version: 1, tier: 3, reference_for_metric: true} + ua200_2: + <<: *ua200 + split: Ref2 + additional_datasets: + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2, reference_for_metric: true} + + scripts: + portrait: + script: portrait_plot.py + x_by: dataset + y_by: variable # extra_facet + group_by: project + normalize: "centered_median" + default_split: Ref1 + nan_color: null + plot_kwargs: + vmin: -0.5 + vmax: +0.5 + cbar_kwargs: + label: Relative RMSE + extend: both diff --git a/esmvaltool/recipes/testing/recipe_portrait_CMIP_fast.yml b/esmvaltool/recipes/testing/recipe_portrait_CMIP_fast.yml new file mode 100644 index 0000000000..002df5b4a8 --- /dev/null +++ b/esmvaltool/recipes/testing/recipe_portrait_CMIP_fast.yml @@ -0,0 +1,160 @@ +# ESMValTool +--- +documentation: + title: Performance metrics plots. + description: > + Test recipe for the performance comparison of CMIP simulations to a reference dataset. + authors: + - lindenlaub_lukas + maintainer: + - lindenlaub_lukas + references: + - eyring21ipcc + - gleckler08jgr + +cmip5: &CMIP5 + project: CMIP5 + ensemble: r1i1p1 + +datasets: + # cmip5 + - {<<: *CMIP5, dataset: ACCESS1-0} + - {<<: *CMIP5, dataset: CESM1-BGC} + - {<<: *CMIP5, dataset: GFDL-ESM2M} + - {<<: *CMIP5, dataset: MIROC-ESM} + - {<<: *CMIP5, dataset: MRI-CGCM3} + # cmip6 + - {dataset: ACCESS-ESM1-5, institute: CSIRO} + - {dataset: CESM2, institute: NCAR} + - {dataset: GFDL-CM4, grid: gr1} + - {dataset: MIROC-ES2L, ensemble: r1i1p1f2} + - {dataset: MRI-ESM2-0} + + +preprocessors: + default: &default # common preprocessor settings + regrid: + target_grid: 3x3 + scheme: linear + distance_metric: + metric: weighted_rmse + climate_statistics: + operator: mean + period: month + mask_fillvalues: + threshold_fraction: 0.95 + multi_model_statistics: + span: overlap + statistics: + - operator: mean + - operator: percentile + percent: 50 + groupby: ['project'] + # exclude all possible reference datasets + exclude: [ + AIRS-2-1, + CERES-EBAF, + ERA-Interim, + ESACCI-AEROSOL, + ESACCI-CLOUD, + ESACCI-OZONE, + ESACCI-SOILMOISTURE, + ESACCI-SST, + GPCP-SG, + HadISST, + NCEP-NCAR-R1, + MODIS, + NIWA-BS, + PATMOS-x] + pp200: # only add/overwrite var specific settings + <<: *default + extract_levels: + levels: 20000 + scheme: linear + coordinate: air_pressure + pp500: # only add/overwrite var specific settings + <<: *default + extract_levels: + levels: 50000 + scheme: linear + coordinate: air_pressure + thr10: # only add/overwrite var specific settings + <<: *default + mask_fillvalues: + threshold_fraction: 0.10 + +var_default: &var_default + mip: Amon + project: CMIP6 + exp: historical + ensemble: r1i1p1f1 + preprocessor: default + grid: gn + start_year: 2000 + end_year: 2002 + split: Ref1 # first triangle + +diagnostics: + portrait_rmse: + themes: [aerosols, phys, clouds, atmDyn, chem, ghg] + realms: [atmos, land, atmosChem, ocean] + variables: + tas: &tas + <<: *var_default + short_name: tas + variable: tas + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, + version: 1, tier: 3, reference_for_metric: true} + tas_2: + <<: *tas + split: Ref2 + additional_datasets: + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2, reference_for_metric: true} + pr: + <<: *var_default + variable: pr + split: Ref1 + additional_datasets: + - {dataset: GPCP-SG, project: OBS, type: atmos, + version: 2.3, tier: 2, reference_for_metric: true} + rsut: + <<: *var_default + variable: rsut + start_year: 2001 + end_year: 2003 + additional_datasets: + - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, + tier: 2, reference_for_metric: true} + ua200: &ua200 + <<: *var_default + variable: ua200 + short_name: ua + preprocessor: pp200 + split: Ref1 + additional_datasets: + - {dataset: ERA-Interim, project: OBS6, type: reanaly, + version: 1, tier: 3, reference_for_metric: true} + ua200_2: + <<: *ua200 + split: Ref2 + additional_datasets: + - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, + version: 1, tier: 2, reference_for_metric: true} + + scripts: + portrait: + script: portrait_plot.py + x_by: dataset + y_by: variable # extra_facet + group_by: project + normalize: "centered_median" + default_split: Ref1 + nan_color: null + plot_kwargs: + vmin: -0.5 + vmax: +0.5 + cbar_kwargs: + label: Relative RMSE + extend: both From 2a6be12f474ee611f91bc8f9fc4b7162afac54f1 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Mon, 27 Jan 2025 14:28:50 +0100 Subject: [PATCH 86/87] Remove portrait plot test recipe (#3871) --- .../testing/recipe_portrait_CMIP_fast.yml | 160 ------------------ 1 file changed, 160 deletions(-) delete mode 100644 esmvaltool/recipes/testing/recipe_portrait_CMIP_fast.yml diff --git a/esmvaltool/recipes/testing/recipe_portrait_CMIP_fast.yml b/esmvaltool/recipes/testing/recipe_portrait_CMIP_fast.yml deleted file mode 100644 index 002df5b4a8..0000000000 --- a/esmvaltool/recipes/testing/recipe_portrait_CMIP_fast.yml +++ /dev/null @@ -1,160 +0,0 @@ -# ESMValTool ---- -documentation: - title: Performance metrics plots. - description: > - Test recipe for the performance comparison of CMIP simulations to a reference dataset. - authors: - - lindenlaub_lukas - maintainer: - - lindenlaub_lukas - references: - - eyring21ipcc - - gleckler08jgr - -cmip5: &CMIP5 - project: CMIP5 - ensemble: r1i1p1 - -datasets: - # cmip5 - - {<<: *CMIP5, dataset: ACCESS1-0} - - {<<: *CMIP5, dataset: CESM1-BGC} - - {<<: *CMIP5, dataset: GFDL-ESM2M} - - {<<: *CMIP5, dataset: MIROC-ESM} - - {<<: *CMIP5, dataset: MRI-CGCM3} - # cmip6 - - {dataset: ACCESS-ESM1-5, institute: CSIRO} - - {dataset: CESM2, institute: NCAR} - - {dataset: GFDL-CM4, grid: gr1} - - {dataset: MIROC-ES2L, ensemble: r1i1p1f2} - - {dataset: MRI-ESM2-0} - - -preprocessors: - default: &default # common preprocessor settings - regrid: - target_grid: 3x3 - scheme: linear - distance_metric: - metric: weighted_rmse - climate_statistics: - operator: mean - period: month - mask_fillvalues: - threshold_fraction: 0.95 - multi_model_statistics: - span: overlap - statistics: - - operator: mean - - operator: percentile - percent: 50 - groupby: ['project'] - # exclude all possible reference datasets - exclude: [ - AIRS-2-1, - CERES-EBAF, - ERA-Interim, - ESACCI-AEROSOL, - ESACCI-CLOUD, - ESACCI-OZONE, - ESACCI-SOILMOISTURE, - ESACCI-SST, - GPCP-SG, - HadISST, - NCEP-NCAR-R1, - MODIS, - NIWA-BS, - PATMOS-x] - pp200: # only add/overwrite var specific settings - <<: *default - extract_levels: - levels: 20000 - scheme: linear - coordinate: air_pressure - pp500: # only add/overwrite var specific settings - <<: *default - extract_levels: - levels: 50000 - scheme: linear - coordinate: air_pressure - thr10: # only add/overwrite var specific settings - <<: *default - mask_fillvalues: - threshold_fraction: 0.10 - -var_default: &var_default - mip: Amon - project: CMIP6 - exp: historical - ensemble: r1i1p1f1 - preprocessor: default - grid: gn - start_year: 2000 - end_year: 2002 - split: Ref1 # first triangle - -diagnostics: - portrait_rmse: - themes: [aerosols, phys, clouds, atmDyn, chem, ghg] - realms: [atmos, land, atmosChem, ocean] - variables: - tas: &tas - <<: *var_default - short_name: tas - variable: tas - additional_datasets: - - {dataset: ERA-Interim, project: OBS6, type: reanaly, - version: 1, tier: 3, reference_for_metric: true} - tas_2: - <<: *tas - split: Ref2 - additional_datasets: - - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, - version: 1, tier: 2, reference_for_metric: true} - pr: - <<: *var_default - variable: pr - split: Ref1 - additional_datasets: - - {dataset: GPCP-SG, project: OBS, type: atmos, - version: 2.3, tier: 2, reference_for_metric: true} - rsut: - <<: *var_default - variable: rsut - start_year: 2001 - end_year: 2003 - additional_datasets: - - {dataset: CERES-EBAF, project: OBS, type: sat, version: Ed4.2, - tier: 2, reference_for_metric: true} - ua200: &ua200 - <<: *var_default - variable: ua200 - short_name: ua - preprocessor: pp200 - split: Ref1 - additional_datasets: - - {dataset: ERA-Interim, project: OBS6, type: reanaly, - version: 1, tier: 3, reference_for_metric: true} - ua200_2: - <<: *ua200 - split: Ref2 - additional_datasets: - - {dataset: NCEP-NCAR-R1, project: OBS6, type: reanaly, - version: 1, tier: 2, reference_for_metric: true} - - scripts: - portrait: - script: portrait_plot.py - x_by: dataset - y_by: variable # extra_facet - group_by: project - normalize: "centered_median" - default_split: Ref1 - nan_color: null - plot_kwargs: - vmin: -0.5 - vmax: +0.5 - cbar_kwargs: - label: Relative RMSE - extend: both From 983de783583a76614f545da5200f2d4a32e28aef Mon Sep 17 00:00:00 2001 From: chrisbillowsMO <152496175+chrisbillowsMO@users.noreply.github.com> Date: Mon, 27 Jan 2025 14:17:08 +0000 Subject: [PATCH 87/87] #3856: Use site-specific lists of recipes in the RTW Co-authored-by: Emma Hogan --- doc/sphinx/source/utils/RTW/add_a_recipe.rst | 177 ++++++++++-------- doc/sphinx/source/utils/RTW/common.txt | 14 +- .../source/utils/RTW/tested_recipes.rst | 19 +- .../source/utils/RTW/user_guide/workflow.rst | 11 ++ .../Jinja2Tests/file_exists.py | 37 ++++ .../utils/recipe_test_workflow/flow.cylc | 48 +++-- .../site/metoffice-recipes.jinja | 81 ++++++++ .../recipe_test_workflow/site/metoffice.cylc | 37 ---- 8 files changed, 276 insertions(+), 148 deletions(-) create mode 100644 esmvaltool/utils/recipe_test_workflow/Jinja2Tests/file_exists.py create mode 100644 esmvaltool/utils/recipe_test_workflow/site/metoffice-recipes.jinja diff --git a/doc/sphinx/source/utils/RTW/add_a_recipe.rst b/doc/sphinx/source/utils/RTW/add_a_recipe.rst index 6e495e1f1c..954b518a36 100644 --- a/doc/sphinx/source/utils/RTW/add_a_recipe.rst +++ b/doc/sphinx/source/utils/RTW/add_a_recipe.rst @@ -3,116 +3,141 @@ How to add a recipe to the |RTW| .. include:: common.txt -.. note:: - Before you follow these steps to add your recipe, you must be able to - successfully run the recipe with the latest version of ESMValTool on the - compute server you use at your site, as detailed by the ``platform`` option - in the ``[[COMPUTE]]`` section in the site-specific ``.cylc`` file in the - ``esmvaltool/utils/recipe_test_workflow/site/`` directory. +Overview +-------- -#. Open a `new ESMValTool issue`_ on GitHub, assign yourself to the issue, and - add the ``Recipe Test Workflow (RTW)`` label to the issue, see - `ESMValTool issue #3663`_ for an example. +To add a recipe to the |RTW| you will: -#. Create a branch. +* Run the recipe at your site +* Note the actual duration and memory usage +* Edit your site's recipe file +* Create the recipe's KGOs +* Request a review -#. Obtain the duration and memory usage of the recipe from the messages printed - to screen, or at the end of the ``run/main_log.txt`` file in the recipe - output directory after running your recipe on the compute cluster you use at - your site; these messages will look something like:: +The recipe will then run at your site whenever the |RTW| is run. - YYYY-MM-DD HH:MM:SS:sss UTC [12345] INFO Time for running the recipe was: 0:02:13.334742 - YYYY-MM-DD HH:MM:SS:sss UTC [12345] INFO Maximum memory used (estimate): 2.4 GB - [...] - YYYY-MM-DD HH:MM:SS:sss UTC [12345] INFO Run was successful +Preparation +----------- -#. Add the recipe to the ``[task parameters]`` section in the - ``esmvaltool/utils/recipe_test_workflow/flow.cylc`` file. +#. Open a `new ESMValTool issue`_ on GitHub. Assign yourself to the issue and + add the ``Recipe Test Workflow (RTW)`` label. `ESMValTool issue #3663`_ + provides an example. - .. hint:: - If the recipe takes less than 10 minutes to run then it should be added - to the ``fast`` option. Recipes that take longer than ten minutes should - be added to the ``medium`` option. +#. Create a branch. + +#. Run the recipe: + + * with the latest version of ESMValTool + * on the compute server you use at your site .. hint:: - The line added should follow the format of ``recipe_new_recipe, \``, - unless the line is the last one in the list, in which case the line added - should follow the format of ``recipe_new_recipe``. - -#. If the duration of the recipe is larger than the value specified by the - ``execution time limit`` option in the ``[[COMPUTE]]`` section in the - aforementioned site-specific ``.cylc`` file, and / or the memory usage of - the recipe is larger than the value specified by the ``--mem`` option in the - ``[[[directives]]]`` section in the ``[[COMPUTE]]`` section, add a section - (in alphabetical order) to this file as shown below (round the duration to - the nearest second):: - - [[process]] - # Actual: 0m31s, 2.5 GB on 2024-04-08. - execution time limit = PT2M - [[[directives]]] - --mem = 3G + Your compute server is defined in the + ``esmvaltool/utils/recipe_test_workflow/site/.cylc`` file as + follows:: + + [[COMPUTE]] + platform = + +#. Obtain the actual duration and memory usage of the recipe. This can be found + either in the message printed to screen, or at the end of the + ``run/main_log.txt`` file in the recipe output directory. The relevant lines will + look something like:: + + YYYY-MM-DD HH:MM:SS:sss UTC [12345] INFO Time for running the recipe was: 0:02:13.334742 + YYYY-MM-DD HH:MM:SS:sss UTC [12345] INFO Maximum memory used (estimate): 2.4 GB + [...] + YYYY-MM-DD HH:MM:SS:sss UTC [12345] INFO Run was successful + +Adding the recipe +----------------- + +#. Add the recipe in alphabetical order to either ``FAST_RECIPES`` or + ``MEDIUM_RECIPES`` in the ``-recipes.jinja`` file. It should look + something like:: + + { + 'recipe_path': 'recipe_a_fast_recipe', + 'actual': '2m13s, 2.4 GB on YYYY-MM-DD', + 'max_time': 'PT3M', + 'max_memory': '3G', + } + + .. important:: + Add the recipe to ``FAST_RECIPES`` if it takes *less* than 10 mins to + run at your site. Add the recipe to ``MEDIUM_RECIPES`` if it takes *more* + than 10 mins. .. hint:: - The ``fast`` key in the example task definition above - (``[[process]]``) should match name of the - option the recipe was added to in the ``[task parameters]`` section in - the ``esmvaltool/utils/recipe_test_workflow/flow.cylc`` file + The :ref:`site/site-recipes.jinja `. + file provides more information. .. hint:: - Set the ``execution time limit`` to 10-20% more than the actual duration. - For actual durations of up to ``1m45s``, set the ``execution time limit`` - to ``PT2M`` (2 minutes). + Set the ``max_time`` to 10-20% more than the actual duration. For actual + durations of up to ``1m45s``, set ``max_time`` to ``PT2M`` (2 minutes). .. hint:: Try not to regularly waste more than 500 MiB in memory usage. Typically, rounding the actual memory usage up to the nearest integer is acceptable. -#. Stop any running ``recipe_test_workflow`` workflows:: - - cylc stop recipe_test_workflow/* +Create the |KGOs| +----------------- #. Run the |RTW|, as detailed in the :ref:`quick_start_guide`; it is expected that the ``compare`` task will fail. -#. Update the Known Good Outputs (|KGOs|): + .. important:: + The ``compare`` task fails because the |KGOs| for the recipe do not yet + exist. This run of the |RTW| will generate the outputs that will be + used as |KGOs|. - * Recursively copy the recipe output directory (i.e. - ``recipe___